--- 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