diff -r e9e7eca7efee -r bf71ee032bb4 src/eric7/WebBrowser/AdBlock/AdBlockMatcher.py --- a/src/eric7/WebBrowser/AdBlock/AdBlockMatcher.py Wed Jul 13 11:16:20 2022 +0200 +++ b/src/eric7/WebBrowser/AdBlock/AdBlockMatcher.py Wed Jul 13 14:55:47 2022 +0200 @@ -17,32 +17,33 @@ """ Class implementing the AdBlock matcher. """ + def __init__(self, manager): """ Constructor - + @param manager reference to the AdBlock manager object @type AdBlockManager """ super().__init__(manager) - + self.__manager = manager - + self.__createdRules = [] self.__networkExceptionRules = [] self.__networkBlockRules = [] self.__domainRestrictedCssRules = [] self.__documentRules = [] self.__elemhideRules = [] - + self.__elementHidingRules = "" self.__networkBlockTree = AdBlockSearchTree() self.__networkExceptionTree = AdBlockSearchTree() - + def match(self, request, urlDomain, urlString): """ Public method to match a request. - + @param request URL request to be matched @type QWebEngineUrlRequestInfo @param urlDomain domain of the URL @@ -55,38 +56,38 @@ # exception rules if self.__networkExceptionTree.find(request, urlDomain, urlString): return None - + for rule in self.__networkExceptionRules: if rule.networkMatch(request, urlDomain, urlString): return None - + # block rules rule = self.__networkBlockTree.find(request, urlDomain, urlString) if rule: return rule - + for rule in self.__networkBlockRules: if rule.networkMatch(request, urlDomain, urlString): return rule - + return None - + def adBlockDisabledForUrl(self, url): """ Public method to check, if AdBlock is disabled for the given URL. - + @param url URL to check @type QUrl @return flag indicating disabled state @rtype bool """ return any(rule.urlMatch(url) for rule in self.__documentRules) - + def elemHideDisabledForUrl(self, url): """ Public method to check, if element hiding is disabled for the given URL. - + @param url URL to check @type QUrl @return flag indicating disabled state @@ -94,22 +95,22 @@ """ if self.adBlockDisabledForUrl(url): return True - + return any(rule.urlMatch(url) for rule in self.__elemhideRules) - + def elementHidingRules(self): """ Public method to get the element hiding rules. - + @return element hiding rules @rtype str """ return self.__elementHidingRules - + def elementHidingRulesForDomain(self, domain): """ Public method to get the element hiding rules for the given domain. - + @param domain domain name @type str @return element hiding rules @@ -117,11 +118,11 @@ """ rules = "" addedRulesCount = 0 - + for rule in self.__domainRestrictedCssRules: if not rule.matchDomain(domain): continue - + if addedRulesCount == 1000: rules += rule.cssSelector() rules += "{display:none !important;}\n" @@ -129,36 +130,36 @@ else: rules += rule.cssSelector() + "," addedRulesCount += 1 - + if addedRulesCount != 0: rules = rules[:-1] rules += "{display:none !important;}\n" - + return rules - + def update(self): """ Public slot to update the internal state. """ self.clear() - + cssRulesDict = {} exceptionCssRules = [] - + for subscription in self.__manager.subscriptions(): if subscription.isEnabled(): for rule in subscription.allRules(): # Don't add internally disabled rules to the cache if rule.isInternalDisabled(): continue - + if rule.isCSSRule(): # Only enabled CSS rules are added to the cache because # there is no enabled/disabled check on match. They are # directly embedded to pages. if not rule.isEnabled(): continue - + if rule.isException(): exceptionCssRules.append(rule) else: @@ -173,28 +174,28 @@ else: if not self.__networkBlockTree.add(rule): self.__networkBlockRules.append(rule) - + for rule in exceptionCssRules: try: originalRule = cssRulesDict[rule.cssSelector()] except KeyError: # If there is no such selector, the exception does nothing. continue - + copiedRule = AdBlockRule() copiedRule.copyFrom(originalRule) copiedRule.setOption(AdBlockRuleOption.DomainRestrictedOption) copiedRule.addBlockedDomains(rule.allowedDomains()) - + cssRulesDict[rule.cssSelector()] = copiedRule self.__createdRules.append(copiedRule) - + # Excessive amount of selectors for one CSS rule is not what the # rendering engine likes. So split them up by 1.000 selectors. hidingRulesCount = 0 for key in cssRulesDict: rule = cssRulesDict[key] - + if rule.isDomainRestricted(): self.__domainRestrictedCssRules.append(rule) elif hidingRulesCount == 1000: @@ -204,11 +205,11 @@ else: self.__elementHidingRules += rule.cssSelector() + "," hidingRulesCount += 1 - + if hidingRulesCount != 0: self.__elementHidingRules = self.__elementHidingRules[:-1] self.__elementHidingRules += "{display:none !important;} " - + def clear(self): """ Public slot to clear the internal structures. @@ -219,7 +220,7 @@ self.__domainRestrictedCssRules = [] self.__documentRules = [] self.__elemhideRules = [] - + self.__elementHidingRules = "" self.__networkBlockTree.clear() self.__networkExceptionTree.clear()