WebBrowser/WebBrowserWindow.py

branch
maintenance
changeset 6646
51eefa621de4
parent 6645
ad476851d7e0
child 6657
c6a93bbd66a5
diff -r 77189681b787 -r 51eefa621de4 WebBrowser/WebBrowserWindow.py
--- a/WebBrowser/WebBrowserWindow.py	Sat Dec 01 11:45:24 2018 +0100
+++ b/WebBrowser/WebBrowserWindow.py	Thu Jan 10 14:22:59 2019 +0100
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Copyright (c) 2002 - 2018 Detlev Offenbach <detlev@die-offenbachs.de>
+# Copyright (c) 2002 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
 #
 
 """
@@ -18,7 +18,7 @@
 import sys
 
 from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QByteArray, QSize, QTimer, \
-    QUrl, QTextCodec, QProcess, QEvent
+    QUrl, QTextCodec, QProcess, QEvent, QFileInfo
 from PyQt5.QtGui import QDesktopServices, QKeySequence, QFont, QFontMetrics
 from PyQt5.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QDockWidget, \
     QComboBox, QLabel, QMenu, QLineEdit, QApplication, \
@@ -59,6 +59,8 @@
 
 from .ZoomManager import ZoomManager
 
+from .WebBrowserSingleApplication import WebBrowserSingleApplicationServer
+
 from eric6config import getConfig
 
 
@@ -82,7 +84,6 @@
     
     BrowserWindows = []
 
-    _fromEric = False
     _useQtHelp = QTHELP_AVAILABLE
     _isPrivate = False
     
@@ -114,10 +115,9 @@
     _performingShutdown = False
     _lastActiveWindow = None
     
-    def __init__(self, home, path, parent, name, fromEric=False,
-                 initShortcutsOnly=False, searchWord=None,
-                 private=False, qthelp=False, settingsDir="",
-                 restoreSession=False):
+    def __init__(self, home, path, parent, name,
+                 searchWord=None, private=False, qthelp=False, settingsDir="",
+                 restoreSession=False, single=False, saname=""):
         """
         Constructor
         
@@ -129,22 +129,20 @@
         @type QWidget
         @param name name of this window
         @type str
-        @param fromEric flag indicating whether it was called from within
-            eric6
-        @type bool
-        @keyparam initShortcutsOnly flag indicating to just initialize the
-            keyboard shortcuts
-        @type bool
-        @keyparam searchWord word to search for
+        @param searchWord word to search for
         @type str
-        @keyparam private flag indicating a private browsing window
+        @param private flag indicating a private browsing window
         @type bool
-        @keyparam qthelp flag indicating to enable the QtHelp support
+        @param qthelp flag indicating to enable the QtHelp support
         @type bool
-        @keyparam settingsDir directory to be used for the settings files
+        @param settingsDir directory to be used for the settings files
         @type str
-        @keyparam restoreSession flag indicating a restore session action
+        @param restoreSession flag indicating a restore session action
         @type bool
