diff --git a/background-script.js b/background-script.js index 386890f..ea916d8 100644 --- a/background-script.js +++ b/background-script.js @@ -124,11 +124,10 @@ if (typeof globalThis.browser === "undefined" && typeof chrome !== "undefined") chrome.tabs.sendMessage(tabId, message, response => { const err = chrome.runtime.lastError; if (err) { - console.warn("Nazeka tabs.sendMessage warning:", err.message); - resolve(undefined); - } else { - resolve(response); - } + resolve(undefined); +} else { + resolve(response); +} }); }); }, @@ -1928,8 +1927,25 @@ function lookup_indirect_for_tests(text) { let old_last_lookup = last_lookup; last_lookup = ""; - let ret = lookup_indirect(text, Date.now(), false, {alternatives_mode: 3, strict_alternatives:true, strict_epwing:true}); + + let ret = lookup_indirect( + text, + Date.now(), + false, + { + alternatives_mode: 3, + strict_alternatives: true, + strict_epwing: true + } + ); + last_lookup = old_last_lookup; + + if (!ret || !Array.isArray(ret) || ret.length === 0 || !ret[0]) { + console.warn("Nazeka test lookup returned no result for:", text, ret); + return null; + } + return ret[0].result; } @@ -2373,4 +2389,4 @@ async function regression_tests() console.log("exit regression tests"); } -regression_tests(); +//regression_tests(); diff --git a/texthook.js b/texthook.js index 85e53da..f207431 100644 --- a/texthook.js +++ b/texthook.js @@ -362,6 +362,7 @@ let last_display_x = 0; let last_display_y = 0; function display_div(middle, x, y) { + console.log("Nazeka display_div called", x, y, middle); last_display_x = x; last_display_y = y; let font = settings.font.trim().replace(";","").replace("}",""); @@ -376,18 +377,51 @@ function display_div(middle, x, y) let newy = y; let mydoc = document; - while(find_root.parent && find_root.parent != find_root && is_not_frameset(find_root)) + while(find_root.parent && find_root.parent != find_root && is_not_frameset(find_root)) +{ + try { - let rect = find_root.frameElement.getBoundingClientRect(); + let frame_element = find_root.frameElement; + if(!frame_element) + break; + + let rect = frame_element.getBoundingClientRect(); let rx = rect.x; let ry = rect.y; - let sx1 = find_root.parent.scrollX; - let sy1 = find_root.parent.scrollY; - let sx2 = find_root.scrollX; - let sy2 = find_root.scrollY; - find_root = find_root.parent; + + let parent_window = find_root.parent; + + let sx1 = 0; + let sy1 = 0; + let sx2 = 0; + let sy2 = 0; + + try + { + sx1 = parent_window.scrollX || 0; + sy1 = parent_window.scrollY || 0; + } + catch(err) + { + // Cross-origin parent frame. Chromium blocks access. + break; + } + + try + { + sx2 = find_root.scrollX || 0; + sy2 = find_root.scrollY || 0; + } + catch(err) + { + sx2 = 0; + sy2 = 0; + } + + find_root = parent_window; newx += (rx + sx1 - sx2); newy += (ry + sy1 - sy2); + try { mydoc = find_root.document; @@ -397,18 +431,12 @@ function display_div(middle, x, y) break; } } - - // compensate for body being relative if it is, because our popup is absolute - let relative_body = getComputedStyle(mydoc.body).position == "relative"; - if(relative_body) + catch(err) { - let rect = mydoc.body.getBoundingClientRect(); - newx -= rect.x; - newy -= rect.y; - // overcompensate for scrolling - newx -= mydoc.scrollingElement.scrollLeft; - newy -= mydoc.scrollingElement.scrollTop; + console.warn("Nazeka frame positioning warning:", err); + break; } +} let basewidth = Math.round(Number(settings.width)); if(settings.x_dodge != 1 && basewidth > mydoc.documentElement.getBoundingClientRect().width/2 - settings.xoffset - 5) @@ -2034,27 +2062,90 @@ let ctrl_down = false; function ele_data_from_point(doc, x, y) { let ret = doc.elementFromPoint(x, y); + while (ret && ret.tagName && ["frame", "iframe"].includes(ret.tagName.toLowerCase())) { - let wind = ret.contentWindow; - let rect = ret.getBoundingClientRect(); + let wind; + try + { + wind = ret.contentWindow; + if (!wind) break; + } + catch (err) + { + break; + } + + let rect; + try + { + rect = ret.getBoundingClientRect(); + } + catch (err) + { + break; + } + let rx = rect.x; let ry = rect.y; - let sx1 = wind.parent.scrollX; - let sy1 = wind.parent.scrollY; - let sx2 = wind.scrollX; - let sy2 = wind.scrollY; + + let sx1 = 0; + let sy1 = 0; + let sx2 = 0; + let sy2 = 0; + + try + { + if (wind.parent && wind.parent !== wind) + { + sx1 = wind.parent.scrollX || 0; + sy1 = wind.parent.scrollY || 0; + } + } + catch (err) + { + // Cross-origin parent frame; stop descending further + break; + } + + try + { + sx2 = wind.scrollX || 0; + sy2 = wind.scrollY || 0; + } + catch (err) + { + sx2 = 0; + sy2 = 0; + } + x -= rx; y -= ry; x += sx2; y += sy2; - doc = wind.document; - ret = doc.elementFromPoint(x, y); + + try + { + doc = wind.document; + } + catch (err) + { + break; + } + + try + { + ret = doc.elementFromPoint(x, y); + } + catch (err) + { + break; + } } + return [ret, doc, x, y]; } - let last_event_time = 0; function update(event) {