diff --git a/platform/chromium/vapi-background.js b/platform/chromium/vapi-background.js index b41057ea2..5688f935d 100644 --- a/platform/chromium/vapi-background.js +++ b/platform/chromium/vapi-background.js @@ -223,8 +223,9 @@ vAPI.browserSettings = (function() { } switch ( setting ) { case 'prefetching': + const enabled = !!details[setting]; try { - if ( !!details[setting] ) { + if ( enabled ) { chrome.privacy.network.networkPredictionEnabled.clear({ scope: 'regular' }, vAPI.resetLastError); @@ -237,6 +238,9 @@ vAPI.browserSettings = (function() { } catch(ex) { console.error(ex); } + if ( vAPI.prefetching instanceof Function ) { + vAPI.prefetching(enabled); + } break; case 'hyperlinkAuditing': diff --git a/platform/chromium/vapi-webrequest.js b/platform/chromium/vapi-webrequest.js index 2fce34869..7f9026ef8 100644 --- a/platform/chromium/vapi-webrequest.js +++ b/platform/chromium/vapi-webrequest.js @@ -195,3 +195,39 @@ vAPI.net.onBeforeReady = vAPI.net.onBeforeReady || (function() { })(); /******************************************************************************/ + +// https://github.com/uBlockOrigin/uBlock-issues/issues/548 +// Use `X-DNS-Prefetch-Control` to workaround Chromium's disregard of the +// setting "Predict network actions to improve page load performance". + +vAPI.prefetching = (function() { + let listening = false; + + const onHeadersReceived = function(details) { + details.responseHeaders.push({ + name: 'X-DNS-Prefetch-Control', + value: 'off' + }); + return { responseHeaders: details.responseHeaders }; + }; + + return state => { + const wr = chrome.webRequest; + if ( state && listening ) { + wr.onHeadersReceived.removeListener(onHeadersReceived); + listening = false; + } else if ( !state && !listening ) { + wr.onHeadersReceived.addListener( + onHeadersReceived, + { + urls: [ 'http://*/*', 'https://*/*' ], + types: [ 'main_frame', 'sub_frame' ] + }, + [ 'blocking', 'responseHeaders' ] + ); + listening = true; + } + }; +})(); + +/******************************************************************************/