--- a/WebBrowser/WebBrowserWindow.py Fri Jun 30 19:48:32 2017 +0200 +++ b/WebBrowser/WebBrowserWindow.py Fri Jun 30 19:58:09 2017 +0200 @@ -109,6 +109,8 @@ _tabManager = None _sessionManager = None + _performingShutdown = False + def __init__(self, home, path, parent, name, fromEric=False, initShortcutsOnly=False, searchWord=None, private=False, qthelp=False, settingsDir=""): @@ -410,8 +412,6 @@ self.__virusTotal.fileScanReport.connect( self.__virusTotalFileScanReport) - self.__shutdownCalled = False - self.flashCookieManager() if WebBrowserWindow._useQtHelp: @@ -889,7 +889,7 @@ if self.__fromEric: self.exitAct.triggered.connect(self.close) else: - self.exitAct.triggered.connect(self.__closeAllWindows) + self.exitAct.triggered.connect(self.shutdown) self.__actions.append(self.exitAct) self.backAct = E5Action( @@ -2688,15 +2688,6 @@ """ self.__searchWidget.showFind() - def __closeAllWindows(self): - """ - Private slot to close all windows. - """ - for browser in WebBrowserWindow.BrowserWindows: - if browser != self: - browser.close() - self.close() - def closeEvent(self, e): """ Protected event handler for the close event. @@ -2705,62 +2696,30 @@ <br />This event is simply accepted after the history has been saved and all window references have been deleted. """ - if not self.__shutdownCalled: - res = self.shutdown() - - if res: - e.accept() - self.webBrowserWindowClosed.emit(self) - else: - e.ignore() + res = self.__shutdownWindow() + + if res: + e.accept() + self.webBrowserWindowClosed.emit(self) else: - e.accept() + e.ignore() - def shutdown(self): - """ - Public method to shut down the web browser. + def __shutdownWindow(self): + """ + Private method to shut down a web browser window. @return flag indicating successful shutdown (boolean) """ - if not self.__tabWidget.shallShutDown(): - return False - - if not self.downloadManager().allowQuit(): - return False - - self.downloadManager().shutdown() - - self.cookieJar().close() + if not WebBrowserWindow._performingShutdown: + if not self.__tabWidget.shallShutDown(): + return False self.__bookmarksToolBar.setModel(None) - self.bookmarksManager().close() - - self.historyManager().close() - - self.passwordManager().close() - - self.adBlockManager().close() - - self.userAgentsManager().close() - - self.speedDial().close() - - self.syncManager().close() - - ZoomManager.instance().close() - - WebIconProvider.instance().close() self.__virusTotal.close() - self.flashCookieManager().shutdown() - self.__navigationBar.searchEdit().openSearchManager().close() - if len(WebBrowserWindow.BrowserWindows) == 1: - # it is the last window - self.tabManager().close() - if WebBrowserWindow._useQtHelp: self.__searchEngine.cancelIndexing() self.__searchEngine.cancelSearching() @@ -2789,12 +2748,105 @@ except ValueError: pass - self.networkManager().shutdown() - if not self.__fromEric: Preferences.syncPreferences() - - self.__shutdownCalled = True + if not WebBrowserWindow._performingShutdown and \ + len(WebBrowserWindow.BrowserWindows) == 0: + # shut down the browser in case the last window was + # simply closed + self.shutdown() + + return True + + def __shallShutDown(self): + """ + Private method to check, if the application should be shut down. + + @return flag indicating a shut down + @rtype bool + """ + if Preferences.getWebBrowser("WarnOnMultipleClose"): + windowCount = len(WebBrowserWindow.BrowserWindows) + tabCount = 0 + for browser in WebBrowserWindow.BrowserWindows: + tabCount += browser.tabWidget().count() + + if windowCount > 1 or tabCount > 1: + mb = E5MessageBox.E5MessageBox( + E5MessageBox.Information, + self.tr("Are you sure you want to close the web browser?"), + self.tr("""Are you sure you want to close the web""" + """ browser?\n""" + """You have {0} windows with {1} tabs open.""") + .format(windowCount, tabCount), + modal=True, + parent=self) + if self.fromEric: + quitButton = mb.addButton( + self.tr("&Close"), E5MessageBox.AcceptRole) + quitButton.setIcon(UI.PixmapCache.getIcon("close.png")) + else: + quitButton = mb.addButton( + self.tr("&Quit"), E5MessageBox.AcceptRole) + quitButton.setIcon(UI.PixmapCache.getIcon("exit.png")) + mb.addButton(E5MessageBox.Cancel) + mb.exec_() + return mb.clickedButton() == quitButton + + return True + + def shutdown(self): + """ + Public method to shut down the web browser. + + @return flag indicating successful shutdown (boolean) + """ + if not self.__shallShutDown(): + return False + + if not self.downloadManager().allowQuit(): + return False + + WebBrowserWindow._performingShutdown = True + + self.sessionManager().shutdown() + + self.downloadManager().shutdown() + + self.cookieJar().close() + + self.bookmarksManager().close() + + self.historyManager().close() + + self.passwordManager().close() + + self.adBlockManager().close() + + self.userAgentsManager().close() + + self.speedDial().close() + + self.syncManager().close() + + ZoomManager.instance().close() + + WebIconProvider.instance().close() + + self.flashCookieManager().shutdown() + + if len(WebBrowserWindow.BrowserWindows) == 1: + # it is the last window + self.tabManager().close() + + self.networkManager().shutdown() + + + for browser in WebBrowserWindow.BrowserWindows: + if browser != self: + browser.close() + self.close() + return True def __backward(self):