diff -r 8dba5fb92f12 -r 19dff9c9cf26 WebBrowser/AdBlock/AdBlockManager.py --- a/WebBrowser/AdBlock/AdBlockManager.py Sun Mar 13 14:56:13 2016 +0100 +++ b/WebBrowser/AdBlock/AdBlockManager.py Sun Mar 13 20:54:42 2016 +0100 @@ -11,9 +11,14 @@ import os -from PyQt5.QtCore import pyqtSignal, QObject, QUrl, QFile +from PyQt5.QtCore import pyqtSignal, QObject, QUrl, QUrlQuery, QFile, \ + QByteArray +from PyQt5.QtWebEngineCore import QWebEngineUrlRequestInfo + +from E5Gui import E5MessageBox from .AdBlockSubscription import AdBlockSubscription +from .AdBlockUrlInterceptor import AdBlockUrlInterceptor from Utilities.AutoSaver import AutoSaver import Utilities @@ -56,6 +61,20 @@ bytes(self.__customSubscriptionUrl().toEncoded()).decode() self.rulesChanged.connect(self.__saveTimer.changeOccurred) + self.rulesChanged.connect(self.__rulesChanged) + + self.__interceptor = AdBlockUrlInterceptor(self) + + from WebBrowser.WebBrowserWindow import WebBrowserWindow + WebBrowserWindow.networkManager().installUrlInterceptor( + self.__interceptor) + + def __rulesChanged(self): + """ + Private slot handling a change of the AdBlock rules. + """ + from WebBrowser.WebBrowserWindow import WebBrowserWindow + WebBrowserWindow.mainWindow().reloadUserStyleSheet() def close(self): """ @@ -94,17 +113,61 @@ if enabled: self.__loadSubscriptions() self.rulesChanged.emit() -## -## def network(self): -## """ -## Public method to get a reference to the network block object. -## -## @return reference to the network block object (AdBlockNetwork) -## """ -## if self.__adBlockNetwork is None: -## from .AdBlockNetwork import AdBlockNetwork -## self.__adBlockNetwork = AdBlockNetwork(self) -## return self.__adBlockNetwork + + def block(self, info): + """ + Public method to check, if a request should be blocked. + + @param info request info aobject + @type QWebEngineUrlRequestInfo + @return flag indicating to block the request + @rtype bool + """ + urlString = bytes(info.requestUrl().toEncoded()).decode().lower() + urlDomain = info.requestUrl().host().lower() + urlScheme = info.requestUrl().scheme().lower() + refererHost = info.firstPartyUrl().host().lower() + + if not self.isEnabled() or not self.__canRunOnScheme(urlScheme): + return False + + if self.isHostExcepted(urlDomain) or self.isHostExcepted(refererHost): + return False + + res = False + + for subscription in self.subscriptions(): + if subscription.isEnabled(): + if subscription.adBlockDisabledForUrl(info.requestUrl()): + continue + + blockedRule = subscription.match(info, urlDomain, urlString) + if blockedRule: + res = True + if info.resourceType() == \ + QWebEngineUrlRequestInfo.ResourceTypeMainFrame: + url = QUrl("eric:adblock") + query = QUrlQuery() + query.addQueryItem("rule", blockedRule.filter()) + query.addQueryItem( + "subscription", blockedRule.subscription().title()) + url.setQuery(query) + info.redirect(url) + res = False + else: + info.block(True) + break + + return res + + def __canRunOnScheme(self, scheme): + """ + Private method to check, if AdBlock can be performed on the scheme. + + @param scheme scheme to check (string) + @return flag indicating, that AdBlock can be performed (boolean) + """ + return scheme not in ["data", "eric", "qthelp", "qrc", "file", "abp"] def page(self): """ @@ -218,6 +281,42 @@ except ValueError: pass + def addSubscriptionFromUrl(self, url): + """ + Public method to ad an AdBlock subscription given the abp URL: + + @param url URL to subscribe an AdBlock subscription + @type QUrl + @return flag indicating success + @rtype bool + """ + if url.path() != "subscribe": + return False + + title = QUrl.fromPercentEncoding( + QByteArray(QUrlQuery(url).queryItemValue("title").encode())) + if not title: + return False + + res = E5MessageBox.yesNo( + None, + self.tr("Subscribe?"), + self.tr( + """<p>Subscribe to this AdBlock subscription?</p>""" + """<p>{0}</p>""").format(title)) + if res: + from .AdBlockSubscription import AdBlockSubscription + from WebBrowser.WebBrowserWindow import WebBrowserWindow + + dlg = WebBrowserWindow.adBlockManager().showDialog() + subscription = AdBlockSubscription( + url, False, + WebBrowserWindow.adBlockManager()) + WebBrowserWindow.adBlockManager().addSubscription(subscription) + dlg.addSubscription(subscription, False) + dlg.setFocus() + dlg.raise_() + def addSubscription(self, subscription): """ Public method to add an AdBlock subscription. @@ -271,8 +370,13 @@ self.__loaded = True self.__enabled = Preferences.getWebBrowser("AdBlockEnabled") +## if (!m_enabled) { +## mApp->networkManager()->removeUrlInterceptor(m_interceptor); +## return; +## } if self.__enabled: self.__loadSubscriptions() +## mApp->networkManager()->installUrlInterceptor(m_interceptor); def __loadSubscriptions(self): """ @@ -362,23 +466,13 @@ self.__adBlockDialog.show() return self.__adBlockDialog - def showRule(self): - """ - Public slot to show an AdBlock rule. - """ - act = self.sender() - if act is not None: - rule = act.data() - if rule: - self.showDialog().showRule(rule) - def elementHidingRules(self): """ Public method to get the element hiding rules. @return element hiding rules (string) """ - if not self.__enabled: + if not self.isEnabled(): return "" rules = "" @@ -399,7 +493,7 @@ @param url URL to get hiding rules for (QUrl) @return element hiding rules (string) """ - if not self.__enabled: + if not self.isEnabled(): return "" rules = "" @@ -432,7 +526,7 @@ @param hosts list of excepted hosts (list of string) """ - self.__exceptedHosts = hosts[:] + self.__exceptedHosts = [host.lower() for host in hosts] Preferences.setWebBrowser("AdBlockExceptions", self.__exceptedHosts) def addException(self, host): @@ -441,6 +535,7 @@ @param host to be excepted (string) """ + host = host.lower() if host and host not in self.__exceptedHosts: self.__exceptedHosts.append(host) Preferences.setWebBrowser( @@ -452,6 +547,7 @@ @param host to be removed from the list of exceptions (string) """ + host = host.lower() if host in self.__exceptedHosts: self.__exceptedHosts.remove(host) Preferences.setWebBrowser( @@ -464,6 +560,7 @@ @param host host to check (string) @return flag indicating an exception (boolean) """ + host = host.lower() return host in self.__exceptedHosts def showExceptionsDialog(self):