|
|
|
@ -97,11 +97,11 @@ vAPI.contentscriptEndInjected = true;
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
// TODO: Web SQL
|
|
|
|
|
// if ( window.openDatabase ) {
|
|
|
|
|
// if ( window.openDatabase ) {
|
|
|
|
|
// Sad:
|
|
|
|
|
// "There is no way to enumerate or delete the databases available for an origin from this API."
|
|
|
|
|
// Ref.: http://www.w3.org/TR/webdatabase/#databases
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
catch (e) {
|
|
|
|
|
}
|
|
|
|
@ -334,84 +334,6 @@ var collapser = (function() {
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
var hasInlineScript = function(nodeList, summary) {
|
|
|
|
|
var i = 0;
|
|
|
|
|
var node, text;
|
|
|
|
|
while ( (node = nodeList.item(i++)) ) {
|
|
|
|
|
if ( node.nodeType !== 1 ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ( node.localName === 'script' ) {
|
|
|
|
|
text = node.textContent.trim();
|
|
|
|
|
if ( text === '' ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
summary.inlineScript = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if ( node.localName === 'a' && node.href.lastIndexOf('javascript', 0) === 0 ) {
|
|
|
|
|
summary.inlineScript = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ( summary.inlineScript ) {
|
|
|
|
|
summary.mustReport = true;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var nodeListsAddedHandler = function(nodeLists) {
|
|
|
|
|
var i = nodeLists.length;
|
|
|
|
|
if ( i === 0 ) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var summary = {
|
|
|
|
|
what: 'contentScriptSummary',
|
|
|
|
|
locationURL: window.location.href,
|
|
|
|
|
inlineScript: false,
|
|
|
|
|
mustReport: false
|
|
|
|
|
};
|
|
|
|
|
while ( i-- ) {
|
|
|
|
|
if ( summary.inlineScript === false ) {
|
|
|
|
|
hasInlineScript(nodeLists[i], summary);
|
|
|
|
|
}
|
|
|
|
|
collapser.addNodeList(nodeLists[i]);
|
|
|
|
|
}
|
|
|
|
|
if ( summary.mustReport ) {
|
|
|
|
|
vAPI.messaging.send('contentscript.js', summary);
|
|
|
|
|
}
|
|
|
|
|
collapser.process();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Executed only once.
|
|
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
|
var summary = {
|
|
|
|
|
what: 'contentScriptSummary',
|
|
|
|
|
locationURL: window.location.href,
|
|
|
|
|
inlineScript: false,
|
|
|
|
|
mustReport: true
|
|
|
|
|
};
|
|
|
|
|
// https://github.com/gorhill/httpswitchboard/issues/25
|
|
|
|
|
// &
|
|
|
|
|
// Looks for inline javascript also in at least one a[href] element.
|
|
|
|
|
// https://github.com/gorhill/httpswitchboard/issues/131
|
|
|
|
|
hasInlineScript(document.querySelectorAll('a[href^="javascript:"],script'), summary);
|
|
|
|
|
|
|
|
|
|
//console.debug('contentscript.js > firstObservationHandler(): found %d script tags in "%s"', Object.keys(summary.scriptSources).length, window.location.href);
|
|
|
|
|
|
|
|
|
|
vAPI.messaging.send('contentscript.js', summary);
|
|
|
|
|
|
|
|
|
|
collapser.addMany(document.querySelectorAll('img'));
|
|
|
|
|
collapser.addIFrames(document.querySelectorAll('iframe'));
|
|
|
|
|
collapser.process();
|
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Observe changes in the DOM
|
|
|
|
|
|
|
|
|
|
// Added node lists will be cumulated here before being processed
|
|
|
|
@ -421,11 +343,15 @@ var nodeListsAddedHandler = function(nodeLists) {
|
|
|
|
|
if ( !document.body ) { return; }
|
|
|
|
|
|
|
|
|
|
var addedNodeLists = [];
|
|
|
|
|
var addedNodeListsTimer = null;
|
|
|
|
|
var addedNodeListsTimer;
|
|
|
|
|
|
|
|
|
|
var treeMutationObservedHandler = function() {
|
|
|
|
|
nodeListsAddedHandler(addedNodeLists);
|
|
|
|
|
addedNodeListsTimer = null;
|
|
|
|
|
addedNodeListsTimer = undefined;
|
|
|
|
|
var i = addedNodeLists.length;
|
|
|
|
|
while ( i-- ) {
|
|
|
|
|
collapser.addNodeList(addedNodeLists[i]);
|
|
|
|
|
}
|
|
|
|
|
collapser.process();
|
|
|
|
|
addedNodeLists = [];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -440,7 +366,7 @@ var nodeListsAddedHandler = function(nodeLists) {
|
|
|
|
|
addedNodeLists.push(nodeList);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ( addedNodeListsTimer === null ) {
|
|
|
|
|
if ( addedNodeListsTimer === undefined ) {
|
|
|
|
|
addedNodeListsTimer = vAPI.setTimeout(treeMutationObservedHandler, 47);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
@ -453,13 +379,13 @@ var nodeListsAddedHandler = function(nodeLists) {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
vAPI.shutdown.add(function() {
|
|
|
|
|
if ( addedNodeListsTimer !== null ) {
|
|
|
|
|
if ( addedNodeListsTimer !== undefined ) {
|
|
|
|
|
clearTimeout(addedNodeListsTimer);
|
|
|
|
|
addedNodeListsTimer = null;
|
|
|
|
|
addedNodeListsTimer = undefined;
|
|
|
|
|
}
|
|
|
|
|
if ( treeObserver !== null ) {
|
|
|
|
|
treeObserver.disconnect();
|
|
|
|
|
treeObserver = null;
|
|
|
|
|
treeObserver = undefined;
|
|
|
|
|
}
|
|
|
|
|
addedNodeLists = [];
|
|
|
|
|
});
|
|
|
|
@ -470,6 +396,34 @@ var nodeListsAddedHandler = function(nodeLists) {
|
|
|
|
|
|
|
|
|
|
// Executed only once.
|
|
|
|
|
|
|
|
|
|
// https://github.com/gorhill/httpswitchboard/issues/25
|
|
|
|
|
|
|
|
|
|
// https://github.com/gorhill/httpswitchboard/issues/131
|
|
|
|
|
// Looks for inline javascript also in at least one a[href] element.
|
|
|
|
|
|
|
|
|
|
// https://github.com/gorhill/uMatrix/issues/485
|
|
|
|
|
// Mind "on..." attributes.
|
|
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
|
vAPI.messaging.send('contentscript.js', {
|
|
|
|
|
what: 'contentScriptSummary',
|
|
|
|
|
locationURL: window.location.href,
|
|
|
|
|
inlineScript:
|
|
|
|
|
document.querySelector('script:not([src])') !== null ||
|
|
|
|
|
document.querySelector('a[href^="javascript:"]') !== null ||
|
|
|
|
|
document.querySelector('[onabort],[onblur],[oncancel],[oncanplay],[oncanplaythrough],[onchange],[onclick],[onclose],[oncontextmenu],[oncuechange],[ondblclick],[ondrag],[ondragend],[ondragenter],[ondragexit],[ondragleave],[ondragover],[ondragstart],[ondrop],[ondurationchange],[onemptied],[onended],[onerror],[onfocus],[oninput],[oninvalid],[onkeydown],[onkeypress],[onkeyup],[onload],[onloadeddata],[onloadedmetadata],[onloadstart],[onmousedown],[onmouseenter],[onmouseleave],[onmousemove],[onmouseout],[onmouseover],[onmouseup],[onwheel],[onpause],[onplay],[onplaying],[onprogress],[onratechange],[onreset],[onresize],[onscroll],[onseeked],[onseeking],[onselect],[onshow],[onstalled],[onsubmit],[onsuspend],[ontimeupdate],[ontoggle],[onvolumechange],[onwaiting],[onafterprint],[onbeforeprint],[onbeforeunload],[onhashchange],[onlanguagechange],[onmessage],[onoffline],[ononline],[onpagehide],[onpageshow],[onrejectionhandled],[onpopstate],[onstorage],[onunhandledrejection],[onunload],[oncopy],[oncut],[onpaste]') !== null
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
collapser.addMany(document.querySelectorAll('img'));
|
|
|
|
|
collapser.addIFrames(document.querySelectorAll('iframe'));
|
|
|
|
|
collapser.process();
|
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Executed only once.
|
|
|
|
|
|
|
|
|
|
// https://github.com/gorhill/uMatrix/issues/232
|
|
|
|
|
// Force `display` property, Firefox is still affected by the issue.
|
|
|
|
|
|
|
|
|
|