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

Unified Diff: lib/elemHide.js

Issue 29344551: Issue 4071 - Speed up ElemHide.getSelectorsForDomain for domains with no filters (Closed)
Patch Set: Created May 25, 2016, 5:51 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
diff --git a/lib/elemHide.js b/lib/elemHide.js
index ee309d1d4a823b798804f41693dc97c22236d598..5ba0be1508670fce8003777a5ec2430a6b232fc5 100644
--- a/lib/elemHide.js
+++ b/lib/elemHide.js
@@ -55,6 +55,12 @@ var usingGetSelectorsForDomain = !("nsIStyleSheetService" in Ci);
var filtersByDomain = Object.create(null);
/**
+ * Lookup table, count of filter exceptions by domain.
+ * @type Object
+ */
+var exceptionCountByDomain = Object.create(null);
+
+/**
* Lookup table, filters by selector. (Only contains filters that have a
* selector that is unconditionally matched for all domains.)
*/
@@ -135,6 +141,7 @@ var ElemHide = exports.ElemHide =
keyByFilter = Object.create(null);
filtersByDomain = Object.create(null);
filtersBySelector = Object.create(null);
+ exceptionCountByDomain = Object.create(null);
unconditionalSelectors = null;
knownExceptions = Object.create(null);
exceptions = Object.create(null);
@@ -153,9 +160,17 @@ var ElemHide = exports.ElemHide =
filters = filtersByDomain[domain] = Object.create(null);
if (domains[domain])
+ {
filters[key] = filter;
+ }
else
+ {
filters[key] = false;
+ if (domain in exceptionCountByDomain)
+ exceptionCountByDomain[domain] += 1;
+ else
+ exceptionCountByDomain[domain] = 1;
+ }
}
},
@@ -177,6 +192,15 @@ var ElemHide = exports.ElemHide =
if (usingGetSelectorsForDomain)
{
+ let domains = filter.domains || defaultDomains;
+ for (let domain in domains)
+ {
+ if (domain in exceptionCountByDomain)
+ exceptionCountByDomain[domain] += 1;
+ else
+ exceptionCountByDomain[domain] = 1;
+ }
+
// If this is the first exception for a previously unconditionally
// applied element hiding selector we need to take care to update the
// lookups.
@@ -256,6 +280,16 @@ var ElemHide = exports.ElemHide =
if (usingGetSelectorsForDomain)
{
+ let domains = filter.domains || defaultDomains;
+ for (let domain in domains)
+ {
+ let count = exceptionCountByDomain[domain];
+ if (count > 1)
+ exceptionCountByDomain[domain] -= 1;
+ else if (count)
Sebastian Noack 2016/05/26 11:46:43 It seems the condition to check for non-zero count
+ delete exceptionCountByDomain[domain];
+ }
+
let filters = filtersBySelector[filter.selector];
if (filters)
{
@@ -501,12 +535,31 @@ var ElemHide = exports.ElemHide =
unconditionalSelectors = Object.keys(filtersBySelector);
let selectors = specificOnly ? [] : unconditionalSelectors.slice();
+ let anyExceptions = false;
+
let seenFilters = Object.create(null);
let currentDomain = domain ? domain.toUpperCase() : "";
while (true)
{
- if (specificOnly && currentDomain == "")
- break;
+ if (currentDomain == "")
+ {
+ if (specificOnly)
+ break;
+
+ // For domains with no exceptions we can add all generic rules
+ if (!anyExceptions)
+ {
+ let filters = filtersByDomain[""];
+ for (let filterKey in filters)
+ {
+ let filter = filters[filterKey];
+ if (filter)
Sebastian Noack 2016/05/26 11:46:43 Just for my understanding, what is the scenario wh
+ selectors.push(filters[filterKey].selector);
Sebastian Noack 2016/05/26 11:46:43 Use the "filter" variable here?
+ }
+ break;
+ }
+ }
+ anyExceptions = anyExceptions || exceptionCountByDomain[currentDomain];
Sebastian Noack 2016/05/26 11:46:43 I think it's preferable to write it like this: i
let filters = filtersByDomain[currentDomain];
if (filters)
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld