Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: lib/elemHide.js

Issue 4529242486341632: Issue 235 - Improved performance of ElemHide.getSelectorsForDomain() (Closed)
Patch Set: Optimized performance of data structure removal Created Jan. 22, 2015, 2:43 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/elemHide.js
===================================================================
--- a/lib/elemHide.js
+++ b/lib/elemHide.js
@@ -59,6 +59,12 @@
let styleURL = null;
/**
+ * Lookup table, blocking filters by domain which they are applied to
+ * @type Object
+ */
+let filtersByDomain = Object.create(null);
+
+/**
* Element hiding component
* @class
*/
@@ -105,6 +111,7 @@
keyByFilter = Object.create(null);
knownExceptions = Object.create(null);
exceptions = Object.create(null);
+ filtersByDomain = Object.create(null);
ElemHide.isDirty = false;
ElemHide.unapply();
},
@@ -131,6 +138,28 @@
if (filter.text in keyByFilter)
return;
+ if (!("nsIStyleSheetService" in Ci))
Wladimir Palant 2015/02/23 19:20:16 Looking up things in Components.interfaces isn't s
Thomas Greiner 2015/03/12 16:00:06 Done.
+ {
+ let domains = filter.domains;
+ if (domains === null)
+ {
+ domains = Object.create(null);
+ domains[""] = undefined;
Wladimir Palant 2015/02/23 19:20:16 This should be true, not undefined.
Thomas Greiner 2015/03/12 16:00:06 Done.
+ }
+
+ for (let domain in domains)
+ {
+ if (!(domain in filtersByDomain))
+ {
+ filtersByDomain[domain] = Object.create(null);
+ filtersByDomain[domain]._length = 0;
+ }
+
+ filtersByDomain[domain][filter.text] = filter.isActiveOnDomain(domain);
Wladimir Palant 2015/02/23 19:20:16 The very point of this functionality is to avoid c
Thomas Greiner 2015/03/12 16:00:06 Done, you're right that it appears to be redundant
+ filtersByDomain[domain]._length++;
Wladimir Palant 2015/02/23 19:20:16 Strictly speaking, _length isn't an invalid domain
Thomas Greiner 2015/03/12 16:00:06 That's true but that might make it difficult to sp
+ }
+ }
+
let key;
do {
key = Math.random().toFixed(15).substr(5);
@@ -164,6 +193,26 @@
if (!(filter.text in keyByFilter))
return;
+ if (!("nsIStyleSheetService" in Ci))
+ {
+ let domains = filter.domains;
+ if (!domains)
+ {
+ domains = Object.create(null);
+ domains[""] = undefined;
Wladimir Palant 2015/02/23 19:20:16 This should be true, not undefined.
Thomas Greiner 2015/03/12 16:00:06 Done.
+ }
+
+ for (let domain in domains)
+ {
+ if (domain in filtersByDomain && filter.text in filtersByDomain[domain])
+ {
+ delete filtersByDomain[domain][filter.text];
+ if (!--filtersByDomain[domain]._length)
+ delete filtersByDomain[domain];
+ }
+ }
+ }
+
let key = keyByFilter[filter.text];
delete filterByKey[key];
delete keyByFilter[filter.text];
@@ -377,16 +426,59 @@
*/
getSelectorsForDomain: function(/**String*/ domain, /**Boolean*/ specificOnly)
{
Wladimir Palant 2015/02/23 19:20:16 How about an exception here on Firefox, to explain
Thomas Greiner 2015/03/12 16:00:06 Done.
- let result = [];
- for (let key in filterByKey)
+ let selectors = [];
+ domain = domain.toUpperCase();
+
+ if (!specificOnly)
{
- let filter = filterByKey[key];
- if (specificOnly && (!filter.domains || filter.domains[""]))
- continue;
+ let filterTexts = filtersByDomain[""];
+ if (filterTexts)
+ {
+ for (let filterText in filterTexts)
+ {
+ if (filterTexts[filterText])
+ {
+ let filter = filterByKey[keyByFilter[filterText]];
+ if (!filter)
+ continue;
+
+ let selector = filter.selector;
+ if (filter.isActiveOnDomain(docDomain) && !this.getException(selector, docDomain))
Thomas Greiner 2015/03/12 16:00:06 Done.
+ selectors[selectors.length] = selector;
+ }
+ }
+ }
+ }
- if (filter.isActiveOnDomain(domain) && !this.getException(filter, domain))
- result.push(filter.selector);
+ while (true)
+ {
+ if (domain && domain in filtersByDomain)
+ {
+ let filterTexts = filtersByDomain[domain];
+ if (filterTexts)
Wladimir Palant 2015/02/23 19:20:16 This check seems pointless - if a property exists
Thomas Greiner 2015/03/12 16:00:06 Done.
+ {
+ for (let filterText in filterTexts)
+ {
+ if (filterTexts[filterText])
+ {
+ let filter = filterByKey[keyByFilter[filterText]];
Wladimir Palant 2015/02/23 19:20:16 let filter = Filter.fromText(filterText);
Thomas Greiner 2015/03/12 16:00:06 Done.
+ if (!filter)
+ continue;
+
+ let selector = filter.selector;
+ if (!this.getException(selector, docDomain))
+ selectors[selectors.length] = selector;
Wladimir Palant 2015/02/23 19:20:16 You meant using selectors.push(), right?
Thomas Greiner 2015/03/12 16:00:06 This turned out to be about ~3ms faster for each c
+ }
+ }
+ }
+ }
+
+ let nextDot = domain.indexOf(".");
+ if (nextDot < 0)
+ break;
+ domain = domain.substr(nextDot + 1);
}
Wladimir Palant 2015/02/23 19:20:16 This logic is wrong, we can have a filter ~subdoma
Thomas Greiner 2015/03/12 16:00:06 Indeed, that's true. I added the `ignorableFilters
- return result;
+
+ return selectors;
}
};
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld