WebBrowser/WebBrowserView.py

branch
maintenance
changeset 6166
bace7fb85a01
parent 6097
bf18415da0c7
parent 6155
ae44225e7e7c
child 6273
0daf79d65080
diff -r 0c976706e8c1 -r bace7fb85a01 WebBrowser/WebBrowserView.py
--- a/WebBrowser/WebBrowserView.py	Sun Feb 04 10:56:30 2018 +0100
+++ b/WebBrowser/WebBrowserView.py	Fri Mar 02 19:35:16 2018 +0100
@@ -16,9 +16,9 @@
 
 import os
 
-from PyQt5.QtCore import pyqtSignal, PYQT_VERSION, Qt, QUrl, QFileInfo, \
-    QTimer, QEvent, QPoint, QPointF, QDateTime, QStandardPaths, QByteArray, \
-    QIODevice, QDataStream
+from PyQt5.QtCore import pyqtSignal, pyqtSlot, PYQT_VERSION, Qt, QUrl, \
+    QFileInfo, QTimer, QEvent, QPoint, QPointF, QDateTime, QStandardPaths, \
+    QByteArray, QIODevice, QDataStream
 from PyQt5.QtGui import QDesktopServices, QClipboard, QIcon, \
     QContextMenuEvent, QPixmap
 from PyQt5.QtWidgets import qApp, QStyle, QMenu, QApplication
@@ -152,6 +152,7 @@
         
         self.__page.safeBrowsingAbort.connect(self.safeBrowsingAbort)
         self.__page.safeBrowsingBad.connect(self.safeBrowsingBad)
+        self.__page.printRequested.connect(self.__printPage)
     
     def __setRwhvqt(self):
         """
@@ -188,6 +189,11 @@
         @param url URL to be loaded
         @type QUrl
         """
+        if self.__page is not None and \
+            not self.__page.acceptNavigationRequest(
+                url, QWebEnginePage.NavigationTypeTyped, True):
+            return
+        
         super(WebBrowserView, self).load(url)
         
         if not self.__firstLoad:
@@ -556,10 +562,10 @@
                 boldFont.setBold(True)
                 
                 for suggestion in contextMenuData.spellCheckerSuggestions():
-                    act = menu.addAction(
-                        suggestion,
-                        self.__replaceMisspelledWord)
+                    act = menu.addAction(suggestion)
                     act.setFont(boldFont)
+                    act.triggered.connect(
+                        lambda: self.__replaceMisspelledWord)(act)
                 
                 if not bool(menu.actions()):
                     menu.addAction(self.tr("No suggestions")).setEnabled(False)
@@ -614,41 +620,55 @@
         if not menu.isEmpty():
             menu.addSeparator()
         
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("openNewTab.png"),
-            self.tr("Open Link in New Tab\tCtrl+LMB"),
-            self.__openLinkInNewTab).setData(hitTest.linkUrl())
-        menu.addAction(
+            self.tr("Open Link in New Tab\tCtrl+LMB"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__openLinkInNewTab(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("newWindow.png"),
-            self.tr("Open Link in New Window"),
-            self.__openLinkInNewWindow).setData(hitTest.linkUrl())
-        menu.addAction(
+            self.tr("Open Link in New Window"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__openLinkInNewWindow(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("privateMode.png"),
-            self.tr("Open Link in New Private Window"),
-            self.__openLinkInNewPrivateWindow).setData(hitTest.linkUrl())
+            self.tr("Open Link in New Private Window"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__openLinkInNewPrivateWindow(act))
         menu.addSeparator()
         menu.addAction(
             UI.PixmapCache.getIcon("download.png"),
             self.tr("Save Lin&k"), self.__downloadLink)
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("bookmark22.png"),
-            self.tr("Bookmark this Link"), self.__bookmarkLink)\
-            .setData(hitTest.linkUrl())
+            self.tr("Bookmark this Link"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__bookmarkLink(act))
         menu.addSeparator()
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("editCopy.png"),
-            self.tr("Copy Link to Clipboard"), self.__copyLink)\
-            .setData(hitTest.linkUrl())
-        menu.addAction(
+            self.tr("Copy Link to Clipboard"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__copyLink(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Link"),
-            self.__sendLink).setData(hitTest.linkUrl())
+            self.tr("Send Link"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         if Preferences.getWebBrowser("VirusTotalEnabled") and \
            Preferences.getWebBrowser("VirusTotalServiceKey") != "":
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("virustotal.png"),
-                self.tr("Scan Link with VirusTotal"),
-                self.__virusTotal).setData(hitTest.linkUrl())
+                self.tr("Scan Link with VirusTotal"))
+            act.setData(hitTest.linkUrl())
+            act.triggered.connect(
+                lambda: self.__virusTotal(act))
         
     def __createImageContextMenu(self, menu, hitTest):
         """
@@ -662,57 +682,69 @@
         if not menu.isEmpty():
             menu.addSeparator()
         
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("openNewTab.png"),
-            self.tr("Open Image in New Tab"),
-            self.__openLinkInNewTab).setData(hitTest.imageUrl())
+            self.tr("Open Image in New Tab"))
+        act.setData(hitTest.imageUrl())
+        act.triggered.connect(
+            lambda: self.__openLinkInNewTab(act))
         menu.addSeparator()
         menu.addAction(
             UI.PixmapCache.getIcon("download.png"),
             self.tr("Save Image"), self.__downloadImage)
         menu.addAction(
             self.tr("Copy Image to Clipboard"), self.__copyImage)
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("editCopy.png"),
-            self.tr("Copy Image Location to Clipboard"),
-            self.__copyLink).setData(hitTest.imageUrl())
-        menu.addAction(
+            self.tr("Copy Image Location to Clipboard"))
+        act.setData(hitTest.imageUrl())
+        act.triggered.connect(
+            lambda: self.__copyLink(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Image Link"),
-            self.__sendLink).setData(hitTest.imageUrl())
+            self.tr("Send Image Link"))
+        act.setData(hitTest.imageUrl())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         
         if hitTest.imageUrl().scheme() in ["http", "https"]:
             menu.addSeparator()
             engine = WebBrowserWindow.imageSearchEngine()
             searchEngineName = engine.searchEngine()
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("{0}.png".format(
                     searchEngineName.lower())),
-                self.tr("Search image in {0}").format(searchEngineName),
-                self.__searchImage).setData(
-                    engine.getSearchQuery(hitTest.imageUrl()))
+                self.tr("Search image in {0}").format(searchEngineName))
+            act.setData(engine.getSearchQuery(hitTest.imageUrl()))
+            act.triggered.connect(
+                lambda: self.__searchImage(act))
             self.__imageSearchMenu = menu.addMenu(
                 self.tr("Search image with..."))
             for searchEngineName in engine.searchEngineNames():
-                self.__imageSearchMenu.addAction(
+                act = self.__imageSearchMenu.addAction(
                     UI.PixmapCache.getIcon("{0}.png".format(
                         searchEngineName.lower())),
-                    self.tr("Search image in {0}").format(searchEngineName),
-                    self.__searchImage).setData(
-                        engine.getSearchQuery(
-                            hitTest.imageUrl(), searchEngineName))
+                    self.tr("Search image in {0}").format(searchEngineName))
+                act.setData(engine.getSearchQuery(
+                    hitTest.imageUrl(), searchEngineName))
+                act.triggered.connect(
+                    lambda: self.__searchImage(act))
         
         menu.addSeparator()
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("adBlockPlus.png"),
-            self.tr("Block Image"), self.__blockImage)\
-            .setData(hitTest.imageUrl().toString())
+            self.tr("Block Image"))
+        act.setData(hitTest.imageUrl().toString())
+        act.triggered.connect(
+            lambda: self.__blockImage(act))
         if Preferences.getWebBrowser("VirusTotalEnabled") and \
            Preferences.getWebBrowser("VirusTotalServiceKey") != "":
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("virustotal.png"),
-                self.tr("Scan Image with VirusTotal"),
-                self.__virusTotal).setData(hitTest.imageUrl())
+                self.tr("Scan Image with VirusTotal"))
+            act.setData(hitTest.imageUrl())
+            act.triggered.connect(
+                lambda: self.__virusTotal(act))
     
     def __createMediaContextMenu(self, menu, hitTest):
         """
@@ -743,14 +775,18 @@
                 UI.PixmapCache.getIcon("audioVolumeMuted.png"),
                 self.tr("Mute"), self.__muteMedia)
         menu.addSeparator()
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("editCopy.png"),
-            self.tr("Copy Media Address to Clipboard"),
-            self.__copyLink).setData(hitTest.mediaUrl())
-        menu.addAction(
+            self.tr("Copy Media Address to Clipboard"))
+        act.setData(hitTest.mediaUrl())
+        act.triggered.connect(
+            lambda: self.__copyLink(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Media Address"), self.__sendLink)\
-            .setData(hitTest.mediaUrl())
+            self.tr("Send Media Address"))
+        act.setData(hitTest.mediaUrl())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         menu.addAction(
             UI.PixmapCache.getIcon("download.png"),
             self.tr("Save Media"), self.__downloadMedia)
@@ -769,10 +805,12 @@
         
         menu.addAction(self.__mw.copyAct)
         menu.addSeparator()
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Text"),
-            self.__sendLink).setData(self.selectedText())
+            self.tr("Send Text"))
+        act.setData(self.selectedText())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         
         engineName = self.__mw.openSearchManager().currentEngineName()
         if engineName:
@@ -804,24 +842,29 @@
             googleTranslatorUrl = QUrl(
                 "http://translate.google.com/#auto/{0}/{1}".format(
                     langCode, self.selectedText()))
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("translate.png"),
-                self.tr("Google Translate"), self.__openLinkInNewTab)\
-                .setData(googleTranslatorUrl)
+                self.tr("Google Translate"))
+            act.setData(googleTranslatorUrl)
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
             wiktionaryUrl = QUrl(
                 "http://{0}.wiktionary.org/wiki/Special:Search?search={1}"
                 .format(langCode, self.selectedText()))
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("wikipedia.png"),
-                self.tr("Dictionary"), self.__openLinkInNewTab)\
-                .setData(wiktionaryUrl)
+                self.tr("Dictionary"))
+            act.setData(wiktionaryUrl)
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
             menu.addSeparator()
         
         guessedUrl = QUrl.fromUserInput(self.selectedText().strip())
         if self.__isUrlValid(guessedUrl):
-            menu.addAction(
-                self.tr("Go to web address"),
-                self.__openLinkInNewTab).setData(guessedUrl)
+            act = menu.addAction(self.tr("Go to web address"))
+            act.setData(guessedUrl)
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
     
     def __createPageContextMenu(self, menu):
         """
@@ -835,7 +878,8 @@
         menu.addSeparator()
         if self.__mw.saveAsAct is not None:
             menu.addAction(self.__mw.saveAsAct)
-            menu.addSeparator()
+        menu.addAction(self.__mw.saveVisiblePageScreenAct)
+        menu.addSeparator()
         
         if self.url().toString() == "eric:speeddial":
             # special menu for the spedd dial page
@@ -860,12 +904,18 @@
         menu.addAction(
             UI.PixmapCache.getIcon("bookmark22.png"),
             self.tr("Bookmark this Page"), self.addBookmark)
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("editCopy.png"),
-            self.tr("Copy Page Link"), self.__copyLink).setData(self.url())
-        menu.addAction(
+            self.tr("Copy Page Link"))
+        act.setData(self.url())
+        act.triggered.connect(
+            lambda: self.__copyLink(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Page Link"), self.__sendLink).setData(self.url())
+            self.tr("Send Page Link"))
+        act.setData(self.url())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         menu.addSeparator()
         
         from .UserAgent.UserAgentMenu import UserAgentMenu
@@ -896,10 +946,12 @@
             w3url = QUrl.fromEncoded(
                 b"http://validator.w3.org/check?uri=" +
                 QUrl.toPercentEncoding(bytes(self.url().toEncoded()).decode()))
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("w3.png"),
-                self.tr("Validate Page"), self.__openLinkInNewTab)\
-                .setData(w3url)
+                self.tr("Validate Page"))
+            act.setData(w3url)
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
             
             from .WebBrowserLanguagesDialog import WebBrowserLanguagesDialog
             languages = Preferences.toList(
@@ -915,11 +967,13 @@
                     b"&u=" +
                     QUrl.toPercentEncoding(
                         bytes(self.url().toEncoded()).decode()))
-                menu.addAction(
+                act = menu.addAction(
                     UI.PixmapCache.getIcon("translate.png"),
-                    self.tr("Google Translate"), self.__openLinkInNewTab)\
-                    .setData(googleTranslatorUrl)
-        
+                    self.tr("Google Translate"))
+                act.setData(googleTranslatorUrl)
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
+    
     def __checkForForm(self, act, pos):
         """
         Private method to check the given position for an open search form.
@@ -970,55 +1024,65 @@
             bool(url.scheme()) and \
             "." in url.host()
     
