From 45882970fad63736338923079ca696d0ecaa7cb2 Mon Sep 17 00:00:00 2001 From: gorhill Date: Fri, 20 Mar 2015 11:39:20 -0400 Subject: [PATCH] remember/restore element picker session data when same URL --- src/js/background.js | 3 +++ src/js/element-picker.js | 54 ++++++++++++++++++++++++++-------------- src/js/messaging.js | 8 +++++- src/js/ublock.js | 2 +- 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/js/background.js b/src/js/background.js index a710b859a..1f10b19b2 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -141,6 +141,9 @@ return { contextMenuClientX: -1, contextMenuClientY: -1, + epickerTarget: '', + epickerEprom: null, + // so that I don't have to care for last comma dummy: 0 }; diff --git a/src/js/element-picker.js b/src/js/element-picker.js index bab53baca..b5a42ed89 100644 --- a/src/js/element-picker.js +++ b/src/js/element-picker.js @@ -144,6 +144,10 @@ var cosmeticFilterCandidates = []; var targetElements = []; +var lastNetFilterSession = window.location.host + window.location.pathname; +var lastNetFilterHostname = ''; +var lastNetFilterUnion = ''; + /******************************************************************************/ // For browsers not supporting `:scope`, it's not the end of the world: the @@ -234,31 +238,30 @@ var removeElements = function(elems) { /******************************************************************************/ -var incrementalNetFilter = (function() { - var lastHostname = ''; - var lastNetFilter = ''; +var netFilterFromUnion = (function() { var reTokenizer = /[^0-9a-z%*]+|[0-9a-z%]+|\*/gi; var a = document.createElement('a'); - var compute = function(to, out) { + return function(to, out) { a.href= to; to = a.pathname + a.search; - var from = lastNetFilter; + var from = lastNetFilterUnion; // Reset reference filter when dealing with unrelated URLs - if ( from === '' ) { - lastHostname = a.host; - lastNetFilter = to; - return; - } - if ( a.host !== lastHostname ) { - lastHostname = a.host; - lastNetFilter = to; + if ( from === '' && a.host !== lastNetFilterHostname ) { + lastNetFilterHostname = a.host; + lastNetFilterUnion = to; + localMessager.send({ + what: 'elementPickerEprom', + lastNetFilterSession: lastNetFilterSession, + lastNetFilterHostname: lastNetFilterHostname, + lastNetFilterUnion: lastNetFilterUnion + }); return; } // Related URLs - lastHostname = a.host; + lastNetFilterHostname = a.host; var fromTokens = from.match(reTokenizer); var toTokens = to.match(reTokenizer); @@ -287,14 +290,20 @@ var incrementalNetFilter = (function() { } from = fromTokens.join('').replace(/\*\*+/g, '*'); if ( from !== '/*' ) { - out.push('||' + lastHostname + from); + out.push('||' + lastNetFilterHostname + from); } else { from = to; } - lastNetFilter = from; - }; + lastNetFilterUnion = from; - return compute; + // Remember across element picker sessions + localMessager.send({ + what: 'elementPickerEprom', + lastNetFilterSession: lastNetFilterSession, + lastNetFilterHostname: lastNetFilterHostname, + lastNetFilterUnion: lastNetFilterUnion + }); + }; })(); /******************************************************************************/ @@ -334,7 +343,7 @@ var netFilterFromElement = function(elem, out) { } // Suggest a filter which is a result of combining more than one URL. - incrementalNetFilter(src, out); + netFilterFromUnion(src, out); }; var netFilterSources = { @@ -846,6 +855,13 @@ var startPicker = function(details) { pickerRoot.contentWindow.addEventListener('keydown', onKeyPressed, true); pickerRoot.contentWindow.focus(); + // Restore net filter union data if it originate from the same URL. + var eprom = details.eprom || {}; + if ( eprom.lastNetFilterSession === lastNetFilterSession ) { + lastNetFilterHostname = eprom.lastNetFilterHostname || ''; + lastNetFilterUnion = eprom.lastNetFilterUnion || ''; + } + // Auto-select a specific target, if any, and if possible highlightElements([], true); diff --git a/src/js/messaging.js b/src/js/messaging.js index f11de5ef3..7637d546d 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -586,7 +586,8 @@ var onMessage = function(request, sender, callback) { frameContent: this.responseText.replace(reStrings, replacer), target: µb.contextMenuTarget, clientX: µb.contextMenuClientX, - clientY: µb.contextMenuClientY + clientY: µb.contextMenuClientY, + eprom: µb.epickerEprom }); µb.contextMenuTarget = ''; @@ -595,6 +596,7 @@ var onMessage = function(request, sender, callback) { }; xhr.send(); return; + default: break; } @@ -607,6 +609,10 @@ var onMessage = function(request, sender, callback) { µb.appendUserFilters(request.filters); break; + case 'elementPickerEprom': + µb.epickerEprom = request; + break; + default: return vAPI.messaging.UNHANDLED; } diff --git a/src/js/ublock.js b/src/js/ublock.js index d6b91be90..909b9f964 100644 --- a/src/js/ublock.js +++ b/src/js/ublock.js @@ -279,7 +279,7 @@ var matchWhitelistDirective = function(url, hostname, directive) { /******************************************************************************/ µBlock.elementPickerExec = function(tabId, targetElement) { - this.elementPickerTarget = targetElement || ''; + this.epickerTarget = targetElement || ''; vAPI.tabs.injectScript(tabId, { file: 'js/element-picker.js' }); };