aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhackademix <giorgio@maone.net>2019-02-12 21:11:20 +0100
committerhackademix <giorgio@maone.net>2019-02-12 21:11:20 +0100
commit1f0ce1cd447770b981032152cf13276968350f0a (patch)
treebacc391d8986aa62c3a23dd1c4a66649bbd73ca2
parentf5c4a44831ebb6d40aa75060c400b9180f32f127 (diff)
UI: contextual view-source links for inline scripts and intrinsic events.
-rw-r--r--html/display_panel/content/main_panel.js5
-rw-r--r--main_background.js22
2 files changed, 20 insertions, 7 deletions
diff --git a/html/display_panel/content/main_panel.js b/html/display_panel/content/main_panel.js
index 2509545..f662b35 100644
--- a/html/display_panel/content/main_panel.js
+++ b/html/display_panel/content/main_panel.js
@@ -111,11 +111,16 @@ function createList(data, group){
container.classList.add("empty");
}
// generate list
+ let viewSourceToHuman = /^view-source:(.*)#line(\d+)\(([^)]*)\)/;
for (let entry of entries) {
let [scriptId, reason] = entry;
let li = liTemplate.cloneNode(true);
let a = li.querySelector("a");
a.href = scriptId.split("(")[0];
+ if (scriptId.startsWith("view-source:")) {
+ a.target ="LibreJS-ViewSource";
+ scriptId = scriptId.replace(viewSourceToHuman, "$3 at line $2 of $1");
+ }
a.textContent = scriptId;
li.querySelector(".reason").textContent = reason;
let bySite = !!reason.match(/https?:\/\/[^/]+\/\*/);
diff --git a/main_background.js b/main_background.js
index b62788a..3da5bc3 100644
--- a/main_background.js
+++ b/main_background.js
@@ -1055,16 +1055,21 @@ async function editHtml(html, documentUrl, tabId, frameId, whitelisted){
// Do not process inline scripts
scripts = [];
} else {
+ let findLine = finder => finder.test(html) && html.substring(0, finder.lastIndex).split(/\n/).length || 0;
let modified = false;
-
// Deal with intrinsic events
let intrinsecindex = 0;
+ let intrinsicFinder = /<[a-z][^>]*\b(on\w+|href\s*=\s*['"]?javascript:)/gi;
for (let element of html_doc.all) {
- for (let attr of element.attributes){
- if (attr.name.startsWith("on") || (attr.name === "href" && attr.value.startsWith("javascript:"))){
+ let line = -1;
+ for (let attr of element.attributes) {
+ if (attr.name.startsWith("on") || (attr.name === "href" && attr.value.toLowerCase().startsWith("javascript:"))){
intrinsecindex++;
+ if (line === -1) {
+ line = findLine(intrinsicFinder);
+ }
try {
- let url = `${documentUrl}# Intrinsic event ${intrinsecindex} [${attr.name}]`;
+ let url = `view-source:${documentUrl}#line${line}(<${element.tagName} ${attr.name}>)`;
let edited = await get_script(attr.value, url, tabId, whitelist.contains(url));
if (edited) {
let value = edited;
@@ -1081,14 +1086,17 @@ async function editHtml(html, documentUrl, tabId, frameId, whitelisted){
}
let modifiedInline = false;
+ let scriptFinder = /<script\b/ig;
for(let i = 0, len = scripts.length; i < len; i++) {
let script = scripts[i];
- let url = `${documentUrl}# script ${i}`;
+ let line = findLine(scriptFinder);
if (!script.src && !(script.type && script.type !== "text/javascript")) {
- let edited = await get_script(script.textContent, url, tabId, whitelisted, i);
+ let source = script.textContent;
+ let url = `view-source:${documentUrl}#line${line}(<SCRIPT>)`;
+ let edited = await get_script(source, url, tabId, whitelisted, i);
if (edited) {
let edited_source = edited[0];
- let unedited_source = script.textContent.trim();
+ let unedited_source = source.trim();
if (edited_source.trim() !== unedited_source) {
script.textContent = edited_source;
modified = modifiedInline = true;