Wed, 05 Jul 2017 19:38:06 +0200
Continued implementing session support for the new web browser.
--- 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