From ca9c532fb115c754935f6ec8fc0b3649c4137c7a Mon Sep 17 00:00:00 2001 From: wareya Date: Tue, 12 Dec 2017 19:38:11 -0500 Subject: [PATCH] fix reader page to use the background script as a clipboard source instead of breaking the selection all the time --- background-script.js | 42 +++++++++++++++++++++++++++++++++---- background.html | 1 + manifest.json | 2 +- reader.html | 2 +- reader.js | 49 ++++++++++++++++++++++---------------------- texthook.js | 2 +- 6 files changed, 66 insertions(+), 32 deletions(-) create mode 100644 background.html diff --git a/background-script.js b/background-script.js index deb7a2e..2aa2a41 100644 --- a/background-script.js +++ b/background-script.js @@ -705,13 +705,13 @@ function build_lookup_comb (forms) let last_lookup = ""; let last_time_lookup = Date.now(); -function lookup_indirect(text, time) +function lookup_indirect(text, time, divexisted) { if(text == "") return; //if(time < last_time_lookup+20) // reduces lag buildup // return; - if(text == last_lookup)// && (exists_div()))// || time < last_time_lookup+100)) // helps reduce double-lookups + if(text == last_lookup && divexisted)// || time < last_time_lookup+100)) // helps reduce double-lookups return; last_lookup = text; last_time_lookup = time; @@ -719,12 +719,13 @@ function lookup_indirect(text, time) // try to look up successively shorter substrings of text // deconjugate() returns possible deconjugations, one of which has zero deconjugations, i.e. the plain text // build_lookup_comb looks for dictionary definitions matching any deconjugation, returning a list of them + console.log("trying to look up " + text); let forms = deconjugate(text); let result = build_lookup_comb(forms); while(result === undefined && text.length > 0) { - //console.log("trying to look up " + text); text = text.substring(0, text.length-1); + console.log("trying to look up " + text); forms = deconjugate(text); result = build_lookup_comb(forms); } @@ -810,16 +811,49 @@ browser.contextMenus.create({ onclick: tryopenwindow }); +let origin_tab = undefined; + +function set_up_paste_overload() +{ + document.querySelector("#nazeka-paste-target").addEventListener("paste", (event) => + { + // skip event if there's no plaintext; thanks github.com/kmltml/clipboard-inserter + let text = event.clipboardData.getData("text/plain"); + event.preventDefault(); + + if(origin_tab != undefined) + browser.tabs.sendMessage(origin_tab.id, {type:"text",text:text}); + }); +} + +if (document.readyState == "complete") + set_up_paste_overload(); +else + document.addEventListener("DOMContentLoaded", set_up_paste_overload); + +function clipboard_hook(tab) +{ + origin_tab = tab; + let target = document.querySelector("#nazeka-paste-target"); + target.textContent = ""; + target.focus(); + document.execCommand("paste"); +} + browser.runtime.onMessage.addListener((req, sender, sendResponse) => { if (req.type == "search") { - sendResponse(lookup_indirect(req.text, req.time)); + sendResponse(lookup_indirect(req.text, req.time, req.divexisted)); } else if (req.type == "toggle") { toggle_enabled(); } + else if (req.type == "gimmetext") + { + clipboard_hook(sender.tab); + } else { return; diff --git a/background.html b/background.html new file mode 100644 index 0000000..a42c482 --- /dev/null +++ b/background.html @@ -0,0 +1 @@ + diff --git a/manifest.json b/manifest.json index e52e7aa..fccd5d5 100644 --- a/manifest.json +++ b/manifest.json @@ -11,7 +11,7 @@ ], "background": { - "scripts": ["background-script.js"] + "page": "background.html" }, "web_accessible_resources": [ diff --git a/reader.html b/reader.html index 95f79f8..f6bb93b 100644 --- a/reader.html +++ b/reader.html @@ -14,7 +14,7 @@ html overflow-y: scroll; } - + diff --git a/reader.js b/reader.js index 109aa75..293a731 100644 --- a/reader.js +++ b/reader.js @@ -1,3 +1,7 @@ +// Copyright 2017; Licensed under the Apache License, Version 2.0: https://www.apache.org/licenses/LICENSE-2.0 + +'use strict'; + function toggle() { browser.runtime.sendMessage({type:"toggle"}); @@ -38,37 +42,32 @@ function cycle_text(text) text_previous = text; } -window.addEventListener("load", () => +function gimmetext() { - document.querySelector("#nazeka-paste-target").addEventListener("paste", (event) => - { - // skip event if there's no plaintext; thanks github.com/kmltml/clipboard-inserter - let text = event.clipboardData.getData("text/plain"); - if(text !== "") - cycle_text(text); - - event.preventDefault(); - }) -}); - -function checkpaste() -{ - let target = document.querySelector("#nazeka-paste-target"); - - target.parentNode.style.visibility = "visible"; - - target.textContent = ""; - target.focus(); - document.execCommand("paste"); - - target.parentNode.style.visibility = "hidden"; + browser.runtime.sendMessage({type:"gimmetext"}); } let interval = 250; - -setInterval(checkpaste, interval); +async function checkpaste() +{ + try + { + let text = await gimmetext(); + cycle_text(text); + } + catch(error){} + + setTimeout(checkpaste, interval); +} +setTimeout(checkpaste, interval); var executing = browser.tabs.executeScript({ file: "/texthook.js", allFrames: true }); + +browser.runtime.onMessage.addListener((req, sender, sendResponse) => +{ + if (req.type == "text") + cycle_text(req.text); +}); diff --git a/texthook.js b/texthook.js index 92bf39d..28cf43c 100644 --- a/texthook.js +++ b/texthook.js @@ -518,7 +518,7 @@ async function lookup_loop() //console.log("queue not empty"); let lookup = lookup_queue.pop(); lookup_queue = []; - let response = await browser.runtime.sendMessage({type:"search", text:lookup[0], time:Date.now()}); + let response = await browser.runtime.sendMessage({type:"search", text:lookup[0], time:Date.now(), divexisted:exists_div()}); if(response) { let mydiv = build_div(response.text, response.result);