Helpviewer/HelpBrowserWV.py

changeset 4341
1ff0929aab09
parent 4326
e52318f11812
child 4352
86f7a3344d38
--- a/Helpviewer/HelpBrowserWV.py	Sun Jul 26 19:02:11 2015 +0200
+++ b/Helpviewer/HelpBrowserWV.py	Tue Jul 28 19:19:23 2015 +0200
@@ -188,6 +188,11 @@
         
         self.__adBlockedEntries = []
         self.loadStarted.connect(self.__loadStarted)
+        
+        self.saveFrameStateRequested.connect(
+            self.__saveFrameStateRequested)
+        self.restoreFrameStateRequested.connect(
+            self.__restoreFrameStateRequested)
     
     def acceptNavigationRequest(self, frame, request, type_):
         """
@@ -303,6 +308,21 @@
             urlString = bytes(info.url.toEncoded()).decode()
             errorPage.baseUrl = info.url
             if info.domain == QWebPage.QtNetwork and \
+               info.error == QNetworkReply.ProtocolUnknownError:
+                url = QUrl(info.url)
+                res = E5MessageBox.yesNo(
+                    None,
+                    self.tr("Protocol Error"),
+                    self.tr("""Open external application for {0}-link?\n"""
+                            """URL: {1}""").format(
+                        url.scheme(), url.toString(
+                            QUrl.PrettyDecoded | QUrl.RemovePassword)),
+                    yesDefault=True)
+                
+                if res:
+                    QDesktopServices.openUrl(url)
+                return True
+            elif info.domain == QWebPage.QtNetwork and \
                info.error == QNetworkReply.ContentAccessDenied and \
                info.errorString.startswith("AdBlockRule:"):
                 if info.frame != info.frame.page().mainFrame():
@@ -617,6 +637,57 @@
             return super(HelpWebPage, self).event(fakeEvent)
         
         return super(HelpWebPage, self).event(evt)
+    
+    def __saveFrameStateRequested(self, frame, itm):
+        """
+        Private slot to save the page state (i.e. zoom level and scroll
+        position).
+        
+        Note: Code is based on qutebrowser.
+        
+        @param frame frame to be saved
+        @type QWebFrame
+        @param itm web history item to be saved
+        @type QWebHistoryItem
+        """
+        try:
+            if frame != self.mainFrame():
+                return
+        except RuntimeError:
+            # With Qt 5.2.1 (Ubuntu Trusty) we get this when closing a tab:
+            #     RuntimeError: wrapped C/C++ object of type BrowserPage has
+            #     been deleted
+            # Since the information here isn't that important for closing web
+            # views anyways, we ignore this error.
+            return
+        data = {
+            'zoom': frame.zoomFactor(),
+            'scrollPos': frame.scrollPosition(),
+        }
+        itm.setUserData(data)
+    
+    def __restoreFrameStateRequested(self, frame):
+        """
+        Private slot to restore scroll position and zoom level from
+        history.
+        
+        Note: Code is based on qutebrowser.
+        
+        @param frame frame to be restored
+        @type QWebFrame
+        """
+        if frame != self.mainFrame():
+            return
+        
+        data = self.history().currentItem().userData()
+        if data is None:
+            return
+        
+        if 'zoom' in data:
+            frame.page().view().setZoomValue(int(data['zoom'] * 100))
+        
+        if 'scrollPos' in data and frame.scrollPosition() == QPoint(0, 0):
+            frame.setScrollPosition(data['scrollPos'])
 
 ###############################################################################
 
@@ -729,6 +800,8 @@
         self.mw.personalInformationManager().connectPage(self.page())
         self.mw.greaseMonkeyManager().connectPage(self.page())
         
+        self.__inspector = None
+        
         self.grabGesture(Qt.PinchGesture)
     
     def __addExternalBinding(self, frame=None):
@@ -1633,7 +1706,25 @@
         """
         Private slot to show the web inspector window.
         """
-        self.triggerPageAction(QWebPage.InspectElement)
+        if self.__inspector is None:
+            from .HelpInspector import HelpInspector
+            self.__inspector = HelpInspector()
+            self.__inspector.setPage(self.page())
+            self.__inspector.show()
+        elif self.__inspector.isVisible():
+            self.__inspector.hide()
+        else:
+            self.__inspector.show()
+    
+    def closeWebInspector(self):
+        """
+        Public slot to close the web inspector.
+        """
+        if self.__inspector is not None:
+            if self.__inspector.isVisible():
+                self.__inspector.hide()
+            self.__inspector.deleteLater()
+            self.__inspector = None
     
     def addBookmark(self):
         """

eric ide

mercurial