fix some more bugs with frames
This commit is contained in:
1 parent
ef25bb87de
commit
3cf74f46a3
1 file changed
+61
-45
+61
-45
@@ -1,14 +1,5 @@
|
|||||||
// Copyright 2017; Licensed under the Apache License, Version 2.0: https://www.apache.org/licenses/LICENSE-2.0
|
// Copyright 2017; Licensed under the Apache License, Version 2.0: https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO:
|
|
||||||
*
|
|
||||||
* - Fix katakana-hiragana matching (only happens in lookups right now, not display generation)
|
|
||||||
* - VNstats frequency data
|
|
||||||
* - Integrate frequency into priority handling
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
// updated by a timer looping function, based on local storage set by the options page
|
// updated by a timer looping function, based on local storage set by the options page
|
||||||
@@ -70,6 +61,8 @@ only_selection: false
|
|||||||
|
|
||||||
let platform = "win";
|
let platform = "win";
|
||||||
|
|
||||||
|
let last_seen_doc = undefined;
|
||||||
|
|
||||||
async function get_real_platform()
|
async function get_real_platform()
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -145,13 +138,13 @@ function is_not_frameset(root)
|
|||||||
}
|
}
|
||||||
catch(err)
|
catch(err)
|
||||||
{
|
{
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_doc()
|
function get_doc()
|
||||||
{
|
{
|
||||||
let find_root = window;
|
let find_root = document.defaultView;
|
||||||
let mydoc = document;
|
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))
|
||||||
{
|
{
|
||||||
@@ -160,7 +153,12 @@ function get_doc()
|
|||||||
{
|
{
|
||||||
mydoc = find_root.document;
|
mydoc = find_root.document;
|
||||||
}
|
}
|
||||||
catch(err) {}
|
catch(err)
|
||||||
|
{
|
||||||
|
console.log("hit error");
|
||||||
|
console.log(err);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return mydoc;
|
return mydoc;
|
||||||
}
|
}
|
||||||
@@ -194,6 +192,8 @@ let last_display_x = 0;
|
|||||||
let last_display_y = 0;
|
let last_display_y = 0;
|
||||||
function display_div(middle, x, y)
|
function display_div(middle, x, y)
|
||||||
{
|
{
|
||||||
|
console.log("in display_div");
|
||||||
|
console.log(x, y);
|
||||||
last_display_x = x;
|
last_display_x = x;
|
||||||
last_display_y = y;
|
last_display_y = y;
|
||||||
let font = settings.font.trim().replace(";","").replace("}","");
|
let font = settings.font.trim().replace(";","").replace("}","");
|
||||||
@@ -203,7 +203,7 @@ function display_div(middle, x, y)
|
|||||||
let border_text = (settings.disableborder)?("border: 0px solid transparent;"):(`border: 1px solid ${settings.fgcolor}`);
|
let border_text = (settings.disableborder)?("border: 0px solid transparent;"):(`border: 1px solid ${settings.fgcolor}`);
|
||||||
middle.firstChild.style = `${border_text}; border-radius: 2px; padding: 2px; background-color: ${settings.bgcolor}; color: ${settings.fgcolor}; font-family: ${font} Arial, sans-serif; text-align: left; font-size: ${settings.definition_fontsize}px;`;
|
middle.firstChild.style = `${border_text}; border-radius: 2px; padding: 2px; background-color: ${settings.bgcolor}; color: ${settings.fgcolor}; font-family: ${font} Arial, sans-serif; text-align: left; font-size: ${settings.definition_fontsize}px;`;
|
||||||
|
|
||||||
let find_root = window;
|
let find_root = document.defaultView;
|
||||||
let newx = x;
|
let newx = x;
|
||||||
let newy = y;
|
let newy = y;
|
||||||
let mydoc = document;
|
let mydoc = document;
|
||||||
@@ -211,8 +211,6 @@ function display_div(middle, x, y)
|
|||||||
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))
|
||||||
{
|
{
|
||||||
let rect = find_root.frameElement.getBoundingClientRect();
|
let rect = find_root.frameElement.getBoundingClientRect();
|
||||||
//let rx = find_root.offsetLeft;//rect.x;
|
|
||||||
//let ry = find_root.offsetTop;//rect.y;
|
|
||||||
let rx = rect.x;
|
let rx = rect.x;
|
||||||
let ry = rect.y;
|
let ry = rect.y;
|
||||||
let sx1 = find_root.parent.scrollX;
|
let sx1 = find_root.parent.scrollX;
|
||||||
@@ -225,8 +223,14 @@ function display_div(middle, x, y)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
mydoc = find_root.document;
|
mydoc = find_root.document;
|
||||||
} catch(err) {}
|
}
|
||||||
|
catch(err)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
console.log(newx, newy);
|
||||||
|
console.log(mydoc);
|
||||||
|
|
||||||
// compensate for body being relative if it is, because our popup is absolute
|
// compensate for body being relative if it is, because our popup is absolute
|
||||||
let relative_body = getComputedStyle(mydoc.body).position == "relative";
|
let relative_body = getComputedStyle(mydoc.body).position == "relative";
|
||||||
@@ -380,34 +384,14 @@ function display_div(middle, x, y)
|
|||||||
|
|
||||||
function exists_div()
|
function exists_div()
|
||||||
{
|
{
|
||||||
let find_root = window;
|
let mydoc = get_doc();
|
||||||
let mydoc = document;
|
|
||||||
while(find_root.parent && find_root.parent != find_root)
|
|
||||||
{
|
|
||||||
find_root = find_root.parent;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
mydoc = find_root.document;
|
|
||||||
} catch(err) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
let other = mydoc.body.getElementsByClassName(div_class);
|
let other = mydoc.body.getElementsByClassName(div_class);
|
||||||
return (other.length > 0 && other[0].style.display != "none" && other[0].innerHTML != "");
|
return (other.length > 0 && other[0].style.display != "none" && other[0].innerHTML != "");
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_div()
|
function get_div()
|
||||||
{
|
{
|
||||||
let find_root = window;
|
let mydoc = get_doc();
|
||||||
let mydoc = document;
|
|
||||||
while(find_root.parent && find_root.parent != find_root)
|
|
||||||
{
|
|
||||||
find_root = find_root.parent;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
mydoc = find_root.document;
|
|
||||||
} catch(err) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
let other = mydoc.body.getElementsByClassName(div_class);
|
let other = mydoc.body.getElementsByClassName(div_class);
|
||||||
if(other.length > 0 && other[0].style.display != "none" && other[0].innerHTML != "")
|
if(other.length > 0 && other[0].style.display != "none" && other[0].innerHTML != "")
|
||||||
return other[0];
|
return other[0];
|
||||||
@@ -1302,6 +1286,7 @@ let last_manual_interaction = Date.now();
|
|||||||
|
|
||||||
async function send_lookup(lookup)
|
async function send_lookup(lookup)
|
||||||
{
|
{
|
||||||
|
console.log("in send_lookup");
|
||||||
if(!settings.kanji_mode)
|
if(!settings.kanji_mode)
|
||||||
{
|
{
|
||||||
let response = await browser.runtime.sendMessage(
|
let response = await browser.runtime.sendMessage(
|
||||||
@@ -1695,6 +1680,30 @@ function true_next_sibling(node)
|
|||||||
let last_seen_event = undefined;
|
let last_seen_event = undefined;
|
||||||
let shift_down = false;
|
let shift_down = false;
|
||||||
let ctrl_down = false;
|
let ctrl_down = false;
|
||||||
|
|
||||||
|
function ele_data_from_point(doc, x, y)
|
||||||
|
{
|
||||||
|
let ret = doc.elementFromPoint(x, y);
|
||||||
|
while (ret.tagName.toLowerCase() == "frame" || ret.tagName.toLowerCase() == "iframe")
|
||||||
|
{
|
||||||
|
let wind = ret.contentWindow;
|
||||||
|
let rect = ret.getBoundingClientRect();
|
||||||
|
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;
|
||||||
|
x -= rx;
|
||||||
|
y -= ry;
|
||||||
|
x += sx2;
|
||||||
|
y += sy2;
|
||||||
|
doc = wind.document;
|
||||||
|
ret = doc.elementFromPoint(x, y);
|
||||||
|
}
|
||||||
|
return [ret, doc, x, y];
|
||||||
|
}
|
||||||
|
|
||||||
function update(event)
|
function update(event)
|
||||||
{
|
{
|
||||||
if(!event) return;
|
if(!event) return;
|
||||||
@@ -1763,20 +1772,24 @@ function update(event)
|
|||||||
{
|
{
|
||||||
let xoffset = 0;
|
let xoffset = 0;
|
||||||
let yoffset = 0;
|
let yoffset = 0;
|
||||||
let ele = document.elementFromPoint(x, y);
|
let data = ele_data_from_point(event.target.ownerDocument, x, y);
|
||||||
|
let ele = data[0];
|
||||||
|
let mydoc = data[1];
|
||||||
|
x = data[2];
|
||||||
|
y = data[3];
|
||||||
if(ele && window.getComputedStyle(ele).writingMode.includes("vertical"))
|
if(ele && window.getComputedStyle(ele).writingMode.includes("vertical"))
|
||||||
yoffset = searchoffset;
|
yoffset = searchoffset;
|
||||||
else
|
else
|
||||||
xoffset = searchoffset;
|
xoffset = searchoffset;
|
||||||
|
|
||||||
let caretdata = document.caretPositionFromPoint(x+xoffset, y+yoffset);
|
let caretdata = mydoc.caretPositionFromPoint(x+xoffset, y+yoffset);
|
||||||
|
|
||||||
if(caretdata)
|
if(caretdata)
|
||||||
{
|
{
|
||||||
textNode = caretdata.offsetNode;
|
textNode = caretdata.offsetNode;
|
||||||
offset = caretdata.offset;
|
offset = caretdata.offset;
|
||||||
|
|
||||||
let range = document.createRange();
|
let range = mydoc.createRange();
|
||||||
range.selectNode(textNode);
|
range.selectNode(textNode);
|
||||||
hitrect = range.getBoundingClientRect();
|
hitrect = range.getBoundingClientRect();
|
||||||
}
|
}
|
||||||
@@ -1845,7 +1858,6 @@ function update(event)
|
|||||||
}
|
}
|
||||||
catch (err){}
|
catch (err){}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.only_selection)
|
if (settings.only_selection)
|
||||||
{
|
{
|
||||||
if(selection_rejects_node(window.getSelection(), textNode, offset))
|
if(selection_rejects_node(window.getSelection(), textNode, offset))
|
||||||
@@ -1905,7 +1917,7 @@ function errormessage(text)
|
|||||||
let mydiv = document.createElement("div");
|
let mydiv = document.createElement("div");
|
||||||
mydiv.style = "background-color: #111; color: #CCC; font-family: Arial, sans-serif; font-size: 13px; width: 300px; border: 3px double red; position: fixed; right: 25px; top: 25px; z-index: 1000000000000000000000; padding: 5px; border-radius: 3px;"
|
mydiv.style = "background-color: #111; color: #CCC; font-family: Arial, sans-serif; font-size: 13px; width: 300px; border: 3px double red; position: fixed; right: 25px; top: 25px; z-index: 1000000000000000000000; padding: 5px; border-radius: 3px;"
|
||||||
mydiv.textContent = text;
|
mydiv.textContent = text;
|
||||||
document.body.appendChild(mydiv);
|
get_doc().body.appendChild(mydiv);
|
||||||
|
|
||||||
function delete_later()
|
function delete_later()
|
||||||
{
|
{
|
||||||
@@ -2124,7 +2136,7 @@ function mine(highlight)
|
|||||||
|
|
||||||
function keytest(event)
|
function keytest(event)
|
||||||
{
|
{
|
||||||
if(event.target != document.body)
|
if(event.target != get_doc().body)
|
||||||
return;
|
return;
|
||||||
if(settings.popup_requires_key == 2 && event.key == "Shift")
|
if(settings.popup_requires_key == 2 && event.key == "Shift")
|
||||||
{
|
{
|
||||||
@@ -2269,5 +2281,9 @@ function keyuntest(event)
|
|||||||
window.addEventListener("mousemove", update);
|
window.addEventListener("mousemove", update);
|
||||||
window.addEventListener("keydown", keytest);
|
window.addEventListener("keydown", keytest);
|
||||||
window.addEventListener("keyup", keyuntest);
|
window.addEventListener("keyup", keyuntest);
|
||||||
document.addEventListener("touchstart", update_touch);
|
get_doc().addEventListener("touchstart", update_touch);
|
||||||
|
|
||||||
|
console.log("inited content script");
|
||||||
|
console.log("inited at: " + get_doc().URL);
|
||||||
|
console.log("inited via: " + document.URL);
|
||||||
|
console.log("inited via: " + window.location);
|
||||||
Reference in new issue
Block a user