+        @param single flag indicating to start in single application mode
+        @type bool
+        @param saname name to be used for the single application server
+        @type str
         """
         self.__hideNavigationTimer = None
         
@@ -156,9 +154,6 @@
             self.setWindowTitle(self.tr("eric6 Web Browser"))
         
         self.__settingsDir = settingsDir
-        self.__fromEric = fromEric
-        WebBrowserWindow._fromEric = fromEric
-        self.__initShortcutsOnly = initShortcutsOnly
         self.setWindowIcon(UI.PixmapCache.getIcon("ericWeb.png"))
 
         self.__mHistory = []
@@ -166,324 +161,330 @@
         
         WebBrowserWindow._isPrivate = private
         
+        self.__shortcutsDialog = None
+        
         self.__eventMouseButtons = Qt.NoButton
         self.__eventKeyboardModifiers = Qt.NoModifier
         
-        if self.__initShortcutsOnly:
-            WebBrowserWindow.setUseQtHelp(
-                self.__fromEric or qthelp or bool(searchWord))
-            self.__initActions()
+        if qVersionTuple() < (5, 11, 0) and \
+           Preferences.getWebBrowser("WebInspectorEnabled"):
+            os.environ["QTWEBENGINE_REMOTE_DEBUGGING"] = \
+                str(Preferences.getWebBrowser("WebInspectorPort"))
+        
+        WebBrowserWindow.setUseQtHelp(qthelp or bool(searchWord))
+        
+        self.webProfile(private)
+        self.networkManager()
+        
+        self.__htmlFullScreen = False
+        self.__windowStates = Qt.WindowNoState
+        self.__isClosing = False
+        
+        from .SearchWidget import SearchWidget
+        from .QtHelp.HelpTocWidget import HelpTocWidget
+        from .QtHelp.HelpIndexWidget import HelpIndexWidget
+        from .QtHelp.HelpSearchWidget import HelpSearchWidget
+        from .WebBrowserView import WebBrowserView
+        from .WebBrowserTabWidget import WebBrowserTabWidget
+        from .AdBlock.AdBlockIcon import AdBlockIcon
+        from .StatusBar.JavaScriptIcon import JavaScriptIcon
+        from .StatusBar.ImagesIcon import ImagesIcon
+        from .VirusTotal.VirusTotalApi import VirusTotalAPI
+        from .Navigation.NavigationBar import NavigationBar
+        from .Navigation.NavigationContainer import NavigationContainer
+        from .Bookmarks.BookmarksToolBar import BookmarksToolBar
+        
+        self.setStyle(Preferences.getUI("Style"),
+                      Preferences.getUI("StyleSheet"))
+        
+        # initialize some SSL stuff
+        from E5Network.E5SslUtilities import initSSL
+        initSSL()
+        
+        if WebBrowserWindow._useQtHelp:
+            self.__helpEngine = QHelpEngine(
+                WebBrowserWindow.getQtHelpCollectionFileName(),
+                self)
+            self.__removeOldDocumentation()
+            self.__helpEngine.warning.connect(self.__warning)
         else:
-            if qVersionTuple() < (5, 11, 0) and \
-               Preferences.getWebBrowser("WebInspectorEnabled"):
-                os.environ["QTWEBENGINE_REMOTE_DEBUGGING"] = \
-                    str(Preferences.getWebBrowser("WebInspectorPort"))
-            
-            WebBrowserWindow.setUseQtHelp(
-                self.__fromEric or qthelp or bool(searchWord))
-            
-            self.webProfile(private)
-            self.networkManager()
-            
-            self.__htmlFullScreen = False
-            self.__windowStates = Qt.WindowNoState
-            self.__isClosing = False
-            
-            from .SearchWidget import SearchWidget
-            from .QtHelp.HelpTocWidget import HelpTocWidget
-            from .QtHelp.HelpIndexWidget import HelpIndexWidget
-            from .QtHelp.HelpSearchWidget import HelpSearchWidget
-            from .WebBrowserView import WebBrowserView
-            from .WebBrowserTabWidget import WebBrowserTabWidget
-            from .AdBlock.AdBlockIcon import AdBlockIcon
-            from .StatusBar.JavaScriptIcon import JavaScriptIcon
-            from .StatusBar.ImagesIcon import ImagesIcon
-            from .VirusTotal.VirusTotalApi import VirusTotalAPI
-            from .Navigation.NavigationBar import NavigationBar
-            from .Navigation.NavigationContainer import NavigationContainer
-            from .Bookmarks.BookmarksToolBar import BookmarksToolBar
-            
-            if not self.__fromEric:
-                self.setStyle(Preferences.getUI("Style"),
-                              Preferences.getUI("StyleSheet"))
-                
-                # initialize some SSL stuff
-                from E5Network.E5SslUtilities import initSSL
-                initSSL()
-            
-            if WebBrowserWindow._useQtHelp:
-                self.__helpEngine = QHelpEngine(
-                    WebBrowserWindow.getQtHelpCollectionFileName(),
-                    self)
-                self.__removeOldDocumentation()
-                self.__helpEngine.warning.connect(self.__warning)
-            else:
-                self.__helpEngine = None
-            self.__helpInstaller = None
-            
-            self.__zoomWidget = E5ZoomWidget(
-                UI.PixmapCache.getPixmap("zoomOut.png"),
-                UI.PixmapCache.getPixmap("zoomIn.png"),
-                UI.PixmapCache.getPixmap("zoomReset.png"), self)
-            self.statusBar().addPermanentWidget(self.__zoomWidget)
-            self.__zoomWidget.setMapping(
-                WebBrowserView.ZoomLevels, WebBrowserView.ZoomLevelDefault)
-            self.__zoomWidget.valueChanged.connect(self.__zoomValueChanged)
-            
-            self.__tabWidget = WebBrowserTabWidget(self)
-            self.__tabWidget.currentChanged[int].connect(self.__currentChanged)
-            self.__tabWidget.titleChanged.connect(self.__titleChanged)
-            self.__tabWidget.showMessage.connect(self.statusBar().showMessage)
-            self.__tabWidget.browserZoomValueChanged.connect(
-                self.__zoomWidget.setValue)
-            self.__tabWidget.browserClosed.connect(self.webBrowserClosed)
-            self.__tabWidget.browserOpened.connect(self.webBrowserOpened)
-            
-            self.__searchWidget = SearchWidget(self, self)
-            
-            self.__setIconDatabasePath()
+            self.__helpEngine = None
+        self.__helpInstaller = None
+        
+        self.__zoomWidget = E5ZoomWidget(
+            UI.PixmapCache.getPixmap("zoomOut.png"),
+            UI.PixmapCache.getPixmap("zoomIn.png"),
+            UI.PixmapCache.getPixmap("zoomReset.png"), self)
+        self.statusBar().addPermanentWidget(self.__zoomWidget)
+        self.__zoomWidget.setMapping(
+            WebBrowserView.ZoomLevels, WebBrowserView.ZoomLevelDefault)
+        self.__zoomWidget.valueChanged.connect(self.__zoomValueChanged)
+        
+        self.__tabWidget = WebBrowserTabWidget(self)
+        self.__tabWidget.currentChanged[int].connect(self.__currentChanged)
+        self.__tabWidget.titleChanged.connect(self.__titleChanged)
+        self.__tabWidget.showMessage.connect(self.statusBar().showMessage)
+        self.__tabWidget.browserZoomValueChanged.connect(
+            self.__zoomWidget.setValue)
+        self.__tabWidget.browserClosed.connect(self.webBrowserClosed)
+        self.__tabWidget.browserOpened.connect(self.webBrowserOpened)
+        
+        self.__searchWidget = SearchWidget(self, self)
+        
+        self.__setIconDatabasePath()
+        
+        bookmarksModel = self.bookmarksManager().bookmarksModel()
+        self.__bookmarksToolBar = BookmarksToolBar(self, bookmarksModel,
+                                                   self)
+        self.__bookmarksToolBar.setIconSize(UI.Config.ToolBarIconSize)
+        self.__bookmarksToolBar.openUrl.connect(self.openUrl)
+        self.__bookmarksToolBar.newTab.connect(self.openUrlNewTab)
+        self.__bookmarksToolBar.newWindow.connect(self.openUrlNewWindow)
+        
+        self.__navigationBar = NavigationBar(self)
+        
+        self.__navigationContainer = NavigationContainer(self)
+        self.__navigationContainer.addWidget(self.__navigationBar)
+        self.__navigationContainer.addWidget(self.__bookmarksToolBar)
+        
+        centralWidget = QWidget()
+        layout = QVBoxLayout()
+        layout.setContentsMargins(1, 1, 1, 1)
+        layout.setSpacing(0)
+        layout.addWidget(self.__navigationContainer)
+        layout.addWidget(self.__tabWidget)
+        layout.addWidget(self.__searchWidget)
+        self.__tabWidget.setSizePolicy(
+            QSizePolicy.Preferred, QSizePolicy.Expanding)
+        centralWidget.setLayout(layout)
+        self.setCentralWidget(centralWidget)
+        self.__searchWidget.hide()
+        
+        if WebBrowserWindow._useQtHelp:
+            # setup the TOC widget
+            self.__tocWindow = HelpTocWidget(self.__helpEngine)
+            self.__tocDock = QDockWidget(self.tr("Contents"), self)
+            self.__tocDock.setObjectName("TocWindow")
+            self.__tocDock.setWidget(self.__tocWindow)
+            self.addDockWidget(Qt.LeftDockWidgetArea, self.__tocDock)
             
-            bookmarksModel = self.bookmarksManager().bookmarksModel()
-            self.__bookmarksToolBar = BookmarksToolBar(self, bookmarksModel,
-                                                       self)
-            self.__bookmarksToolBar.setIconSize(UI.Config.ToolBarIconSize)
-            self.__bookmarksToolBar.openUrl.connect(self.openUrl)
-            self.__bookmarksToolBar.newTab.connect(self.openUrlNewTab)
-            self.__bookmarksToolBar.newWindow.connect(self.openUrlNewWindow)
-            
-            self.__navigationBar = NavigationBar(self)
-            
-            self.__navigationContainer = NavigationContainer(self)
-            self.__navigationContainer.addWidget(self.__navigationBar)
-            self.__navigationContainer.addWidget(self.__bookmarksToolBar)
-            
-            centralWidget = QWidget()
-            layout = QVBoxLayout()
-            layout.setContentsMargins(1, 1, 1, 1)
-            layout.setSpacing(0)
-            layout.addWidget(self.__navigationContainer)
-            layout.addWidget(self.__tabWidget)
-            layout.addWidget(self.__searchWidget)
-            self.__tabWidget.setSizePolicy(
-                QSizePolicy.Preferred, QSizePolicy.Expanding)
-            centralWidget.setLayout(layout)
-            self.setCentralWidget(centralWidget)
-            self.__searchWidget.hide()
-            
-            if WebBrowserWindow._useQtHelp:
-                # setup the TOC widget
-                self.__tocWindow = HelpTocWidget(self.__helpEngine)
-                self.__tocDock = QDockWidget(self.tr("Contents"), self)
-                self.__tocDock.setObjectName("TocWindow")
-                self.__tocDock.setWidget(self.__tocWindow)
-                self.addDockWidget(Qt.LeftDockWidgetArea, self.__tocDock)
-                
-                # setup the index widget
-                self.__indexWindow = HelpIndexWidget(self.__helpEngine)
-                self.__indexDock = QDockWidget(self.tr("Index"), self)
-                self.__indexDock.setObjectName("IndexWindow")
-                self.__indexDock.setWidget(self.__indexWindow)
-                self.addDockWidget(Qt.LeftDockWidgetArea, self.__indexDock)
-                
-                # setup the search widget
-                self.__searchWord = searchWord
-                self.__indexing = False
-                self.__indexingProgress = None
-                self.__searchEngine = self.__helpEngine.searchEngine()
-                self.__searchEngine.indexingStarted.connect(
-                    self.__indexingStarted)
-                self.__searchEngine.indexingFinished.connect(
-                    self.__indexingFinished)
-                self.__searchWindow = HelpSearchWidget(self.__searchEngine)
-                self.__searchDock = QDockWidget(self.tr("Search"), self)
-                self.__searchDock.setObjectName("SearchWindow")
-                self.__searchDock.setWidget(self.__searchWindow)
-                self.addDockWidget(Qt.LeftDockWidgetArea, self.__searchDock)
-            
-            # JavaScript Console window
-            from .WebBrowserJavaScriptConsole import \
-                WebBrowserJavaScriptConsole
-            self.__javascriptConsole = WebBrowserJavaScriptConsole(self)
-            self.__javascriptConsoleDock = QDockWidget(
-                self.tr("JavaScript Console"))
-            self.__javascriptConsoleDock.setObjectName("JavascriptConsole")
-            self.__javascriptConsoleDock.setAllowedAreas(
-                Qt.BottomDockWidgetArea | Qt.TopDockWidgetArea)
-            self.__javascriptConsoleDock.setWidget(self.__javascriptConsole)
-            self.addDockWidget(Qt.BottomDockWidgetArea,
-                               self.__javascriptConsoleDock)
-            
-            if Preferences.getWebBrowser("SaveGeometry"):
-                g = Preferences.getGeometry("WebBrowserGeometry")
-            else:
-                g = QByteArray()
-            if g.isEmpty():
-                s = QSize(800, 800)
-                self.resize(s)
-            else:
-                self.restoreGeometry(g)
-            
-            WebBrowserWindow.BrowserWindows.append(self)
-            
-            self.__initWebEngineSettings()
+            # setup the index widget
+            self.__indexWindow = HelpIndexWidget(self.__helpEngine)
+            self.__indexDock = QDockWidget(self.tr("Index"), self)
+            self.__indexDock.setObjectName("IndexWindow")
+            self.__indexDock.setWidget(self.__indexWindow)
+            self.addDockWidget(Qt.LeftDockWidgetArea, self.__indexDock)
             
-            # initialize some of our class objects
-            self.passwordManager()
-            self.historyManager()
-            self.greaseMonkeyManager()
-            
-            # initialize the actions
-            self.__initActions()
-            
-            # initialize the menus
-            self.__initMenus()
-            self.__initSuperMenu()
-            if Preferences.getWebBrowser("MenuBarVisible"):
-                self.__navigationBar.superMenuButton().hide()
+            # setup the search widget
+            self.__searchWord = searchWord
+            self.__indexing = False
+            self.__indexingProgress = None
+            self.__searchEngine = self.__helpEngine.searchEngine()
+            self.__searchEngine.indexingStarted.connect(
+                self.__indexingStarted)
+            self.__searchEngine.indexingFinished.connect(
+                self.__indexingFinished)
+            self.__searchWindow = HelpSearchWidget(self.__searchEngine)
+            self.__searchDock = QDockWidget(self.tr("Search"), self)
+            self.__searchDock.setObjectName("SearchWindow")
+            self.__searchDock.setWidget(self.__searchWindow)
+            self.addDockWidget(Qt.LeftDockWidgetArea, self.__searchDock)
+        
+        # JavaScript Console window
+        from .WebBrowserJavaScriptConsole import \
+            WebBrowserJavaScriptConsole
+        self.__javascriptConsole = WebBrowserJavaScriptConsole(self)
+        self.__javascriptConsoleDock = QDockWidget(
+            self.tr("JavaScript Console"))
+        self.__javascriptConsoleDock.setObjectName("JavascriptConsole")
+        self.__javascriptConsoleDock.setAllowedAreas(
+            Qt.BottomDockWidgetArea | Qt.TopDockWidgetArea)
+        self.__javascriptConsoleDock.setWidget(self.__javascriptConsole)
+        self.addDockWidget(Qt.BottomDockWidgetArea,
+                           self.__javascriptConsoleDock)
+        
+        if Preferences.getWebBrowser("SaveGeometry"):
+            g = Preferences.getGeometry("WebBrowserGeometry")
+        else:
+            g = QByteArray()
+        if g.isEmpty():
+            s = QSize(800, 800)
+            self.resize(s)
+        else:
+            self.restoreGeometry(g)
+        
+        WebBrowserWindow.BrowserWindows.append(self)
+        
+        self.__initWebEngineSettings()
+        
+        # initialize some of our class objects
+        self.passwordManager()
+        self.historyManager()
+        self.greaseMonkeyManager()
+        
+        # initialize the actions
+        self.__initActions()
+        
+        # initialize the menus
+        self.__initMenus()
+        self.__initSuperMenu()
+        if Preferences.getWebBrowser("MenuBarVisible"):
+            self.__navigationBar.superMenuButton().hide()
+        else:
+            self.menuBar().hide()
+        
+        # save references to toolbars in order to hide them
+        # when going full screen
+        self.__toolbars = {}
+        # initialize toolbars
+        if Preferences.getWebBrowser("ShowToolbars"):
+            self.__initToolbars()
+        self.__bookmarksToolBar.setVisible(
+            Preferences.getWebBrowser("BookmarksToolBarVisible"))
+        
+        syncMgr = self.syncManager()
+        syncMgr.syncMessage.connect(self.statusBar().showMessage)
+        syncMgr.syncError.connect(self.statusBar().showMessage)
+        
+        restoreSessionData = {}
+        if WebBrowserWindow._performingStartup and not home and \
+                not WebBrowserWindow.isPrivate():
+            startupBehavior = Preferences.getWebBrowser("StartupBehavior")
+            if not private and startupBehavior in [3, 4]:
+                if startupBehavior == 3:
+                    # restore last session
+                    restoreSessionFile = \
+                        self.sessionManager().lastActiveSessionFile()
+                elif startupBehavior == 4:
+                    # select session
+                    restoreSessionFile = \
+                        self.sessionManager().selectSession()
+                sessionData = \
+                    self.sessionManager().readSessionFromFile(
+                        restoreSessionFile)
+                if self.sessionManager().isValidSession(sessionData):
+                    restoreSessionData = sessionData
+                    restoreSession = True
             else:
-                self.menuBar().hide()
-            
-            # save references to toolbars in order to hide them
-            # when going full screen
-            self.__toolbars = {}
-            # initialize toolbars
-            if Preferences.getWebBrowser("ShowToolbars"):
-                self.__initToolbars()
-            self.__bookmarksToolBar.setVisible(
-                Preferences.getWebBrowser("BookmarksToolBarVisible"))
-            
-            syncMgr = self.syncManager()
-            syncMgr.syncMessage.connect(self.statusBar().showMessage)
-            syncMgr.syncError.connect(self.statusBar().showMessage)
-            
-            restoreSessionData = {}
-            if WebBrowserWindow._performingStartup and not home:
-                startupBehavior = Preferences.getWebBrowser("StartupBehavior")
-                if not private and startupBehavior in [3, 4]:
-                    if startupBehavior == 3:
-                        # restore last session
-                        restoreSessionFile = \
-                            self.sessionManager().lastActiveSessionFile()
-                    elif startupBehavior == 4:
-                        # select session
-                        restoreSessionFile = \
-                            self.sessionManager().selectSession()
-                    sessionData = \
-                        self.sessionManager().readSessionFromFile(
-                            restoreSessionFile)
-                    if self.sessionManager().isValidSession(sessionData):
-                        restoreSessionData = sessionData
-                        restoreSession = True
-                else:
-                    if Preferences.getWebBrowser("StartupBehavior") == 0:
-                        home = "about:blank"
-                    elif Preferences.getWebBrowser("StartupBehavior") == 1:
-                        home = Preferences.getWebBrowser("HomePage")
-                    elif Preferences.getWebBrowser("StartupBehavior") == 2:
-                        home = "eric:speeddial"
-            
-            if not restoreSession:
-                self.__tabWidget.newBrowser(home)
-                self.__tabWidget.currentBrowser().setFocus()
-            WebBrowserWindow._performingStartup = False
-            
-            self.__imagesIcon = ImagesIcon(self)
-            self.statusBar().addPermanentWidget(self.__imagesIcon)
-            self.__javaScriptIcon = JavaScriptIcon(self)
-            self.statusBar().addPermanentWidget(self.__javaScriptIcon)
-            
-            self.__adBlockIcon = AdBlockIcon(self)
-            self.statusBar().addPermanentWidget(self.__adBlockIcon)
-            self.__adBlockIcon.setEnabled(
-                Preferences.getWebBrowser("AdBlockEnabled"))
-            self.__tabWidget.currentChanged[int].connect(
-                self.__adBlockIcon.currentChanged)
-            self.__tabWidget.sourceChanged.connect(
-                self.__adBlockIcon.sourceChanged)
-            
-            self.__tabManagerIcon = self.tabManager().createStatusBarIcon()
-            self.statusBar().addPermanentWidget(self.__tabManagerIcon)
+                if Preferences.getWebBrowser("StartupBehavior") == 0:
+                    home = "about:blank"
+                elif Preferences.getWebBrowser("StartupBehavior") == 1:
+                    home = Preferences.getWebBrowser("HomePage")
+                elif Preferences.getWebBrowser("StartupBehavior") == 2:
+                    home = "eric:speeddial"
+        
+        if not restoreSession:
+            self.__tabWidget.newBrowser(QUrl.fromUserInput(home))
+            self.__tabWidget.currentBrowser().setFocus()
+        WebBrowserWindow._performingStartup = False
+        
+        self.__imagesIcon = ImagesIcon(self)
+        self.statusBar().addPermanentWidget(self.__imagesIcon)
+        self.__javaScriptIcon = JavaScriptIcon(self)
+        self.statusBar().addPermanentWidget(self.__javaScriptIcon)
+        
+        self.__adBlockIcon = AdBlockIcon(self)
+        self.statusBar().addPermanentWidget(self.__adBlockIcon)
+        self.__adBlockIcon.setEnabled(
+            Preferences.getWebBrowser("AdBlockEnabled"))
+        self.__tabWidget.currentChanged[int].connect(
+            self.__adBlockIcon.currentChanged)
+        self.__tabWidget.sourceChanged.connect(
+            self.__adBlockIcon.sourceChanged)
+        
+        self.__tabManagerIcon = self.tabManager().createStatusBarIcon()
+        self.statusBar().addPermanentWidget(self.__tabManagerIcon)
+        
+        self.networkIcon = E5NetworkIcon(self)
+        self.statusBar().addPermanentWidget(self.networkIcon)
+        
+        if not Preferences.getWebBrowser("StatusBarVisible"):
+            self.statusBar().hide()
+        
+        if len(WebBrowserWindow.BrowserWindows):
+            QDesktopServices.setUrlHandler(
+                "http", WebBrowserWindow.BrowserWindows[0].urlHandler)
+            QDesktopServices.setUrlHandler(
+                "https", WebBrowserWindow.BrowserWindows[0].urlHandler)
+        
+        # setup connections
+        self.__activating = False
+        if WebBrowserWindow._useQtHelp:
+            # TOC window
+            self.__tocWindow.escapePressed.connect(
+                self.__activateCurrentBrowser)
+            self.__tocWindow.openUrl.connect(self.openUrl)
+            self.__tocWindow.newTab.connect(self.openUrlNewTab)
+            self.__tocWindow.newBackgroundTab.connect(
+                self.openUrlNewBackgroundTab)
+            self.__tocWindow.newWindow.connect(self.openUrlNewWindow)
             
-            self.networkIcon = E5NetworkIcon(self)
-            self.statusBar().addPermanentWidget(self.networkIcon)
-            
-            if not Preferences.getWebBrowser("StatusBarVisible"):
-                self.statusBar().hide()
-            
-            if not self.__fromEric and len(WebBrowserWindow.BrowserWindows):
-                QDesktopServices.setUrlHandler(
-                    "http", WebBrowserWindow.BrowserWindows[0].urlHandler)
-                QDesktopServices.setUrlHandler(
-                    "https", WebBrowserWindow.BrowserWindows[0].urlHandler)
+            # index window
+            self.__indexWindow.escapePressed.connect(
+                self.__activateCurrentBrowser)
+            self.__indexWindow.openUrl.connect(self.openUrl)
+            self.__indexWindow.newTab.connect(self.openUrlNewTab)
+            self.__indexWindow.newBackgroundTab.connect(
+                self.openUrlNewBackgroundTab)
+            self.__indexWindow.newWindow.connect(self.openUrlNewWindow)
             
-            # setup connections
-            self.__activating = False
-            if WebBrowserWindow._useQtHelp:
-                # TOC window
-                self.__tocWindow.escapePressed.connect(
-                    self.__activateCurrentBrowser)
-                self.__tocWindow.openUrl.connect(self.openUrl)
-                self.__tocWindow.newTab.connect(self.openUrlNewTab)
-                self.__tocWindow.newBackgroundTab.connect(
-                    self.openUrlNewBackgroundTab)
-                self.__tocWindow.newWindow.connect(self.openUrlNewWindow)
-                
-                # index window
-                self.__indexWindow.escapePressed.connect(
-                    self.__activateCurrentBrowser)
-                self.__indexWindow.openUrl.connect(self.openUrl)
-                self.__indexWindow.newTab.connect(self.openUrlNewTab)
-                self.__indexWindow.newBackgroundTab.connect(
-                    self.openUrlNewBackgroundTab)
-                self.__indexWindow.newWindow.connect(self.openUrlNewWindow)
-                
-                # search window
-                self.__searchWindow.escapePressed.connect(
-                    self.__activateCurrentBrowser)
-                self.__searchWindow.openUrl.connect(self.openUrl)
-                self.__searchWindow.newTab.connect(self.openUrlNewTab)
-                self.__searchWindow.newBackgroundTab.connect(
-                    self.openUrlNewBackgroundTab)
-                self.__searchWindow.newWindow.connect(self.openUrlNewWindow)
-            
-            state = Preferences.getWebBrowser("WebBrowserState")
-            self.restoreState(state)
-            
-            self.__initHelpDb()
-            
-            self.__virusTotal = VirusTotalAPI(self)
-            self.__virusTotal.submitUrlError.connect(
-                self.__virusTotalSubmitUrlError)
-            self.__virusTotal.urlScanReport.connect(
-                self.__virusTotalUrlScanReport)
-            self.__virusTotal.fileScanReport.connect(
-                self.__virusTotalFileScanReport)
-            
-            self.flashCookieManager()
-            
-            e5App().focusChanged.connect(self.__appFocusChanged)
-            
-            self.__toolbarStates = self.saveState()
-            
-            self.__hideNavigationTimer = QTimer(self)
-            self.__hideNavigationTimer.setInterval(1000)
-            self.__hideNavigationTimer.setSingleShot(True)
-            self.__hideNavigationTimer.timeout.connect(self.__hideNavigation)
-            
-            self.__forcedClose = False
-            
-            if restoreSessionData:
-                self.sessionManager().restoreSessionFromData(
-                    self, restoreSessionData)
-            
+            # search window
+            self.__searchWindow.escapePressed.connect(
+                self.__activateCurrentBrowser)
+            self.__searchWindow.openUrl.connect(self.openUrl)
+            self.__searchWindow.newTab.connect(self.openUrlNewTab)
+            self.__searchWindow.newBackgroundTab.connect(
+                self.openUrlNewBackgroundTab)
+            self.__searchWindow.newWindow.connect(self.openUrlNewWindow)
+        
+        state = Preferences.getWebBrowser("WebBrowserState")
+        self.restoreState(state)
+        
+        self.__initHelpDb()
+        
+        self.__virusTotal = VirusTotalAPI(self)
+        self.__virusTotal.submitUrlError.connect(
+            self.__virusTotalSubmitUrlError)
+        self.__virusTotal.urlScanReport.connect(
+            self.__virusTotalUrlScanReport)
+        self.__virusTotal.fileScanReport.connect(
+            self.__virusTotalFileScanReport)
+        
+        self.flashCookieManager()
+        
+        e5App().focusChanged.connect(self.__appFocusChanged)
+        
+        self.__toolbarStates = self.saveState()
+        
+        if single:
+            self.SAServer = WebBrowserSingleApplicationServer(saname)
+            self.SAServer.loadUrl.connect(self.__saLoadUrl)
+            self.SAServer.newTab.connect(self.__saNewTab)
+            self.SAServer.search.connect(self.__saSearchWord)
+            self.SAServer.shutdown.connect(self.shutdown)
+        else:
+            self.SAServer = None
+        
+        self.__hideNavigationTimer = QTimer(self)
+        self.__hideNavigationTimer.setInterval(1000)
+        self.__hideNavigationTimer.setSingleShot(True)
+        self.__hideNavigationTimer.timeout.connect(self.__hideNavigation)
+        
+        self.__forcedClose = False
+        
+        if restoreSessionData and not WebBrowserWindow.isPrivate():
+            self.sessionManager().restoreSessionFromData(
+                self, restoreSessionData)
+        
+        if not WebBrowserWindow.isPrivate():
             self.sessionManager().activateTimer()
-            
-            QTimer.singleShot(0, syncMgr.loadSettings)
-            
-            if WebBrowserWindow._useQtHelp:
-                QTimer.singleShot(50, self.__lookForNewDocumentation)
-                if self.__searchWord is not None:
-                    QTimer.singleShot(0, self.__searchForWord)
+        
+        QTimer.singleShot(0, syncMgr.loadSettings)
+        
+        if WebBrowserWindow._useQtHelp:
+            QTimer.singleShot(50, self.__lookForNewDocumentation)
+            if self.__searchWord is not None:
+                QTimer.singleShot(0, self.__searchForWord)
     
     def __del__(self):
         """
