Continued implementing session support for the new web browser.

Wed, 05 Jul 2017 19:38:06 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 05 Jul 2017 19:38:06 +0200
changeset 5785
7c7c5f9e4fad
parent 5784
362bbcc49ac1
child 5786
6a1b25cff5fb

Continued implementing session support for the new web browser.

Preferences/ConfigurationPages/WebBrowserPage.py file | annotate | diff | comparison | revisions
Preferences/ConfigurationPages/WebBrowserPage.ui file | annotate | diff | comparison | revisions
Preferences/__init__.py file | annotate | diff | comparison | revisions
WebBrowser/Session/SessionManager.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserPage.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserTabBar.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserTabWidget.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserView.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserWindow.py file | annotate | diff | comparison | revisions
--- a/Preferences/ConfigurationPages/WebBrowserPage.py	Tue Jul 04 19:44:30 2017 +0200
+++ b/Preferences/ConfigurationPages/WebBrowserPage.py	Wed Jul 05 19:38:06 2017 +0200
@@ -96,6 +96,8 @@
             Preferences.getWebBrowser("NewTabBehavior"))
         self.homePageEdit.setText(
             Preferences.getWebBrowser("HomePage"))
+        self.loadTabOnActivationCheckBox.setChecked(
+            Preferences.getWebBrowser("LoadTabOnActivation"))
         
         self.saveSessionCheckBox.setChecked(
             Preferences.getWebBrowser("SessionAutoSave"))
@@ -255,6 +257,9 @@
         Preferences.setWebBrowser(
             "HomePage",
             self.homePageEdit.text())
