Index: lib/content/elemHideEmulation.js |
=================================================================== |
--- a/lib/content/elemHideEmulation.js |
+++ b/lib/content/elemHideEmulation.js |
@@ -219,16 +219,17 @@ |
// sure there is at least one point where execution can pause. |
yield null; |
} |
function PlainSelector(selector) |
{ |
this._selector = selector; |
this.maybeDependsOnAttributes = /[#.]|\[.+\]/.test(selector); |
+ this.dependsOnDOM = this.maybeDependsOnAttributes; |
Manish Jethani
2018/04/24 13:58:32
OK, since Trac #6618 is rejected we have to proces
|
} |
PlainSelector.prototype = { |
/** |
* Generator function returning a pair of selector |
* string and subtree. |
* @param {string} prefix the prefix for the selector. |
* @param {Node} subtree the subtree we work on. |
@@ -458,27 +459,69 @@ |
get dependsOnCharacterData() |
{ |
// Observe changes to character data only if there's a contains selector in |
// one of the patterns. |
return getCachedPropertyValue( |
this, "_dependsOnCharacterData", |
() => this.selectors.some(selector => selector.dependsOnCharacterData) |
); |
+ }, |
+ |
+ matchesMutationTypes(mutationTypes) |
+ { |
+ let mutationTypeMatchMap = getCachedPropertyValue( |
+ this, "_mutationTypeMatchMap", |
+ () => new Map([ |
+ // All types of DOM-dependent patterns are affected by mutations of |
+ // type "childList". |
+ ["childList", true], |
+ ["attributes", this.maybeDependsOnAttributes], |
+ ["characterData", this.dependsOnCharacterData] |
+ ]) |
+ ); |
+ |
+ for (let mutationType of mutationTypes) |
+ { |
+ if (mutationTypeMatchMap.get(mutationType)) |
+ return true; |
+ } |
+ |
+ return false; |
} |
}; |
+function extractMutationTypes(mutations) |
+{ |
+ let types = new Set(); |
+ |
+ for (let mutation of mutations) |
+ { |
+ types.add(mutation.type); |
+ |
+ // There are only 3 types of mutations: "attributes", "characterData", and |
+ // "childList". |
+ if (types.size == 3) |
+ break; |
+ } |
+ |
+ return types; |
+} |
+ |
function filterPatterns(patterns, {stylesheets, mutations}) |
{ |
if (!stylesheets && !mutations) |
return patterns.slice(); |
+ let mutationTypes = mutations ? extractMutationTypes(mutations) : null; |
+ |
return patterns.filter( |
pattern => (stylesheets && pattern.dependsOnStyles) || |
- (mutations && pattern.dependsOnDOM) |
+ (mutations && pattern.dependsOnDOM && |
+ pattern.matchesMutationTypes(mutationTypes)) |
); |
} |
function shouldObserveAttributes(patterns) |
{ |
return patterns.some(pattern => pattern.maybeDependsOnAttributes); |
} |