WebBrowser/WebBrowserWindow.py

changeset 5779
b53fabc86f3c
parent 5777
2c4441d65ee3
child 5780
79d06c98c5c9
--- 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):

eric ide

mercurial