-    def __replaceMisspelledWord(self):
+    def __replaceMisspelledWord(self, act):
         """
         Private slot to replace a misspelled word under the context menu.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         suggestion = act.text()
         self.page().replaceMisspelledWord(suggestion)
     
-    def __openLinkInNewTab(self):
+    def __openLinkInNewTab(self, act):
         """
         Private method called by the context menu to open a link in a new
         tab.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         if url.isEmpty():
             return
         
         self.setSource(url, newTab=True)
     
-    def __openLinkInNewWindow(self):
+    def __openLinkInNewWindow(self, act):
         """
         Private slot called by the context menu to open a link in a new
         window.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         if url.isEmpty():
             return
         
         self.__mw.newWindow(url)
     
-    def __openLinkInNewPrivateWindow(self):
+    def __openLinkInNewPrivateWindow(self, act):
         """
         Private slot called by the context menu to open a link in a new
         private window.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         if url.isEmpty():
             return
         
         self.__mw.newPrivateWindow(url)
     
-    def __bookmarkLink(self):
+    def __bookmarkLink(self, act):
         """
         Private slot to bookmark a link via the context menu.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         if url.isEmpty():
             return
@@ -1028,11 +1092,13 @@
         dlg.setUrl(bytes(url.toEncoded()).decode())
         dlg.exec_()
     
-    def __sendLink(self):
+    def __sendLink(self, act):
         """
         Private slot to send a link via email.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         data = act.data()
         if isinstance(data, QUrl) and data.isEmpty():
             return
@@ -1041,11 +1107,13 @@
             data = data.toString()
         QDesktopServices.openUrl(QUrl("mailto:?body=" + data))
     
-    def __copyLink(self):
+    def __copyLink(self, act):
         """
         Private slot to copy a link to the clipboard.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         data = act.data()
         if isinstance(data, QUrl) and data.isEmpty():
             return
@@ -1072,20 +1140,24 @@
         """
         self.triggerPageAction(QWebEnginePage.CopyImageToClipboard)
     
-    def __blockImage(self):
+    def __blockImage(self, act):
         """
         Private slot to add a block rule for an image URL.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         dlg = WebBrowserWindow.adBlockManager().showDialog()
         dlg.addCustomRule(url)
     
-    def __searchImage(self):
+    def __searchImage(self, act):
         """
         Private slot to search for an image URL.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         self.setSource(url, newTab=True)
     
@@ -1107,11 +1179,13 @@
         """
         self.triggerPageAction(QWebEnginePage.ToggleMediaMute)
     
-    def __virusTotal(self):
+    def __virusTotal(self, act):
         """
         Private slot to scan the selected URL with VirusTotal.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         self.__mw.requestVirusTotalScan(url)
     
@@ -1163,13 +1237,16 @@
         """
         Private slot to show the web inspector window.
         """
-        if self.__inspector is None:
-            from .WebInspector import WebInspector
-            self.__inspector = WebInspector()
-            self.__inspector.setView(self, True)
-            self.__inspector.show()
-        else:
-            self.closeWebInspector()
+        from .WebInspector import WebInspector
+        if WebInspector.isEnabled():
+            if self.__inspector is None:
+                self.__inspector = WebInspector()
+                self.__inspector.setView(self, True)
+                self.__inspector.inspectorClosed.connect(
+                    self.closeWebInspector)
+                self.__inspector.show()
+            else:
+                self.closeWebInspector()
     
     def closeWebInspector(self):
         """
@@ -1562,6 +1639,29 @@
         from .Tools import WebIconProvider
         return WebIconProvider.instance().iconForUrl(self.url())
     
+    def title(self):
+        """
+        Public method to get the view title.
+        
+        @return view title
+        @rtype str
+        """
+        titleStr = super(WebBrowserView, self).title()
+        if not titleStr:
+            if self.url().isEmpty():
+                url = self.__page.requestedUrl()
+            else:
+                url = self.url()
+            
+            titleStr = url.host()
+            if not titleStr:
+                titleStr = url.toString(QUrl.RemoveFragment)
+            
+        if not titleStr or titleStr == "about:blank":
+            titleStr = self.tr("Empty Page")
+        
+        return titleStr
+    
     def __linkHovered(self, link):
         """
         Private slot to handle the linkHovered signal.
@@ -2081,3 +2181,14 @@
             return self.__page.getSafeBrowsingStatus()
         else:
             return True
+    
+    ###########################################################################
+    ## Methods below implement print support from the page
+    ###########################################################################
+    
+    @pyqtSlot()
+    def __printPage(self):
+        """
+        Private slot to support printing from the web page.
+        """
+        self.__mw.tabWidget.printBrowser(browser=self)

eric ide

mercurial