- Location:
player.js:743 - Error:
TypeError- Cannot read property 'nodeType' of null - Function: Anonymous function calling
м_Статистика.ПолучитьДанныеДляОтчета() - Root Cause: Missing HTML element IDs due to incomplete translation from Russian to English
-
Line 743:
Статистика: м_Статистика.ПолучитьДанныеДляОтчета() -
Line 1841-1847: The
ПолучитьДанныеДляОтчета()function accesses DOM elements:function ПолучитьДанныеДляОтчета() { return { ПараметрыВидео: Узел("статистика-разрешениевидео").textContent + // Line 1844 " " + Узел("статистика-сжатиевидео").textContent, // Line 1846 - FAILS HERE ПараметрыЗвука: Узел("статистика-сжатиезвука").textContent, // Line 1847 // ... other fields }; }
-
Узел() function (common.js:216-224):
function Узел(пЭлемент) { const элЭлемент = typeof пЭлемент == 'string' ? document.getElementById(пЭлемент) : пЭлемент; Проверить(элЭлемент.nodeType === 1); // FAILS: null.nodeType throws TypeError return элЭлемент; }
-
The Problem:
document.getElementById("статистика-сжатиевидео")returnsnullbecause the element has been removed fromplayer.html
| ID Accessed in player.js | Line in player.js | Status in player.html | HTML Line |
|---|---|---|---|
статистика-разрешениевидео |
1844, 2001 | ✅ EXISTS | 57 |
статистика-сжатиевидео |
1846, 1995, 2000 | ❌ COMMENTED OUT | 67-68 |
статистика-сжатиезвука |
1847, 2005, 2012 | ✅ EXISTS | 79 |
статистика-сервер |
1865 | ❌ COMMENTED OUT | 89-90 |
статистика-список |
1873 | ✅ EXISTS | 98 |
статистика-targetduration |
1877 | ✅ EXISTS | 102 |
player.html lines 67-68:
<!-- <span id=статистика-сжатиевидео title="..."></span> -->
<span id=statistics-videocompression title="..."></span>Status: Russian ID commented out, replaced with English ID statistics-videocompression
Impact:
- Line 1846: Initialization crash in
ПолучитьДанныеДляОтчета() - Line 1995: Runtime failure when video codec info is set
- Line 2000: Runtime failure when clearing video info
player.html lines 89-90:
<!-- <span id=статистика-сервер data-очистить="" title="..."></span> -->
<span id=statistics-server data-clear="" title="..."></span>Status: Russian ID commented out, replaced with English ID statistics-server
Impact:
- Line 1865: Runtime failure when parsing segment list and trying to display server hostname
- Line 1844:
Узел("статистика-разрешениевидео")✅ - Line 1846:
Узел("статистика-сжатиевидео")❌ MISSING - CAUSES CRASH - Line 1847:
Узел("статистика-сжатиезвука")✅
- Line 1691:
Узел("статистика-количестворекламы")✅ (line 227) - Line 1692:
Узел("статистика-частотарекламы")✅ (line 231) - Line 1693:
Узел("статистика-исходных")✅ (line 281) - Line 1709:
Узел("статистика-незагруженныхсегментов")✅ (line 328) - Line 1822:
Узел("статистика-незагруженныхсегментов")✅ (line 328) - Line 1865:
Узел("статистика-сервер")❌ MISSING - Line 1873:
Узел("статистика-список")✅ (line 98) - Line 1877:
Узел("статистика-targetduration")✅ (line 102) - Line 1953:
Узел("статистика-незагруженныхсегментов")✅ (line 328) - Line 1967:
Узел("статистика-незагруженныхсегментов")✅ (line 328) - Line 1995:
Узел("статистика-сжатиевидео")❌ MISSING - Line 2000:
Узел("статистика-сжатиевидео")❌ MISSING - Line 2001:
Узел("статистика-разрешениевидео")✅ (line 57) - Line 2003:
Узел("статистика-частотакадров")✅ (line 59) - Line 2005:
Узел("статистика-сжатиезвука")✅ (line 79) - Line 2012:
Узел("статистика-сжатиезвука")✅ (line 79) - Line 2014:
Узел("статистика-битрейтзвука")✅ (line 81) - Line 2081:
Узел("статистика-преобразованза")✅ (line 205) - Line 2147:
Узел("статистика-количестворекламы")✅ (line 227) - Line 2148:
Узел("статистика-частотарекламы")✅ (line 231) - Line 2159:
Узел("статистика-частотарекламы")✅ (line 231) - Line 4323:
Узел("статистика-задержкатрансляции")✅ (line 211) - Line 4337:
Узел("статистика-задержкатрансляции")✅ (line 211) - Line 5355:
Узел("статистика-задержкатрансляции")✅ (line 211)
The error occurs during error/crash reporting initialization:
ОбнюхатьПроцессорИОперативку((оПроцессорИОперативка) => {
ПоказатьИОтправитьОтчет(
{
ПричинаЗавершенияРаботы: сПричинаЗавершенияРаботы,
ВерсияРасширения: ВЕРСИЯ_РАСШИРЕНИЯ,
Оборзеватель: navigator.userAgent,
Время: new Date().toISOString(),
Адрес: window.location.href,
Инкогнито: chrome.extension.inIncognitoContext,
Рассинхронизация: Date.now() - performance.now() - г_чТочноеВремя,
Фокусник: м_Фокусник.ПолучитьСостояние(),
Пульс: м_Пульс.ПолучитьДанныеДляОтчета(),
Настройки: м_Настройки.ПолучитьДанныеДляОтчета(),
Статистика: м_Статистика.ПолучитьДанныеДляОтчета(), // LINE 743 - CRASHES HERE
// ... more data
},
буфОтправить
);
});Context: This is crash/error reporting code that collects diagnostic data. It's trying to gather statistics data for the report, but fails because the statistics overlay HTML elements have been partially translated.
Restore the commented-out Russian IDs in player.html
-
Line 67-68: Uncomment
статистика-сжатиевидео:<span id=статистика-сжатиевидео title="..."></span> <span id=statistics-videocompression title="..."></span>
-
Line 89-90: Uncomment
статистика-сервер:<span id=статистика-сервер data-очистить="" title="..."></span> <span id=statistics-server data-clear="" title="..."></span>
Pros: Immediate fix, no code changes needed Cons: Maintains Russian IDs, creates duplicate elements
Update player.js to reference the new English IDs
- Line 1846: Change
"статистика-сжатиевидео"→"statistics-videocompression" - Line 1865: Change
"статистика-сервер"→"statistics-server" - Line 1995: Change
"статистика-сжатиевидео"→"statistics-videocompression" - Line 2000: Change
"статистика-сжатиевидео"→"statistics-videocompression"
// BEFORE:
ПараметрыВидео:
Узел("статистика-разрешениевидео").textContent +
" " +
Узел("статистика-сжатиевидео").textContent,
// AFTER:
ПараметрыВидео:
Узел("статистика-разрешениевидео").textContent +
" " +
Узел("statistics-videocompression").textContent,Pros: Completes the translation effort, aligns with CLAUDE.md translation plan Cons: Requires code changes, more comprehensive testing needed
Make Узел() handle missing elements gracefully
Modify common.js line 216-224 to return a stub element when ID is missing:
function Узел(пЭлемент) {
const элЭлемент = typeof пЭлемент == 'string'
? document.getElementById(пЭлемент)
: пЭлемент;
if (!элЭлемент) {
console.warn(`Element not found: ${пЭлемент}`);
// Return a stub element that won't crash
return document.createElement('span');
}
Проверить(элЭлемент.nodeType === 1);
return элЭлемент;
}Pros: Prevents crashes from any missing element, not just these two Cons: Masks the real problem, may hide future translation issues
Hybrid Approach (Best Practice):
- Immediate: Apply Option 1 (restore Russian IDs) to unblock current functionality
- Short-term: Apply Option 3 (defensive coding) to prevent similar crashes
- Long-term: Apply Option 2 (complete JavaScript translation) as part of the systematic translation effort outlined in CLAUDE.md
This approach prioritizes stability while moving toward the translation goal.
After implementing the fix:
- Load extension in Chrome
- Navigate to a Twitch channel
- Open statistics overlay (press 'S' key)
- Verify all statistics display correctly
- Check browser console for errors
- Trigger error reporting (if possible) to verify crash reporting works
- Test with both English and Russian browser locales
According to CLAUDE.md, there is an active effort to translate all Russian identifiers to English. This bug reveals that the HTML translation was done incompletely - some IDs were changed without updating the corresponding JavaScript references.
Translation Status:
- ✅ HTML element IDs: Partially translated (some commented out)
- ❌ JavaScript references: Not translated (still using Russian IDs)
- ❌ CSS classes: Not translated (still using Russian)
This underscores the need for atomic translation commits as mentioned in CLAUDE.md: "Translation commits must be atomic per file. Do not mix translation of identifiers with logic changes in the same commit."
The proper approach would be to translate HTML IDs and JavaScript references in the same commit, ensuring all references are updated simultaneously.