WebBrowser/AdBlock/AdBlockManager.py

branch
QtWebEngine
changeset 4858
19dff9c9cf26
parent 4847
a1a8eac81b54
child 4859
36c4b21c9f7b
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):

eric ide

mercurial