From 49df063191496f5118e381acf7b2962386857f99 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Nov 2022 16:54:32 -0500 Subject: [PATCH] Try to inject scriptlets at onResponseStarted() time Related issue: - https://github.com/uBlockOrigin/uBlock-issues/issues/2350 As per AdGuard findings, it's possible (though unreliable) to try to inject scriptlets at webRequest.onResponseStarted time, which increases scriptlet injection reliability overall when injecting from multiple entry points. uBO was already injecting at webNavigation.onCommitted and main content script time, and adding webRequest.onResponseStarted as an entry point for scriptlet injection increases reliability for webpages which executes inline scripts at the top of the DOM. References: - https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1029 - https://github.com/AdguardTeam/AdguardBrowserExtension/blob/9ab85be5/Extension/src/background/webrequest.js#L620 --- src/js/scriptlet-filtering.js | 6 ++---- src/js/start.js | 2 ++ src/js/tab.js | 5 +---- src/js/traffic.js | 20 ++++++++++++++++++++ 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/js/scriptlet-filtering.js b/src/js/scriptlet-filtering.js index 1a8e2901f..9b6ba7251 100644 --- a/src/js/scriptlet-filtering.js +++ b/src/js/scriptlet-filtering.js @@ -96,7 +96,6 @@ const contentscriptCode = (( ) => { ) { return; } - self.uBO_scriptletsInjected = true; const injectScriptlets = function(d) { let script; try { @@ -105,12 +104,11 @@ const contentscriptCode = (( ) => { decodeURIComponent(scriptlets)) ); (d.head || d.documentElement).appendChild(script); + self.uBO_scriptletsInjected = true; } catch (ex) { } if ( script ) { - if ( script.parentNode ) { - script.parentNode.removeChild(script); - } + script.remove(); script.textContent = ''; } }; diff --git a/src/js/start.js b/src/js/start.js index 0f8fd308e..f5b086c64 100644 --- a/src/js/start.js +++ b/src/js/start.js @@ -19,6 +19,8 @@ Home: https://github.com/gorhill/uBlock */ +/* globals browser */ + 'use strict'; /******************************************************************************/ diff --git a/src/js/tab.js b/src/js/tab.js index c6da477f8..1bd03c180 100644 --- a/src/js/tab.js +++ b/src/js/tab.js @@ -933,10 +933,7 @@ vAPI.Tabs = class extends vAPI.Tabs { const pageStore = µb.pageStoreFromTabId(tabId); if ( pageStore === null ) { return; } pageStore.setFrameURL(details); - if ( - vAPI.webextFlavor.soup.has('firefox') === false && - pageStore.getNetFilteringSwitch() - ) { + if ( pageStore.getNetFilteringSwitch() ) { scriptletFilteringEngine.injectNow(details); } } diff --git a/src/js/traffic.js b/src/js/traffic.js index b8b1c7781..a653d0368 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -19,6 +19,8 @@ Home: https://github.com/gorhill/uBlock */ +/* globals browser */ + 'use strict'; /******************************************************************************/ @@ -1131,6 +1133,11 @@ const strictBlockBypasser = { /******************************************************************************/ +// https://github.com/uBlockOrigin/uBlock-issues/issues/2350 +// Added scriptlet injection attempt at onResponseStarted time as per +// https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1029 and +// https://github.com/AdguardTeam/AdguardBrowserExtension/blob/9ab85be5/Extension/src/background/webrequest.js#L620 + const webRequest = { onBeforeRequest, @@ -1148,6 +1155,19 @@ const webRequest = { { urls: [ 'http://*/*', 'https://*/*' ] }, [ 'blocking', 'responseHeaders' ] ); + vAPI.net.addListener( + 'onResponseStarted', + details => { + const pageStore = µb.pageStoreFromTabId(details.tabId); + if ( pageStore === null ) { return; } + if ( pageStore.getNetFilteringSwitch() === false ) { return; } + scriptletFilteringEngine.injectNow(details); + }, + { + types: [ 'main_frame', 'sub_frame' ], + urls: [ 'http://*/*', 'https://*/*' ] + } + ); vAPI.net.unsuspend({ all: true }); }; })(),