Skip to content

Latest commit

 

History

History
267 lines (207 loc) · 11.7 KB

File metadata and controls

267 lines (207 loc) · 11.7 KB

BUG ANALYSIS: Statistics Overlay Initialization Failure

Bug Report

  • 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

Root Cause Analysis

The Error Chain

  1. Line 743: Статистика: м_Статистика.ПолучитьДанныеДляОтчета()

  2. Line 1841-1847: The ПолучитьДанныеДляОтчета() function accesses DOM elements:

    function ПолучитьДанныеДляОтчета() {
      return {
        ПараметрыВидео:
          Узел("статистика-разрешениевидео").textContent +    // Line 1844
          " " +
          Узел("статистика-сжатиевидео").textContent,          // Line 1846 - FAILS HERE
        ПараметрыЗвука: Узел("статистика-сжатиезвука").textContent,  // Line 1847
        // ... other fields
      };
    }
  3. Узел() function (common.js:216-224):

    function Узел(пЭлемент) {
      const элЭлемент = typeof пЭлемент == 'string'
        ? document.getElementById(пЭлемент)
        : пЭлемент;
      Проверить(элЭлемент.nodeType === 1);  // FAILS: null.nodeType throws TypeError
      return элЭлемент;
    }
  4. The Problem: document.getElementById("статистика-сжатиевидео") returns null because the element has been removed from player.html


Missing Element Investigation

Element Status in player.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

Details of Missing Elements

1. статистика-сжатиевидео (Video Compression)

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

2. статистика-сервер (Server)

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

All Узел() Calls Accessing Statistics IDs

Used in ПолучитьДанныеДляОтчета() (Lines 1841-1859)

  • Line 1844: Узел("статистика-разрешениевидео")
  • Line 1846: Узел("статистика-сжатиевидео")MISSING - CAUSES CRASH
  • Line 1847: Узел("статистика-сжатиезвука")

Other Statistics Module Узел() Calls

  • 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)

Initialization Sequence (Lines 730-760)

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.


Fix Plan

Option 1: Restore Missing Russian IDs (Quick Fix)

Restore the commented-out Russian IDs in player.html

  1. Line 67-68: Uncomment статистика-сжатиевидео:

    <span id=статистика-сжатиевидео title="..."></span>
    <span id=statistics-videocompression title="..."></span>
  2. 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


Option 2: Update JavaScript to Use English IDs (Complete Fix)

Update player.js to reference the new English IDs

Changes needed in player.js:

  1. Line 1846: Change "статистика-сжатиевидео""statistics-videocompression"
  2. Line 1865: Change "статистика-сервер""statistics-server"
  3. Line 1995: Change "статистика-сжатиевидео""statistics-videocompression"
  4. Line 2000: Change "статистика-сжатиевидео""statistics-videocompression"

Example for line 1846:

// 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


Option 3: Defensive Coding (Safest Fix)

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


Recommended Fix Strategy

Hybrid Approach (Best Practice):

  1. Immediate: Apply Option 1 (restore Russian IDs) to unblock current functionality
  2. Short-term: Apply Option 3 (defensive coding) to prevent similar crashes
  3. 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.


Testing Checklist

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

Additional Notes

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.