From 335709bc5084d53135350e12b1bdc64fc3e74c06 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 4 Feb 2018 09:10:17 -0500 Subject: [PATCH] fix #940 --- src/js/background.js | 1 + src/js/traffic.js | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/js/background.js b/src/js/background.js index cc5661b..e07164e 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -103,6 +103,7 @@ var requestStatsFactory = function() { var rawSettingsDefault = { contributorMode: false, disableCSPReportInjection: false, + enforceEscapedFragment: true, placeholderBackground: [ 'url("data:image/png;base64,', diff --git a/src/js/traffic.js b/src/js/traffic.js index fea9965..3610c43 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -53,7 +53,10 @@ var onBeforeRootFrameRequestHandler = function(details) { // Not blocked if ( !block ) { - // rhill 2013-11-07: Senseless to do this for behind-the-scene requests. + let redirectURL = maybeRedirectRootFrame(requestHostname, requestURL); + if ( redirectURL !== requestURL ) { + return { redirectUrl: redirectURL }; + } µm.cookieHunter.recordPageCookies(pageStore); return; } @@ -72,6 +75,27 @@ var onBeforeRootFrameRequestHandler = function(details) { /******************************************************************************/ +// https://twitter.com/thatcks/status/958776519765225473 + +var maybeRedirectRootFrame = function(hostname, url) { + let µm = µMatrix; + if ( µm.rawSettings.enforceEscapedFragment !== true ) { return url; } + let block1pScripts = µm.mustBlock(hostname, hostname, 'script'); + let reEscapedFragment = /[?&]_escaped_fragment_=/; + if ( reEscapedFragment.test(url) ) { + return block1pScripts ? url : url.replace(reEscapedFragment, '#!') ; + } + if ( block1pScripts === false ) { return url; } + let pos = url.indexOf('#!'); + if ( pos === -1 ) { return url; } + let separator = url.lastIndexOf('?', pos) === -1 ? '?' : '&'; + return url.slice(0, pos) + + separator + '_escaped_fragment_=' + + url.slice(pos + 2); +}; + +/******************************************************************************/ + // Intercept and filter web requests according to white and black lists. var onBeforeRequestHandler = function(details) {