+        Preferences.setWebBrowser(
+            "LoadTabOnActivation",
+            self.loadTabOnActivationCheckBox.isChecked())
         
         Preferences.setWebBrowser(
             "SessionAutoSave",
@@ -357,11 +362,16 @@
         
         @param index index of the selected entry (integer)
         """
+        # set state of the home page related items
         enable = index == 1
         self.homePageLabel.setEnabled(enable)
         self.homePageEdit.setEnabled(enable)
         self.defaultHomeButton.setEnabled(enable)
         self.setCurrentPageButton.setEnabled(enable)
+        
+        # set state of the session related items
+        self.loadTabOnActivationCheckBox.setEnabled(
+            index in [3, 4])
     
     @pyqtSlot()
     def on_refererWhitelistButton_clicked(self):
--- a/Preferences/ConfigurationPages/WebBrowserPage.ui	Tue Jul 04 19:44:30 2017 +0200
+++ b/Preferences/ConfigurationPages/WebBrowserPage.ui	Wed Jul 05 19:38:06 2017 +0200
@@ -251,6 +251,16 @@
         </property>
        </spacer>
       </item>
+      <item row="4" column="0" colspan="4">
+       <widget class="QCheckBox" name="loadTabOnActivationCheckBox">
+        <property name="toolTip">
+         <string>Select to load restored tabs when they are activated</string>
+        </property>
+        <property name="text">
+         <string>Load tabs when activated</string>
+        </property>
+       </widget>
+      </item>
      </layout>
      <zorder>label</zorder>
      <zorder>startupCombo</zorder>
@@ -260,6 +270,7 @@
      <zorder>defaultHomeButton</zorder>
      <zorder>label_12</zorder>
      <zorder>newTabCombo</zorder>
+     <zorder>loadTabOnActivationCheckBox</zorder>
     </widget>
    </item>
    <item>
@@ -925,6 +936,7 @@
   <tabstop>homePageEdit</tabstop>
   <tabstop>setCurrentPageButton</tabstop>
   <tabstop>defaultHomeButton</tabstop>
+  <tabstop>loadTabOnActivationCheckBox</tabstop>
   <tabstop>saveSessionCheckBox</tabstop>
   <tabstop>sessionTimerSpinBox</tabstop>
   <tabstop>defaultSchemeCombo</tabstop>
--- a/Preferences/__init__.py	Tue Jul 04 19:44:30 2017 +0200
+++ b/Preferences/__init__.py	Wed Jul 05 19:38:06 2017 +0200
@@ -1043,6 +1043,7 @@
         # 1     open home page
         # 2     open speed dial
         "HomePage": "eric:home",
+        "LoadTabOnActivation": True,
         "WarnOnMultipleClose": True,
         "DefaultScheme": "https://",
         "UserStyleSheet": "",
@@ -2907,7 +2908,7 @@
                  "PrintElementBackgrounds", "AllowRunningInsecureContent",
                  "SpellCheckEnabled", "ShowToolbars", "MenuBarVisible",
                  "BookmarksToolBarVisible", "StatusBarVisible",
-                 "SessionAutoSave",
+                 "SessionAutoSave", "LoadTabOnActivation",
                  ]:
         return toBool(prefClass.settings.value(
             "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
--- a/WebBrowser/Session/SessionManager.py	Tue Jul 04 19:44:30 2017 +0200
+++ b/WebBrowser/Session/SessionManager.py	Wed Jul 05 19:38:06 2017 +0200
@@ -204,7 +204,7 @@
             
             if window is activeWindow:
                 sessionData["CurrentWindowIndex"] = \
-                    len(sessionData["Windows"]) -1
+                    len(sessionData["Windows"]) - 1
         
         if sessionData["Windows"]:
             sessionFile = open(sessionFileName, "w")
--- a/WebBrowser/WebBrowserPage.py	Tue Jul 04 19:44:30 2017 +0200
+++ b/WebBrowser/WebBrowserPage.py	Wed Jul 05 19:38:06 2017 +0200
@@ -14,8 +14,7 @@
 except NameError:
     pass
 
-from PyQt5.QtCore import pyqtSlot, QUrl, QTimer, QEventLoop, QPoint, QPointF, \
-    QByteArray, QDataStream, QIODevice
+from PyQt5.QtCore import pyqtSlot, QUrl, QTimer, QEventLoop, QPoint, QPointF
 from PyQt5.QtGui import QDesktopServices
 from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineSettings, \
     QWebEngineScript
@@ -375,74 +374,6 @@
         self.view().mainWindow().javascriptConsole().javaScriptConsoleMessage(
             level, message, lineNumber, sourceId)
     
-    ####################################################
-    ## Methods below implement session related functions
-    ####################################################
-##    
-##    def getSessionData(self):
-##        """
-##        Public method to populate the session data.
-##        
-##        @return dictionary containing the session data
-##        @rtype dict
-##        """
-##        sessionData = {}
-##        
-##        # 1. zoom factor
-##        sessionData["ZoomFactor"] = self.zoomFactor()
-##        
-##        # 2. scroll position
-##        scrollPos = self.scrollPosition()
-##        sessionData["ScrollPosition"] = {
-##            "x": scrollPos.x(),
-##            "y": scrollPos.y(),
-##        }
-##        
-##        # 3. page history
-##        historyArray = QByteArray()
-##        stream = QDataStream(historyArray, QIODevice.WriteOnly)
-##        stream << self.history()
-##        sessionData["History"] = str(
-##            historyArray.toBase64(QByteArray.Base64UrlEncoding),
-##            encoding="ascii")
-##        sessionData["HistoryIndex"] = self.history().currentItemIndex()
-##        
-##        # 4. current URL
-##        sessionData["Url"] = self.url().toString(
-##            QUrl.PrettyDecoded | QUrl.RemovePassword)
-##        
-##        return sessionData
-##    
-##    def loadFromSessionData(self, sessionData):
-##        """
-##        Public method to load the session data.
-##        
-##        @param sessionData dictionary containing the session data as
-##            generated by getSessionData()
-##        @type dict
-##        """
-##        # 1. page history
-##        if "History" in sessionData:
-##            historyArray = QByteArray.fromBase64(
-##                sessionData["History"].encode("ascii"),
-##                QByteArray.Base64UrlEncoding)
-##            stream = QDataStream(historyArray, QIODevice.ReadOnly)
-##            stream >> self.history()
-##            
-##            if "HistoryIndex" in sessionData:
-##                item = self.history().itemAt(sessionData["HistoryIndex"])
-##                if item is not None:
-##                    self.history().goToItem(item)
-##        
-##        # 2. zoom factor
-##        if "ZoomFactor" in sessionData:
-##            self.setZoomFactor(sessionData["ZoomFactor"])
-##        
-##        # 3. scroll position
-##        if "ScrollPosition" in sessionData:
-##            scrollPos = sessionData["ScrollPosition"]
-##            self.scrollTo(QPointF(scrollPos["x"], scrollPos["y"]))
-    
     ##################################################
     ## Methods below implement compatibility functions
     ##################################################
--- a/WebBrowser/WebBrowserTabBar.py	Tue Jul 04 19:44:30 2017 +0200
+++ b/WebBrowser/WebBrowserTabBar.py	Wed Jul 05 19:38:06 2017 +0200
@@ -52,25 +52,27 @@
         if indexedBrowser.progress() != 0:
             return
         
-        w = self.tabSizeHint(self.__currentTabPreviewIndex).width()
-        h = int(w * currentBrowser.height() / currentBrowser.width())
-        
-        self.__previewPopup = E5PassivePopup(self)
-        self.__previewPopup.setFrameShape(QFrame.StyledPanel)
-        self.__previewPopup.setFrameShadow(QFrame.Plain)
-        self.__previewPopup.setFixedSize(w, h)
-        
-        label = QLabel()
-        label.setPixmap(indexedBrowser.getPreview().scaled(w, h))
-        
-        self.__previewPopup.setView(label)
-        self.__previewPopup.layout().setAlignment(Qt.AlignTop)
-        self.__previewPopup.layout().setContentsMargins(0, 0, 0, 0)
-        
-        tr = self.tabRect(self.__currentTabPreviewIndex)
-        pos = QPoint(tr.x(), tr.y() + tr.height())
-        
-        self.__previewPopup.show(self.mapToGlobal(pos))
+        preview = indexedBrowser.getPreview()
+        if not preview.isNull():
+            w = self.tabSizeHint(self.__currentTabPreviewIndex).width()
+            h = int(w * currentBrowser.height() / currentBrowser.width())
+            
+            self.__previewPopup = E5PassivePopup(self)
+            self.__previewPopup.setFrameShape(QFrame.StyledPanel)
+            self.__previewPopup.setFrameShadow(QFrame.Plain)
+            self.__previewPopup.setFixedSize(w, h)
+            
+            label = QLabel()
+            label.setPixmap(preview.scaled(w, h))
+            
+            self.__previewPopup.setView(label)
+            self.__previewPopup.layout().setAlignment(Qt.AlignTop)
+            self.__previewPopup.layout().setContentsMargins(0, 0, 0, 0)
+            
+            tr = self.tabRect(self.__currentTabPreviewIndex)
+            pos = QPoint(tr.x(), tr.y() + tr.height())
+            
+            self.__previewPopup.show(self.mapToGlobal(pos))
     
     def mouseMoveEvent(self, evt):
         """
--- a/WebBrowser/WebBrowserTabWidget.py	Tue Jul 04 19:44:30 2017 +0200
+++ b/WebBrowser/WebBrowserTabWidget.py	Wed Jul 05 19:38:06 2017 +0200
@@ -1233,11 +1233,17 @@
         
         # 1. load tab data
         if "Tabs" in sessionData:
-            loadTabOnActivate = True
+            loadTabOnActivate = \
+                Preferences.getWebBrowser("LoadTabOnActivation")
             for data in sessionData["Tabs"]:
-                browser = self.newBrowser(link="about:blank", restoreSession=True)
+                browser = self.newBrowser(restoreSession=True)
+                QApplication.processEvents()
                 if loadTabOnActivate:
                     browser.storeSessionData(data)
+                    title, urlStr, icon = browser.extractSessionMetaData(data)
+                    index = self.indexOf(browser)
+                    self.setTabText(index, title)
+                    self.setTabIcon(index, icon)
                 else:
                     browser.loadFromSessionData(data)
         
@@ -1245,4 +1251,4 @@
         if "CurrentTabIndex" in sessionData:
             index = tabCount + sessionData["CurrentTabIndex"]
             self.setCurrentIndex(index)
-            self.browserAt(index).show()
+            self.browserAt(index).activateSession()
--- a/WebBrowser/WebBrowserView.py	Tue Jul 04 19:44:30 2017 +0200
+++ b/WebBrowser/WebBrowserView.py	Wed Jul 05 19:38:06 2017 +0200
@@ -1904,17 +1904,38 @@
     
     def storeSessionData(self, data):
         """
+        Public method to store session data to be restored later on.
         
+        @param data dictionary with session data to be restored
+        @type dict
         """
         self.__restoreData = data
     
+    def __showEventSlot(self):
+        """
+        Private slot to perform actions when the view is shown and the event
+        loop is running.
+        """
+        if self.__restoreData:
+            self.loadFromSessionData(self.__restoreData)
+            self.__restoreData = None
+    
     def showEvent(self, evt):
         """
+        Protected method to handle show events.
         
+        @param evt reference to the show event object
+        @type QShowEvent
+        """
+        super(WebBrowserView, self).showEvent(evt)
+        self.activateSession()
+    
+    def activateSession(self):
+        """
+        Private slot to activate a restored session.
         """
         if self.__restoreData:
-            self.loadFromSessionData(self.__restoreData)
-        self.__restoreData = None
+            QTimer.singleShot(0, self.__showEventSlot)
     
     def getSessionData(self):
         """
@@ -1927,15 +1948,14 @@
             # page has not been shown yet
             return self.__restoreData
         
-        
         sessionData = {}
-##        page = self.page()
+        page = self.page()
         
         # 1. zoom factor
-        sessionData["ZoomFactor"] = self.__page.zoomFactor()
+        sessionData["ZoomFactor"] = page.zoomFactor()
         
         # 2. scroll position
-        scrollPos = self.__page.scrollPosition()
+        scrollPos = page.scrollPosition()
         sessionData["ScrollPosition"] = {
             "x": scrollPos.x(),
             "y": scrollPos.y(),
@@ -1944,11 +1964,11 @@
         # 3. page history
         historyArray = QByteArray()
         stream = QDataStream(historyArray, QIODevice.WriteOnly)
-        stream << self.__page.history()
+        stream << page.history()
         sessionData["History"] = str(
             historyArray.toBase64(QByteArray.Base64UrlEncoding),
             encoding="ascii")
-        sessionData["HistoryIndex"] = self.__page.history().currentItemIndex()
+        sessionData["HistoryIndex"] = page.history().currentItemIndex()
         
         # 4. current URL and title
         sessionData["Url"] = self.url().toString()
@@ -1957,7 +1977,7 @@
         # 5. web icon
         iconArray = QByteArray()
         stream = QDataStream(iconArray, QIODevice.WriteOnly)
-        stream << self.__page.icon()
+        stream << page.icon()
         sessionData["Icon"] = str(iconArray.toBase64(), encoding="ascii")
         
         return sessionData
@@ -1970,7 +1990,9 @@
             generated by getSessionData()
         @type dict
         """
-##        page = self.page()
+        page = self.page()
+        # blank the page
+        page.setUrl(QUrl("about:blank"))
         
         # 1. page history
         if "History" in sessionData:
@@ -1978,18 +2000,52 @@
                 sessionData["History"].encode("ascii"),
                 QByteArray.Base64UrlEncoding)
             stream = QDataStream(historyArray, QIODevice.ReadOnly)
-            stream >> self.__page.history()
+            stream >> page.history()
             
             if "HistoryIndex" in sessionData:
-                item = self.__page.history().itemAt(sessionData["HistoryIndex"])
+                item = page.history().itemAt(sessionData["HistoryIndex"])
                 if item is not None:
-                    self.__page.history().goToItem(item)
+                    page.history().goToItem(item)
         
         # 2. zoom factor
         if "ZoomFactor" in sessionData:
-            self.__page.setZoomFactor(sessionData["ZoomFactor"])
+            page.setZoomFactor(sessionData["ZoomFactor"])
         
         # 3. scroll position
         if "ScrollPosition" in sessionData:
             scrollPos = sessionData["ScrollPosition"]
-            self.__page.scrollTo(QPointF(scrollPos["x"], scrollPos["y"]))
+            page.scrollTo(QPointF(scrollPos["x"], scrollPos["y"]))
+    
+    def extractSessionMetaData(self, sessionData):
+        """
+        Public method to extract some session meta data elements needed by the
+        tab widget in case of deferred loading.
+        
+        @param sessionData dictionary containing the session data as
+            generated by getSessionData()
+        @type dict
+        @return tuple containing the title, URL and web icon
+        @rtype tuple of (str, str, QIcon)
+        """
+        if "Title" in sessionData:
+            title = sessionData["Title"]
+        else:
+            title = ""
+        
+        if "Url" in sessionData:
+            urlStr = sessionData["Url"]
+        else:
+            urlStr = ""
+        
+        if "Icon" in sessionData:
+            iconArray = QByteArray.fromBase64(
+                sessionData["Icon"].encode("ascii"))
+            stream = QDataStream(iconArray, QIODevice.ReadOnly)
+            icon = QIcon()
+            stream >> icon
+        else:
+            from .Tools import WebIconProvider
+            icon = WebIconProvider.instance().iconForUrl(
+                QUrl.fromUserInput(urlStr))
+        
+        return title, urlStr, icon
--- a/WebBrowser/WebBrowserWindow.py	Tue Jul 04 19:44:30 2017 +0200
+++ b/WebBrowser/WebBrowserWindow.py	Wed Jul 05 19:38:06 2017 +0200
@@ -2934,7 +2934,6 @@
         
         self.networkManager().shutdown()
         
-        
         for browser in WebBrowserWindow.BrowserWindows:
             if browser != self:
                 browser.close()

eric ide

mercurial