@@ -504,16 +505,6 @@
         """
         return self.__tabWidget
     
-    def fromEric(self):
-        """
-        Public method to check, if the web browser was called from within the
-        eric IDE.
-        
-        @return flag indicating that the browserw as opened from within eric
-        @rtype bool
-        """
-        return self.__fromEric
-    
     def __setIconDatabasePath(self, enable=True):
         """
         Private method to set the favicons path.
@@ -703,8 +694,7 @@
             """<b>New Tab</b>"""
             """<p>This opens a new web browser tab.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.newTabAct.triggered.connect(self.newTab)
+        self.newTabAct.triggered.connect(self.newTab)
         self.__actions.append(self.newTabAct)
         
         self.newAct = E5Action(
@@ -719,8 +709,7 @@
             """<p>This opens a new web browser window in the current"""
             """ privacy mode.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.newAct.triggered.connect(self.newWindow)
+        self.newAct.triggered.connect(self.newWindow)
         self.__actions.append(self.newAct)
         
         self.newPrivateAct = E5Action(
@@ -736,8 +725,7 @@
             """<p>This opens a new private web browser window by starting"""
             """ a new web browser instance in private mode.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.newPrivateAct.triggered.connect(self.newPrivateWindow)
+        self.newPrivateAct.triggered.connect(self.newPrivateWindow)
         self.__actions.append(self.newPrivateAct)
         
         self.openAct = E5Action(
@@ -752,8 +740,7 @@
             """<p>This opens a new file for display."""
             """ It pops up a file selection dialog.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.openAct.triggered.connect(self.__openFile)
+        self.openAct.triggered.connect(self.__openFile)
         self.__actions.append(self.openAct)
         
         self.openTabAct = E5Action(
@@ -769,8 +756,7 @@
             """<p>This opens a new file for display in a new tab."""
             """ It pops up a file selection dialog.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.openTabAct.triggered.connect(self.__openFileNewTab)
+        self.openTabAct.triggered.connect(self.__openFileNewTab)
         self.__actions.append(self.openTabAct)
         
         if hasattr(QWebEnginePage, "SavePage"):
@@ -786,8 +772,7 @@
                 """<b>Save As...</b>"""
                 """<p>Saves the current page to disk.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.saveAsAct.triggered.connect(self.__savePageAs)
+            self.saveAsAct.triggered.connect(self.__savePageAs)
             self.__actions.append(self.saveAsAct)
         else:
             self.saveAsAct = None
@@ -805,9 +790,8 @@
             """<p>Saves the visible part of the current page as a"""
             """ screen shot.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.saveVisiblePageScreenAct.triggered.connect(
-                self.__saveVisiblePageScreen)
+        self.saveVisiblePageScreenAct.triggered.connect(
+            self.__saveVisiblePageScreen)
         self.__actions.append(self.saveVisiblePageScreenAct)
         
         bookmarksManager = self.bookmarksManager()
@@ -821,9 +805,8 @@
             """<b>Import Bookmarks</b>"""
             """<p>Import bookmarks from other browsers.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.importBookmarksAct.triggered.connect(
-                bookmarksManager.importBookmarks)
+        self.importBookmarksAct.triggered.connect(
+            bookmarksManager.importBookmarks)
         self.__actions.append(self.importBookmarksAct)
         
         self.exportBookmarksAct = E5Action(
@@ -836,9 +819,8 @@
             """<b>Export Bookmarks</b>"""
             """<p>Export the bookmarks into a file.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.exportBookmarksAct.triggered.connect(
-                bookmarksManager.exportBookmarks)
+        self.exportBookmarksAct.triggered.connect(
+            bookmarksManager.exportBookmarks)
         self.__actions.append(self.exportBookmarksAct)
         
         if qVersionTuple() >= (5, 8, 0) or (
@@ -854,8 +836,7 @@
                 """<b>Print</b>"""
                 """<p>Print the displayed help text.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.printAct.triggered.connect(self.__tabWidget.printBrowser)
+            self.printAct.triggered.connect(self.__tabWidget.printBrowser)
             self.__actions.append(self.printAct)
         else:
             self.printAct = None
@@ -872,9 +853,8 @@
                 """<b>Print as PDF</b>"""
                 """<p>Print the displayed help text as a PDF file.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.printPdfAct.triggered.connect(
-                    self.__tabWidget.printBrowserPdf)
+            self.printPdfAct.triggered.connect(
+                self.__tabWidget.printBrowserPdf)
             self.__actions.append(self.printPdfAct)
         else:
             self.printPdfAct = None
@@ -892,9 +872,8 @@
                 """<b>Print Preview</b>"""
                 """<p>Print preview of the displayed help text.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.printPreviewAct.triggered.connect(
-                    self.__tabWidget.printPreviewBrowser)
+            self.printPreviewAct.triggered.connect(
+                self.__tabWidget.printPreviewBrowser)
             self.__actions.append(self.printPreviewAct)
         else:
             self.printPreviewAct = None
@@ -910,8 +889,7 @@
             """<b>Send Page Link</b>"""
             """<p>Send the link of the current page via email.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.sendPageLinkAct.triggered.connect(self.__sendPageLink)
+        self.sendPageLinkAct.triggered.connect(self.__sendPageLink)
         self.__actions.append(self.sendPageLinkAct)
         
         self.closeAct = E5Action(
@@ -926,8 +904,7 @@
             """<b>Close</b>"""
             """<p>Closes the current web browser window.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.closeAct.triggered.connect(self.__tabWidget.closeBrowser)
+        self.closeAct.triggered.connect(self.__tabWidget.closeBrowser)
         self.__actions.append(self.closeAct)
         
         self.closeAllAct = E5Action(
@@ -939,9 +916,8 @@
             """<b>Close All</b>"""
             """<p>Closes all web browser windows except the first one.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.closeAllAct.triggered.connect(
-                self.__tabWidget.closeAllBrowsers)
+        self.closeAllAct.triggered.connect(
+            self.__tabWidget.closeAllBrowsers)
         self.__actions.append(self.closeAllAct)
         
         self.exitAct = E5Action(
@@ -955,11 +931,7 @@
             """<b>Quit</b>"""
             """<p>Quit the eric6 Web Browser.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            if self.__fromEric:
-                self.exitAct.triggered.connect(self.close)
-            else:
-                self.exitAct.triggered.connect(self.shutdown)
+        self.exitAct.triggered.connect(self.shutdown)
         self.__actions.append(self.exitAct)
         
         self.backAct = E5Action(
@@ -974,8 +946,7 @@
             """<p>Moves one screen backward. If none is"""
             """ available, this action is disabled.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.backAct.triggered.connect(self.__backward)
+        self.backAct.triggered.connect(self.__backward)
         self.__actions.append(self.backAct)
         
         self.forwardAct = E5Action(
@@ -991,8 +962,7 @@
             """<p>Moves one screen forward. If none is"""
             """ available, this action is disabled.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.forwardAct.triggered.connect(self.__forward)
+        self.forwardAct.triggered.connect(self.__forward)
         self.__actions.append(self.forwardAct)
         
         self.homeAct = E5Action(
@@ -1007,8 +977,7 @@
             """<b>Home</b>"""
             """<p>Moves to the initial screen.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.homeAct.triggered.connect(self.__home)
+        self.homeAct.triggered.connect(self.__home)
         self.__actions.append(self.homeAct)
         
         self.reloadAct = E5Action(
@@ -1024,8 +993,7 @@
             """<b>Reload</b>"""
             """<p>Reloads the current screen.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.reloadAct.triggered.connect(self.__reload)
+        self.reloadAct.triggered.connect(self.__reload)
         self.__actions.append(self.reloadAct)
         
         self.stopAct = E5Action(
@@ -1040,8 +1008,7 @@
             """<b>Stop</b>"""
             """<p>Stops loading of the current tab.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.stopAct.triggered.connect(self.__stopLoading)
+        self.stopAct.triggered.connect(self.__stopLoading)
         self.__actions.append(self.stopAct)
         
         self.copyAct = E5Action(
@@ -1055,8 +1022,7 @@
             """<b>Copy</b>"""
             """<p>Copy the selected text to the clipboard.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.copyAct.triggered.connect(self.__copy)
+        self.copyAct.triggered.connect(self.__copy)
         self.__actions.append(self.copyAct)
         
         self.cutAct = E5Action(
@@ -1070,8 +1036,7 @@
             """<b>Cut</b>"""
             """<p>Cut the selected text to the clipboard.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.cutAct.triggered.connect(self.__cut)
+        self.cutAct.triggered.connect(self.__cut)
         self.__actions.append(self.cutAct)
         
         self.pasteAct = E5Action(
@@ -1085,8 +1050,7 @@
             """<b>Paste</b>"""
             """<p>Paste some text from the clipboard.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.pasteAct.triggered.connect(self.__paste)
+        self.pasteAct.triggered.connect(self.__paste)
         self.__actions.append(self.pasteAct)
         
         self.undoAct = E5Action(
@@ -1100,8 +1064,7 @@
             """<b>Undo</b>"""
             """<p>Undo the last edit action.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.undoAct.triggered.connect(self.__undo)
+        self.undoAct.triggered.connect(self.__undo)
         self.__actions.append(self.undoAct)
         
         self.redoAct = E5Action(
@@ -1115,8 +1078,7 @@
             """<b>Redo</b>"""
             """<p>Redo the last edit action.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.redoAct.triggered.connect(self.__redo)
+        self.redoAct.triggered.connect(self.__redo)
         self.__actions.append(self.redoAct)
         
         self.selectAllAct = E5Action(
@@ -1130,8 +1092,7 @@
             """<b>Select All</b>"""
             """<p>Select all text of the current browser.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.selectAllAct.triggered.connect(self.__selectAll)
+        self.selectAllAct.triggered.connect(self.__selectAll)
         self.__actions.append(self.selectAllAct)
         
         self.unselectAct = E5Action(
@@ -1144,8 +1105,7 @@
             """<b>Unselect</b>"""
             """<p>Clear the selection of the current browser.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.unselectAct.triggered.connect(self.__unselect)
+        self.unselectAct.triggered.connect(self.__unselect)
         self.__actions.append(self.unselectAct)
         
         self.findAct = E5Action(
@@ -1159,8 +1119,7 @@
             """<b>Find</b>"""
             """<p>Find text in the current page.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.findAct.triggered.connect(self.__find)
+        self.findAct.triggered.connect(self.__find)
         self.__actions.append(self.findAct)
         
         self.findNextAct = E5Action(
@@ -1175,8 +1134,7 @@
             """<b>Find next</b>"""
             """<p>Find the next occurrence of text in the current page.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.findNextAct.triggered.connect(self.__searchWidget.findNext)
+        self.findNextAct.triggered.connect(self.__searchWidget.findNext)
         self.__actions.append(self.findNextAct)
         
         self.findPrevAct = E5Action(
@@ -1192,9 +1150,8 @@
             """<p>Find the previous occurrence of text in the current"""
             """ page.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.findPrevAct.triggered.connect(
-                self.__searchWidget.findPrevious)
+        self.findPrevAct.triggered.connect(
+            self.__searchWidget.findPrevious)
         self.__actions.append(self.findPrevAct)
         
         self.bookmarksManageAct = E5Action(
@@ -1208,9 +1165,8 @@
             """<b>Manage Bookmarks...</b>"""
             """<p>Open a dialog to manage the bookmarks.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.bookmarksManageAct.triggered.connect(
-                self.__showBookmarksDialog)
+        self.bookmarksManageAct.triggered.connect(
+            self.__showBookmarksDialog)
         self.__actions.append(self.bookmarksManageAct)
         
         self.bookmarksAddAct = E5Action(
@@ -1226,8 +1182,7 @@
             """<b>Add Bookmark</b>"""
             """<p>Open a dialog to add the current URL as a bookmark.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.bookmarksAddAct.triggered.connect(self.__addBookmark)
+        self.bookmarksAddAct.triggered.connect(self.__addBookmark)
         self.__actions.append(self.bookmarksAddAct)
         
         self.bookmarksAddFolderAct = E5Action(
@@ -1240,9 +1195,8 @@
             """<b>Add Folder...</b>"""
             """<p>Open a dialog to add a new bookmarks folder.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.bookmarksAddFolderAct.triggered.connect(
-                self.__addBookmarkFolder)
+        self.bookmarksAddFolderAct.triggered.connect(
+            self.__addBookmarkFolder)
         self.__actions.append(self.bookmarksAddFolderAct)
         
         self.bookmarksAllTabsAct = E5Action(
@@ -1256,8 +1210,7 @@
             """<p>Open a dialog to add a new bookmarks folder for"""
             """ all open tabs.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.bookmarksAllTabsAct.triggered.connect(self.bookmarkAll)
+        self.bookmarksAllTabsAct.triggered.connect(self.bookmarkAll)
         self.__actions.append(self.bookmarksAllTabsAct)
         
         self.whatsThisAct = E5Action(
@@ -1275,8 +1228,7 @@
             """ to use them. In dialogs, this feature can be accessed using"""
             """ the context help button in the titlebar.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.whatsThisAct.triggered.connect(self.__whatsThis)
+        self.whatsThisAct.triggered.connect(self.__whatsThis)
         self.__actions.append(self.whatsThisAct)
         
         self.aboutAct = E5Action(
@@ -1289,8 +1241,7 @@
             """<b>About</b>"""
             """<p>Display some information about this software.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.aboutAct.triggered.connect(self.__about)
+        self.aboutAct.triggered.connect(self.__about)
         self.__actions.append(self.aboutAct)
         
         self.aboutQtAct = E5Action(
@@ -1303,8 +1254,7 @@
             """<b>About Qt</b>"""
             """<p>Display some information about the Qt toolkit.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.aboutQtAct.triggered.connect(self.__aboutQt)
+        self.aboutQtAct.triggered.connect(self.__aboutQt)
         self.__actions.append(self.aboutQtAct)
         
         self.zoomInAct = E5Action(
@@ -1320,8 +1270,7 @@
             """<p>Zoom in on the web page."""
             """ This makes the web page bigger.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.zoomInAct.triggered.connect(self.__zoomIn)
+        self.zoomInAct.triggered.connect(self.__zoomIn)
         self.__actions.append(self.zoomInAct)
         
         self.zoomOutAct = E5Action(
@@ -1337,8 +1286,7 @@
             """<p>Zoom out on the web page."""
             """ This makes the web page smaller.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.zoomOutAct.triggered.connect(self.__zoomOut)
+        self.zoomOutAct.triggered.connect(self.__zoomOut)
         self.__actions.append(self.zoomOutAct)
         
         self.zoomResetAct = E5Action(
@@ -1354,8 +1302,7 @@
             """<p>Reset the zoom of the web page. """
             """This sets the zoom factor to 100%.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.zoomResetAct.triggered.connect(self.__zoomReset)
+        self.zoomResetAct.triggered.connect(self.__zoomReset)
         self.__actions.append(self.zoomResetAct)
         
         self.pageSourceAct = E5Action(
@@ -1369,8 +1316,7 @@
             """<b>Show page source</b>"""
             """<p>Show the page source in an editor.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.pageSourceAct.triggered.connect(self.__showPageSource)
+        self.pageSourceAct.triggered.connect(self.__showPageSource)
         self.__actions.append(self.pageSourceAct)
         self.addAction(self.pageSourceAct)
         
@@ -1385,8 +1331,7 @@
                 QKeySequence(self.tr("Meta+Ctrl+F")))
         else:
             self.fullScreenAct.setShortcut(QKeySequence(self.tr('F11')))
-        if not self.__initShortcutsOnly:
-            self.fullScreenAct.triggered.connect(self.toggleFullScreen)
+        self.fullScreenAct.triggered.connect(self.toggleFullScreen)
         self.__actions.append(self.fullScreenAct)
         self.addAction(self.fullScreenAct)
         
@@ -1395,8 +1340,7 @@
             self.tr('Show next tab'),
             QKeySequence(self.tr('Ctrl+Alt+Tab')), 0,
             self, 'webbrowser_view_next_tab')
-        if not self.__initShortcutsOnly:
-            self.nextTabAct.triggered.connect(self.__nextTab)
+        self.nextTabAct.triggered.connect(self.__nextTab)
         self.__actions.append(self.nextTabAct)
         self.addAction(self.nextTabAct)
         
@@ -1405,8 +1349,7 @@
             self.tr('Show previous tab'),
             QKeySequence(self.tr('Shift+Ctrl+Alt+Tab')), 0,
             self, 'webbrowser_view_previous_tab')
-        if not self.__initShortcutsOnly:
-            self.prevTabAct.triggered.connect(self.__prevTab)
+        self.prevTabAct.triggered.connect(self.__prevTab)
         self.__actions.append(self.prevTabAct)
         self.addAction(self.prevTabAct)
         
@@ -1415,8 +1358,7 @@
             self.tr('Switch between tabs'),
             QKeySequence(self.tr('Ctrl+1')), 0,
             self, 'webbrowser_switch_tabs')
-        if not self.__initShortcutsOnly:
-            self.switchTabAct.triggered.connect(self.__switchTab)
+        self.switchTabAct.triggered.connect(self.__switchTab)
         self.__actions.append(self.switchTabAct)
         self.addAction(self.switchTabAct)
         
@@ -1431,8 +1373,7 @@
             """<p>Set the configuration items of the application"""
             """ with your prefered values.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.prefAct.triggered.connect(self.__showPreferences)
+        self.prefAct.triggered.connect(self.__showPreferences)
         self.__actions.append(self.prefAct)
         
         self.acceptedLanguagesAct = E5Action(
@@ -1446,9 +1387,8 @@
             """<b>Languages</b>"""
             """<p>Configure the accepted languages for web pages.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.acceptedLanguagesAct.triggered.connect(
-                self.__showAcceptedLanguages)
+        self.acceptedLanguagesAct.triggered.connect(
+            self.__showAcceptedLanguages)
         self.__actions.append(self.acceptedLanguagesAct)
         
         self.cookiesAct = E5Action(
@@ -1461,9 +1401,8 @@
             """<b>Cookies</b>"""
             """<p>Configure cookies handling.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.cookiesAct.triggered.connect(
-                self.__showCookiesConfiguration)
+        self.cookiesAct.triggered.connect(
+            self.__showCookiesConfiguration)
         self.__actions.append(self.cookiesAct)
         
         self.flashCookiesAct = E5Action(
@@ -1477,9 +1416,8 @@
             """<b>Flash Cookies</b>"""
             """<p>Show a dialog to manage the flash cookies.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.flashCookiesAct.triggered.connect(
-                self.__showFlashCookiesManagement)
+        self.flashCookiesAct.triggered.connect(
+            self.__showFlashCookiesManagement)
         self.__actions.append(self.flashCookiesAct)
         
         self.personalDataAct = E5Action(
@@ -1495,9 +1433,8 @@
             """<p>Opens a dialog to configure the personal information"""
             """ used for completing form fields.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.personalDataAct.triggered.connect(
-                self.__showPersonalInformationDialog)
+        self.personalDataAct.triggered.connect(
+            self.__showPersonalInformationDialog)
         self.__actions.append(self.personalDataAct)
         
         self.greaseMonkeyAct = E5Action(
@@ -1513,9 +1450,8 @@
             """<p>Opens a dialog to configure the available GreaseMonkey"""
             """ Scripts.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.greaseMonkeyAct.triggered.connect(
-                self.__showGreaseMonkeyConfigDialog)
+        self.greaseMonkeyAct.triggered.connect(
+            self.__showGreaseMonkeyConfigDialog)
         self.__actions.append(self.greaseMonkeyAct)
         
         self.editMessageFilterAct = E5Action(
@@ -1531,9 +1467,8 @@
             """ suppress unwanted messages been shown in an error"""
             """ window.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.editMessageFilterAct.triggered.connect(
-                E5ErrorMessage.editMessageFilters)
+        self.editMessageFilterAct.triggered.connect(
+            E5ErrorMessage.editMessageFilters)
         self.__actions.append(self.editMessageFilterAct)
         
         self.featurePermissionAct = E5Action(
@@ -1548,12 +1483,11 @@
             """<p>Opens a dialog to edit the remembered HTML5"""
             """ feature permissions.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.featurePermissionAct.triggered.connect(
-                self.__showFeaturePermissionDialog)
+        self.featurePermissionAct.triggered.connect(
+            self.__showFeaturePermissionDialog)
         self.__actions.append(self.featurePermissionAct)
         
-        if WebBrowserWindow._useQtHelp or self.__initShortcutsOnly:
+        if WebBrowserWindow._useQtHelp:
             self.syncTocAct = E5Action(
                 self.tr('Sync with Table of Contents'),
                 UI.PixmapCache.getIcon("syncToc.png"),
@@ -1566,8 +1500,7 @@
                 """<p>Synchronizes the table of contents with current"""
                 """ page.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.syncTocAct.triggered.connect(self.__syncTOC)
+            self.syncTocAct.triggered.connect(self.__syncTOC)
             self.__actions.append(self.syncTocAct)
             
             self.showTocAct = E5Action(
@@ -1580,8 +1513,7 @@
                 """<b>Table of Contents</b>"""
                 """<p>Shows the table of contents window.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.showTocAct.triggered.connect(self.__showTocWindow)
+            self.showTocAct.triggered.connect(self.__showTocWindow)
             self.__actions.append(self.showTocAct)
             
             self.showIndexAct = E5Action(
@@ -1594,8 +1526,7 @@
                 """<b>Index</b>"""
                 """<p>Shows the index window.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.showIndexAct.triggered.connect(self.__showIndexWindow)
+            self.showIndexAct.triggered.connect(self.__showIndexWindow)
             self.__actions.append(self.showIndexAct)
             
             self.showSearchAct = E5Action(
@@ -1608,9 +1539,8 @@
                 """<b>Search</b>"""
                 """<p>Shows the search window.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.showSearchAct.triggered.connect(
-                    self.__showSearchWindow)
+            self.showSearchAct.triggered.connect(
+                self.__showSearchWindow)
             self.__actions.append(self.showSearchAct)
             
             self.manageQtHelpDocsAct = E5Action(
@@ -1624,9 +1554,8 @@
                 """<p>Shows a dialog to manage the QtHelp documentation"""
                 """ set.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.manageQtHelpDocsAct.triggered.connect(
-                    self.__manageQtHelpDocumentation)
+            self.manageQtHelpDocsAct.triggered.connect(
+                self.__manageQtHelpDocumentation)
             self.__actions.append(self.manageQtHelpDocsAct)
             
             self.manageQtHelpFiltersAct = E5Action(
@@ -1639,9 +1568,8 @@
                 """<b>Manage QtHelp Filters</b>"""
                 """<p>Shows a dialog to manage the QtHelp filters.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.manageQtHelpFiltersAct.triggered.connect(
-                    self.__manageQtHelpFilters)
+            self.manageQtHelpFiltersAct.triggered.connect(
+                self.__manageQtHelpFilters)
             self.__actions.append(self.manageQtHelpFiltersAct)
             
             self.reindexDocumentationAct = E5Action(
@@ -1654,9 +1582,8 @@
                 """<b>Reindex Documentation</b>"""
                 """<p>Reindexes the documentation set.</p>"""
             ))
-            if not self.__initShortcutsOnly:
-                self.reindexDocumentationAct.triggered.connect(
-                    self.__searchEngine.reindexDocumentation)
+            self.reindexDocumentationAct.triggered.connect(
+                self.__searchEngine.reindexDocumentation)
             self.__actions.append(self.reindexDocumentationAct)
         
         self.clearPrivateDataAct = E5Action(
@@ -1672,9 +1599,8 @@
             """<p>Clears the private data like browsing history, search"""
             """ history or the favicons database.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.clearPrivateDataAct.triggered.connect(
-                self.__clearPrivateData)
+        self.clearPrivateDataAct.triggered.connect(
+            self.__clearPrivateData)
         self.__actions.append(self.clearPrivateDataAct)
         
         self.clearIconsAct = E5Action(
@@ -1689,8 +1615,7 @@
             """<p>Clears the database of favicons of previously visited"""
             """ URLs.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.clearIconsAct.triggered.connect(self.__clearIconsDatabase)
+        self.clearIconsAct.triggered.connect(self.__clearIconsDatabase)
         self.__actions.append(self.clearIconsAct)
         
         self.manageIconsAct = E5Action(
@@ -1706,8 +1631,7 @@
             """<p>This shows a dialog to manage the saved favicons of"""
             """ previously visited URLs.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.manageIconsAct.triggered.connect(self.__showWebIconsDialog)
+        self.manageIconsAct.triggered.connect(self.__showWebIconsDialog)
         self.__actions.append(self.manageIconsAct)
         
         self.searchEnginesAct = E5Action(
@@ -1722,9 +1646,8 @@
             """<p>Opens a dialog to configure the available search"""
             """ engines.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.searchEnginesAct.triggered.connect(
-                self.__showEnginesConfigurationDialog)
+        self.searchEnginesAct.triggered.connect(
+            self.__showEnginesConfigurationDialog)
         self.__actions.append(self.searchEnginesAct)
         
         self.passwordsAct = E5Action(
@@ -1739,8 +1662,7 @@
             """<b>Manage Saved Passwords...</b>"""
             """<p>Opens a dialog to manage the saved passwords.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.passwordsAct.triggered.connect(self.__showPasswordsDialog)
+        self.passwordsAct.triggered.connect(self.__showPasswordsDialog)
         self.__actions.append(self.passwordsAct)
         
         self.adblockAct = E5Action(
@@ -1756,8 +1678,7 @@
             """<p>Opens a dialog to configure AdBlock subscriptions and"""
             """ rules.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.adblockAct.triggered.connect(self.__showAdBlockDialog)
+        self.adblockAct.triggered.connect(self.__showAdBlockDialog)
         self.__actions.append(self.adblockAct)
         
         self.certificateErrorsAct = E5Action(
@@ -1773,9 +1694,8 @@
             """<p>Opens a dialog to manage the accepted SSL"""
             """ certificate errors.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.certificateErrorsAct.triggered.connect(
-                self.__showCertificateErrorsDialog)
+        self.certificateErrorsAct.triggered.connect(
+            self.__showCertificateErrorsDialog)
         self.__actions.append(self.certificateErrorsAct)
         
         self.safeBrowsingAct = E5Action(
@@ -1790,9 +1710,8 @@
             """<p>This opens a dialog to configure Safe Browsing and"""
             """ to manage the local cache.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.safeBrowsingAct.triggered.connect(
-                self.__showSafeBrowsingDialog)
+        self.safeBrowsingAct.triggered.connect(
+            self.__showSafeBrowsingDialog)
         self.__actions.append(self.safeBrowsingAct)
         
         self.showDownloadManagerAct = E5Action(
@@ -1805,9 +1724,8 @@
             """<b>Downloads</b>"""
             """<p>Shows the downloads window.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.showDownloadManagerAct.triggered.connect(
-                self.__showDownloadsWindow)
+        self.showDownloadManagerAct.triggered.connect(
+            self.__showDownloadsWindow)
         self.__actions.append(self.showDownloadManagerAct)
         
         self.feedsManagerAct = E5Action(
@@ -1824,8 +1742,7 @@
             """ It can be used to mange the feeds and to show their"""
             """ contents.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.feedsManagerAct.triggered.connect(self.__showFeedsManager)
+        self.feedsManagerAct.triggered.connect(self.__showFeedsManager)
         self.__actions.append(self.feedsManagerAct)
         
         self.siteInfoAct = E5Action(
@@ -1841,8 +1758,7 @@
             """<p>Opens a dialog showing some information about the current"""
             """ site.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.siteInfoAct.triggered.connect(self.__showSiteinfoDialog)
+        self.siteInfoAct.triggered.connect(self.__showSiteinfoDialog)
         self.__actions.append(self.siteInfoAct)
         
         self.userAgentManagerAct = E5Action(
@@ -1855,9 +1771,8 @@
             """<b>Manage User Agent Settings</b>"""
             """<p>Shows a dialog to manage the User Agent settings.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.userAgentManagerAct.triggered.connect(
-                self.__showUserAgentsDialog)
+        self.userAgentManagerAct.triggered.connect(
+            self.__showUserAgentsDialog)
         self.__actions.append(self.userAgentManagerAct)
         
         self.synchronizationAct = E5Action(
@@ -1872,9 +1787,8 @@
             """<p>This shows a dialog to synchronize data via the"""
             """ network.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.synchronizationAct.triggered.connect(
-                self.__showSyncDialog)
+        self.synchronizationAct.triggered.connect(
+            self.__showSyncDialog)
         self.__actions.append(self.synchronizationAct)
         
         self.zoomValuesAct = E5Action(
@@ -1889,8 +1803,7 @@
             """<b>Manage Saved Zoom Values...</b>"""
             """<p>Opens a dialog to manage the saved zoom values.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.zoomValuesAct.triggered.connect(self.__showZoomValuesDialog)
+        self.zoomValuesAct.triggered.connect(self.__showZoomValuesDialog)
         self.__actions.append(self.zoomValuesAct)
         
         self.showJavaScriptConsoleAct = E5Action(
@@ -1903,9 +1816,8 @@
             """<b>JavaScript Console</b>"""
             """<p>This toggles the JavaScript console window.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.showJavaScriptConsoleAct.triggered.connect(
-                self.__toggleJavaScriptConsole)
+        self.showJavaScriptConsoleAct.triggered.connect(
+            self.__toggleJavaScriptConsole)
         self.__actions.append(self.showJavaScriptConsoleAct)
         
         self.showTabManagerAct = E5Action(
@@ -1918,9 +1830,8 @@
             """<b>Tab Manager</b>"""
             """<p>Shows the tab manager window.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.showTabManagerAct.triggered.connect(
-                lambda: self.__showTabManager(self.showTabManagerAct))
+        self.showTabManagerAct.triggered.connect(
+            lambda: self.__showTabManager(self.showTabManagerAct))
         self.__actions.append(self.showTabManagerAct)
         
         self.showSessionsManagerAct = E5Action(
@@ -1933,9 +1844,8 @@
             """<b>Session Manager</b>"""
             """<p>Shows the session manager window.</p>"""
         ))
-        if not self.__initShortcutsOnly:
-            self.showSessionsManagerAct.triggered.connect(
-                self.__showSessionManagerDialog)
+        self.showSessionsManagerAct.triggered.connect(
+            self.__showSessionManagerDialog)
         self.__actions.append(self.showSessionsManagerAct)
         
         self.virustotalScanCurrentAct = E5Action(
@@ -1944,9 +1854,8 @@
             self.tr("Scan current site"),
             0, 0,
             self, 'webbrowser_virustotal_scan_site')
-        if not self.__initShortcutsOnly:
-            self.virustotalScanCurrentAct.triggered.connect(
-                self.__virusTotalScanCurrentSite)
+        self.virustotalScanCurrentAct.triggered.connect(
+            self.__virusTotalScanCurrentSite)
         self.__actions.append(self.virustotalScanCurrentAct)
         
         self.virustotalIpReportAct = E5Action(
@@ -1955,9 +1864,8 @@
             self.tr("IP Address Report"),
             0, 0,
             self, 'webbrowser_virustotal_ip_report')
-        if not self.__initShortcutsOnly:
-            self.virustotalIpReportAct.triggered.connect(
-                self.__virusTotalIpAddressReport)
+        self.virustotalIpReportAct.triggered.connect(
+            self.__virusTotalIpAddressReport)
         self.__actions.append(self.virustotalIpReportAct)
         
         self.virustotalDomainReportAct = E5Action(
@@ -1966,9 +1874,8 @@
             self.tr("Domain Report"),
             0, 0,
             self, 'webbrowser_virustotal_domain_report')
-        if not self.__initShortcutsOnly:
-            self.virustotalDomainReportAct.triggered.connect(
-                self.__virusTotalDomainReport)
+        self.virustotalDomainReportAct.triggered.connect(
+            self.__virusTotalDomainReport)
         self.__actions.append(self.virustotalDomainReportAct)
         
         if not Preferences.getWebBrowser("VirusTotalEnabled") or \
@@ -1976,13 +1883,56 @@
             self.virustotalScanCurrentAct.setEnabled(False)
             self.virustotalIpReportAct.setEnabled(False)
             self.virustotalDomainReportAct.setEnabled(False)
+
+        self.shortcutsAct = E5Action(
+            self.tr('Keyboard Shortcuts'),
+            UI.PixmapCache.getIcon("configureShortcuts.png"),
+            self.tr('Keyboard &Shortcuts...'),
+            0, 0,
+            self, 'webbrowser_keyboard_shortcuts')
+        self.shortcutsAct.setStatusTip(self.tr(
+            'Set the keyboard shortcuts'))
+        self.shortcutsAct.setWhatsThis(self.tr(
+            """<b>Keyboard Shortcuts</b>"""
+            """<p>Set the keyboard shortcuts of the application"""
+            """ with your prefered values.</p>"""
+        ))
+        self.shortcutsAct.triggered.connect(self.__configShortcuts)
+        self.__actions.append(self.shortcutsAct)
+
+        self.exportShortcutsAct = E5Action(
+            self.tr('Export Keyboard Shortcuts'),
+            UI.PixmapCache.getIcon("exportShortcuts.png"),
+            self.tr('&Export Keyboard Shortcuts...'),
+            0, 0, self, 'export_keyboard_shortcuts')
+        self.exportShortcutsAct.setStatusTip(self.tr(
+            'Export the keyboard shortcuts'))
+        self.exportShortcutsAct.setWhatsThis(self.tr(
+            """<b>Export Keyboard Shortcuts</b>"""
+            """<p>Export the keyboard shortcuts of the application.</p>"""
+        ))
+        self.exportShortcutsAct.triggered.connect(self.__exportShortcuts)
+        self.__actions.append(self.exportShortcutsAct)
+
+        self.importShortcutsAct = E5Action(
+            self.tr('Import Keyboard Shortcuts'),
+            UI.PixmapCache.getIcon("importShortcuts.png"),
+            self.tr('&Import Keyboard Shortcuts...'),
+            0, 0, self, 'import_keyboard_shortcuts')
+        self.importShortcutsAct.setStatusTip(self.tr(
+            'Import the keyboard shortcuts'))
+        self.importShortcutsAct.setWhatsThis(self.tr(
+            """<b>Import Keyboard Shortcuts</b>"""
+            """<p>Import the keyboard shortcuts of the application.</p>"""
+        ))
+        self.importShortcutsAct.triggered.connect(self.__importShortcuts)
+        self.__actions.append(self.importShortcutsAct)
         
         self.backAct.setEnabled(False)
         self.forwardAct.setEnabled(False)
         
         # now read the keyboard shortcuts for the actions
-        Shortcuts.readShortcuts(
-            helpViewer=self, helpViewerCategory="webBrowser")
+        Shortcuts.readShortcuts(helpViewer=self)
     
     def getActions(self):
         """
@@ -1991,7 +1941,16 @@
         @return list of all actions (list of E5Action)
         """
         return self.__actions[:]
-        
+    
+    def getActionsCategory(self):
+        """
+        Public method to get the category of the defined actions.
+        
+        @return category of the actions
+        @rtype str
+        """
+        return "WebBrowser"
+    
     def __initMenus(self):
         """
         Private method to create the menus.
@@ -2104,6 +2063,11 @@
         
         menu = mb.addMenu(self.tr('&Settings'))
         menu.addAction(self.prefAct)
+        menu.addSeparator()
+        menu.addAction(self.shortcutsAct)
+        menu.addAction(self.exportShortcutsAct)
+        menu.addAction(self.importShortcutsAct)
+        menu.addSeparator()
         menu.addAction(self.acceptedLanguagesAct)
         menu.addAction(self.cookiesAct)
         menu.addAction(self.flashCookiesAct)
@@ -2227,6 +2191,10 @@
         self.__superMenu.addAction(self.prefAct)
         
         menu = self.__superMenu.addMenu(self.tr('Settings'))
+        menu.addAction(self.shortcutsAct)
+        menu.addAction(self.exportShortcutsAct)
+        menu.addAction(self.importShortcutsAct)
+        menu.addSeparator()
         menu.addAction(self.acceptedLanguagesAct)
         menu.addAction(self.cookiesAct)
         menu.addAction(self.flashCookiesAct)
@@ -2391,6 +2359,7 @@
         settingstb.setObjectName("SettingsToolBar")
         settingstb.setIconSize(UI.Config.ToolBarIconSize)
         settingstb.addAction(self.prefAct)
+        settingstb.addAction(self.shortcutsAct)
         settingstb.addAction(self.acceptedLanguagesAct)
         settingstb.addAction(self.cookiesAct)
         settingstb.addAction(self.flashCookiesAct)
@@ -2509,7 +2478,7 @@
         else:
             linkName = link
         h = WebBrowserWindow(linkName, ".", self.parent(), "webbrowser",
-                             self.__fromEric, private=self.isPrivate(),
+                             private=self.isPrivate(),
                              restoreSession=restoreSession)
         h.show()
         
@@ -2837,12 +2806,12 @@
         
         self.__isClosing = True
         
-        if not self.__fromEric:
-            if not WebBrowserWindow._performingShutdown and \
-                    len(WebBrowserWindow.BrowserWindows) == 1:
-                # shut down the session manager in case the last window is
-                # about to be closed
-                self.sessionManager().shutdown()
+        if not WebBrowserWindow._performingShutdown and \
+            len(WebBrowserWindow.BrowserWindows) == 1 and \
+                not WebBrowserWindow.isPrivate():
+            # shut down the session manager in case the last window is
+            # about to be closed
+            self.sessionManager().shutdown()
         
         self.__bookmarksToolBar.setModel(None)
         
@@ -2873,7 +2842,7 @@
         
         try:
             browserIndex = WebBrowserWindow.BrowserWindows.index(self)
-            if not self.__fromEric and len(WebBrowserWindow.BrowserWindows):
+            if len(WebBrowserWindow.BrowserWindows):
                 if browserIndex == 0:
                     if len(WebBrowserWindow.BrowserWindows) > 1:
                         # first window will be deleted
@@ -2886,18 +2855,17 @@
                     else:
                         QDesktopServices.unsetUrlHandler("http")
                         QDesktopServices.unsetUrlHandler("https")
-            if self.__fromEric or len(WebBrowserWindow.BrowserWindows) > 0:
+            if len(WebBrowserWindow.BrowserWindows) > 0:
                 del WebBrowserWindow.BrowserWindows[browserIndex]
         except ValueError:
             pass
         
-        if not self.__fromEric:
-            Preferences.syncPreferences()
-            if not WebBrowserWindow._performingShutdown and \
-                    len(WebBrowserWindow.BrowserWindows) == 0:
-                # shut down the browser in case the last window was
-                # simply closed
-                self.shutdown()
+        Preferences.syncPreferences()
+        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
     
@@ -2924,14 +2892,9 @@
                     .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"))
+                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
@@ -2953,7 +2916,8 @@
         
         WebBrowserWindow._performingShutdown = True
         
-        self.sessionManager().shutdown()
+        if not WebBrowserWindow.isPrivate():
+            self.sessionManager().shutdown()
         
         if WebBrowserWindow._downloadManager is not None:
             self.downloadManager().shutdown()
@@ -3235,7 +3199,7 @@
         """
         from Preferences.ConfigurationDialog import ConfigurationDialog
         dlg = ConfigurationDialog(
-            self, 'Configuration', True, fromEric=self.__fromEric,
+            self, 'Configuration', True, fromEric=False,
             displayMode=ConfigurationDialog.WebBrowserMode)
         dlg.preferencesChanged.connect(self.preferencesChanged)
         dlg.masterPasswordChanged.connect(
@@ -3257,9 +3221,8 @@
         """
         Public slot to handle a change of preferences.
         """
-        if not self.__fromEric:
-            self.setStyle(Preferences.getUI("Style"),
-                          Preferences.getUI("StyleSheet"))
+        self.setStyle(Preferences.getUI("Style"),
+                      Preferences.getUI("StyleSheet"))
         
         self.__initWebEngineSettings()
         
@@ -3305,7 +3268,8 @@
         
         self.__javaScriptIcon.preferencesChanged()
         
-        self.sessionManager().preferencesChanged()
+        if not WebBrowserWindow.isPrivate():
+            self.sessionManager().preferencesChanged()
     
     def masterPasswordChanged(self, oldPassword, newPassword, local=False):
         """
@@ -3320,7 +3284,7 @@
         @type bool
         """
         self.passwordManager().masterPasswordChanged(oldPassword, newPassword)
-        if self.__fromEric and local:
+        if local:
             # we were called from our local configuration dialog
             Preferences.convertPasswords(oldPassword, newPassword)
             Utilities.crypto.changeRememberedMaster(newPassword)
@@ -3623,10 +3587,11 @@
         """
         Private slot to remove non-existing documentation from the help engine.
         """
-        for namespace in self.__helpEngine.registeredDocumentations():
-            docFile = self.__helpEngine.documentationFileName(namespace)
-            if not os.path.exists(docFile):
-                self.__helpEngine.unregisterDocumentation(namespace)
+        if WebBrowserWindow._useQtHelp:
+            for namespace in self.__helpEngine.registeredDocumentations():
+                docFile = self.__helpEngine.documentationFileName(namespace)
+                if not os.path.exists(docFile):
+                    self.__helpEngine.unregisterDocumentation(namespace)
         
     def __lookForNewDocumentation(self):
         """
@@ -4782,23 +4747,19 @@
             (None = use configured timeout, 0 = indefinitely)
         @type int
         """
-        if cls._fromEric:
-            e5App().getObject("UserInterface").showNotification(
-                icon, heading, text, timeout)
-        else:
-            if Preferences.getUI("NotificationsEnabled"):
-                if cls._notification is None:
-                    from UI.NotificationWidget import NotificationWidget
-                    cls._notification = NotificationWidget()
-                cls._notification.setPixmap(icon)
-                cls._notification.setHeading(heading)
-                cls._notification.setText(text)
-                if timeout is None:
-                    timeout = Preferences.getUI("NotificationTimeout")
-                cls._notification.setTimeout(timeout)
-                cls._notification.move(
-                    Preferences.getUI("NotificationPosition"))
-                cls._notification.show()
+        if Preferences.getUI("NotificationsEnabled"):
+            if cls._notification is None:
+                from UI.NotificationWidget import NotificationWidget
+                cls._notification = NotificationWidget()
+            cls._notification.setPixmap(icon)
+            cls._notification.setHeading(heading)
+            cls._notification.setText(text)
+            if timeout is None:
+                timeout = Preferences.getUI("NotificationTimeout")
+            cls._notification.setTimeout(timeout)
+            cls._notification.move(
+                Preferences.getUI("NotificationPosition"))
+            cls._notification.show()
     
     @classmethod
     def notificationsEnabled(cls):
@@ -4807,10 +4768,7 @@
         
         @return flag indicating, if notifications are enabled (boolean)
         """
-        if cls._fromEric:
-            return e5App().getObject("UserInterface").notificationsEnabled()
-        else:
-            return Preferences.getUI("NotificationsEnabled")
+        return Preferences.getUI("NotificationsEnabled")
     
     ######################################
     ## Support for global status bar below
@@ -4830,8 +4788,6 @@
         """
         if cls.BrowserWindows:
             return cls.BrowserWindows[0].statusBar()
-        elif cls._fromEric:
-            return e5App().getObject("UserInterface").statusBar()
         else:
             return None
     
@@ -4992,3 +4948,104 @@
         Private slot to show the safe browsing management dialog.
         """
         self.safeBrowsingManager().showSafeBrowsingDialog()
+    
+    ###############################################################
+    ## Methods below implement single application related functions
+    ###############################################################
+    
+    @pyqtSlot(str)
+    def __saLoadUrl(self, urlStr):
+        """
+        Private slot to load an URL received via the single application
+        protocol.
+        
+        @param urlStr URL to be loaded
+        @type str
+        """
+        url = QUrl.fromUserInput(urlStr)
+        self.__linkActivated(url)
+        
+        self.raise_()
+        self.activateWindow()
+    
+    @pyqtSlot(str)
+    def __saNewTab(self, urlStr):
+        """
+        Private slot to load an URL received via the single application
+        protocol in a new tab.
+        
+        @param urlStr URL to be loaded
+        @type str
+        """
+        url = QUrl.fromUserInput(urlStr)
+        self.newTab(url)
+        
+        self.raise_()
+        self.activateWindow()
+    
+    @pyqtSlot(str)
+    def __saSearchWord(self, word):
+        """
+        Private slot to search for the given word.
+        
+        @param word word to be searched for
+        @type str
+        """
+        if WebBrowserWindow._useQtHelp:
+            self.__searchWord = word
+            self.__searchForWord()
+        
+        self.raise_()
+        self.activateWindow()
+    
+    ######################################################
+    ## Methods below implement shortcuts related functions
+    ######################################################
+    
+    def __configShortcuts(self):
+        """
+        Private slot to configure the keyboard shortcuts.
+        """
+        if self.__shortcutsDialog is None:
+            from Preferences.ShortcutsDialog import ShortcutsDialog
+            self.__shortcutsDialog = ShortcutsDialog(self)
+        self.__shortcutsDialog.populate(helpViewer=self)
+        self.__shortcutsDialog.show()
+    
+    def __exportShortcuts(self):
+        """
+        Private slot to export the keyboard shortcuts.
+        """
+        fn, selectedFilter = E5FileDialog.getSaveFileNameAndFilter(
+            None,
+            self.tr("Export Keyboard Shortcuts"),
+            "",
+            self.tr("Keyboard shortcut file (*.e4k)"),
+            "",
+            E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
+        
+        if not fn:
+            return
+        
+        ext = QFileInfo(fn).suffix()
+        if not ext:
+            ex = selectedFilter.split("(*")[1].split(")")[0]
+            if ex:
+                fn += ex
+        
+        from Preferences import Shortcuts
+        Shortcuts.exportShortcuts(fn, helpViewer=self)
+
+    def __importShortcuts(self):
+        """
+        Private slot to import the keyboard shortcuts.
+        """
+        fn = E5FileDialog.getOpenFileName(
+            None,
+            self.tr("Import Keyboard Shortcuts"),
+            "",
+            self.tr("Keyboard shortcut file (*.e4k)"))
+        
+        if fn:
+            from Preferences import Shortcuts
+            Shortcuts.importShortcuts(fn, helpViewer=self)

eric ide

mercurial