Completed coding in order to remove the use of QObject.sender().

Thu, 08 Feb 2018 18:57:11 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 08 Feb 2018 18:57:11 +0100
changeset 6122
e7d98249f393
parent 6121
d3d64f3128b3
child 6123
39cd368143db

Completed coding in order to remove the use of QObject.sender().

Helpviewer/HelpBrowserWV.py file | annotate | diff | comparison | revisions
Helpviewer/HelpTabWidget.py file | annotate | diff | comparison | revisions
Helpviewer/History/HistoryMenu.py file | annotate | diff | comparison | revisions
WebBrowser/History/HistoryMenu.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserTabWidget.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserView.py file | annotate | diff | comparison | revisions
--- a/Helpviewer/HelpBrowserWV.py	Wed Feb 07 20:14:09 2018 +0100
+++ b/Helpviewer/HelpBrowserWV.py	Thu Feb 08 18:57:11 2018 +0100
@@ -779,8 +779,9 @@
             self.__featurePermissionRequested)
         
         self.page().downloadRequested.connect(self.__downloadRequested)
-        self.page().frameCreated.connect(self.__addExternalBinding)
-        self.__addExternalBinding(self.page().mainFrame())
+        self.page().frameCreated.connect(
+            lambda frame: self.__addExternalBinding(frame, False))
+        self.__addExternalBinding(self.page().mainFrame(), False)
         
         self.page().databaseQuotaExceeded.connect(self.__databaseQuotaExceeded)
         
@@ -808,20 +809,22 @@
         
         self.grabGesture(Qt.PinchGesture)
     
-    def __addExternalBinding(self, frame=None):
+    def __addExternalBinding(self, frame, frameCleared):
         """
         Private slot to add javascript bindings for adding search providers.
         
-        @param frame reference to the web frame (QWebFrame)
+        @param frame reference to the web frame
+        @type QWebFrame
+        @param frameCleared flag indicate, that the frame was cleared
+        @type bool
         """
         self.page().settings().setAttribute(QWebSettings.JavascriptEnabled,
                                             True)
         if self.__javaScriptBinding is None:
             self.__javaScriptBinding = JavaScriptExternalObject(self.mw, self)
         
-        if frame is None:
+        if frameCleared:
             # called from QWebFrame.javaScriptWindowObjectCleared
-            frame = self.sender()
             if isinstance(frame, HelpWebPage):
                 frame = frame.mainFrame()
             if frame.url().scheme() == "eric" and frame.url().path() == "home":
@@ -838,7 +841,7 @@
         else:
             # called from QWebPage.frameCreated
             frame.javaScriptWindowObjectCleared.connect(
-                self.__addExternalBinding)
+                lambda: self.__addExternalBinding(frame, True))
         frame.addToJavaScriptWindowObject("external", self.__javaScriptBinding)
     
     def linkedResources(self, relation=""):
@@ -1210,65 +1213,83 @@
         frameAtPos = self.page().frameAt(evt.pos())
         hit = self.page().mainFrame().hitTestContent(evt.pos())
         if not hit.linkUrl().isEmpty():
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("openNewTab.png"),
-                self.tr("Open Link in New Tab\tCtrl+LMB"),
-                self.__openLinkInNewTab).setData(hit.linkUrl())
+                self.tr("Open Link in New Tab\tCtrl+LMB"))
+            act.setData(hit.linkUrl())
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
             menu.addSeparator()
             menu.addAction(
                 UI.PixmapCache.getIcon("download.png"),
                 self.tr("Save Lin&k"), self.__downloadLink)
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("bookmark22.png"),
-                self.tr("Bookmark this Link"), self.__bookmarkLink)\
-                .setData(hit.linkUrl())
+                self.tr("Bookmark this Link"))
+            act.setData(hit.linkUrl())
+            act.triggered.connect(
+                lambda: self.__bookmarkLink(act))
             menu.addSeparator()
             menu.addAction(
                 UI.PixmapCache.getIcon("editCopy.png"),
                 self.tr("Copy Link to Clipboard"), self.__copyLink)
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("mailSend.png"),
-                self.tr("Send Link"),
-                self.__sendLink).setData(hit.linkUrl())
+                self.tr("Send Link"))
+            act.setData(hit.linkUrl())
+            act.triggered.connect(
+                lambda: self.__sendLink(act))
             if Preferences.getHelp("VirusTotalEnabled") and \
                Preferences.getHelp("VirusTotalServiceKey") != "":
-                menu.addAction(
+                act = menu.addAction(
                     UI.PixmapCache.getIcon("virustotal.png"),
-                    self.tr("Scan Link with VirusTotal"),
-                    self.__virusTotal).setData(hit.linkUrl())
+                    self.tr("Scan Link with VirusTotal"))
+                act.setData(hit.linkUrl())
+                act.triggered.connect(
+                    lambda: self.__virusTotal(act))
         
         if not hit.imageUrl().isEmpty():
             if not menu.isEmpty():
                 menu.addSeparator()
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("openNewTab.png"),
-                self.tr("Open Image in New Tab"),
-                self.__openLinkInNewTab).setData(hit.imageUrl())
+                self.tr("Open Image in New Tab"))
+            act.setData(hit.imageUrl())
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
             menu.addSeparator()
             menu.addAction(
                 UI.PixmapCache.getIcon("download.png"),
                 self.tr("Save Image"), self.__downloadImage)
             menu.addAction(
                 self.tr("Copy Image to Clipboard"), self.__copyImage)
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("editCopy.png"),
-                self.tr("Copy Image Location to Clipboard"),
-                self.__copyLocation).setData(hit.imageUrl().toString())
-            menu.addAction(
+                self.tr("Copy Image Location to Clipboard"))
+            act.setData(hit.imageUrl().toString())
+            act.triggered.connect(
+                lambda: self.__copyLocation(act))
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("mailSend.png"),
-                self.tr("Send Image Link"),
-                self.__sendLink).setData(hit.imageUrl())
+                self.tr("Send Image Link"))
+            act.setData(hit.imageUrl())
+            act.triggered.connect(
+                lambda: self.__sendLink(act))
             menu.addSeparator()
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("adBlockPlus.png"),
-                self.tr("Block Image"), self.__blockImage)\
-                .setData(hit.imageUrl().toString())
+                self.tr("Block Image"))
+            act.setData(hit.imageUrl().toString())
+            act.triggered.connect(
+                lambda: self.__blockImage(act))
             if Preferences.getHelp("VirusTotalEnabled") and \
                Preferences.getHelp("VirusTotalServiceKey") != "":
-                menu.addAction(
+                act = menu.addAction(
                     UI.PixmapCache.getIcon("virustotal.png"),
-                    self.tr("Scan Image with VirusTotal"),
-                    self.__virusTotal).setData(hit.imageUrl())
+                    self.tr("Scan Image with VirusTotal"))
+                act.setData(hit.imageUrl())
+                act.triggered.connect(
+                    lambda: self.__virusTotal(act))
         
         element = hit.element()
         if not element.isNull():
@@ -1299,18 +1320,24 @@
                         UI.PixmapCache.getIcon("audioVolumeMuted.png"),
                         self.tr("Mute"), self.__muteMedia)
                 menu.addSeparator()
-                menu.addAction(
+                act = menu.addAction(
                     UI.PixmapCache.getIcon("editCopy.png"),
-                    self.tr("Copy Media Address to Clipboard"),
-                    self.__copyLocation).setData(videoUrl.toString())
-                menu.addAction(
+                    self.tr("Copy Media Address to Clipboard"))
+                act.setData(videoUrl.toString())
+                act.triggered.connect(
+                    lambda: self.__copyLocation(act))
+                act = menu.addAction(
                     UI.PixmapCache.getIcon("mailSend.png"),
-                    self.tr("Send Media Address"), self.__sendLink)\
-                    .setData(videoUrl)
-                menu.addAction(
+                    self.tr("Send Media Address"))
+                act.setData(videoUrl)
+                act.triggered.connect(
+                    lambda: self.__sendLink(act))
+                act = menu.addAction(
                     UI.PixmapCache.getIcon("download.png"),
-                    self.tr("Save Media"), self.__downloadMedia)\
-                    .setData(videoUrl)
+                    self.tr("Save Media"))
+                act.setData(videoUrl)
+                act.triggered.connect(
+                    lambda: self.__downloadMedia(act))
             
             if element.tagName().lower() in ["input", "textarea"]:
                 if menu.isEmpty():
@@ -1356,10 +1383,12 @@
                 fmenu.addAction(
                     self.tr("Show &only this frame"),
                     self.__loadClickedFrame)
-                fmenu.addAction(
+                act = fmenu.addAction(
                     UI.PixmapCache.getIcon("openNewTab.png"),
-                    self.tr("Show in new &tab"),
-                    self.__openLinkInNewTab).setData(self.__clickedFrame.url())
+                    self.tr("Show in new &tab"))
+                act.setData(self.__clickedFrame.url())
+                act.triggered.connect(
+                    lambda: self.__openLinkInNewTab(act))
                 fmenu.addSeparator()
             fmenu.addAction(
                 UI.PixmapCache.getIcon("print.png"),
@@ -1391,9 +1420,12 @@
         menu.addAction(
             UI.PixmapCache.getIcon("bookmark22.png"),
             self.tr("Bookmark this Page"), self.addBookmark)
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Page Link"), self.__sendLink).setData(self.url())
+            self.tr("Send Page Link"))
+        act.setData(self.url())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         menu.addSeparator()
         self.__userAgentMenu = UserAgentMenu(self.tr("User Agent"),
                                              url=self.url())
@@ -1409,10 +1441,12 @@
         menu.addSeparator()
         if self.selectedText():
             menu.addAction(self.mw.copyAct)
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("mailSend.png"),
-                self.tr("Send Text"),
-                self.__sendLink).setData(self.selectedText())
+                self.tr("Send Text"))
+            act.setData(self.selectedText())
+            act.triggered.connect(
+                lambda: self.__sendLink(act))
         menu.addAction(self.mw.findAct)
         menu.addSeparator()
         if self.selectedText():
@@ -1441,32 +1475,40 @@
                 googleTranslatorUrl = QUrl(
                     "http://translate.google.com/#auto|{0}|{1}".format(
                         langCode, self.selectedText()))
-                menu.addAction(
+                act = menu.addAction(
                     UI.PixmapCache.getIcon("translate.png"),
-                    self.tr("Google Translate"), self.__openLinkInNewTab)\
-                    .setData(googleTranslatorUrl)
+                    self.tr("Google Translate"))
+                act.setData(googleTranslatorUrl)
+                act.triggered.connect(
+                    lambda: self.__openLinkInNewTab(act))
                 wiktionaryUrl = QUrl(
                     "http://{0}.wiktionary.org/wiki/Special:Search?search={1}"
                     .format(langCode, self.selectedText()))
-                menu.addAction(
+                act = menu.addAction(
                     UI.PixmapCache.getIcon("wikipedia.png"),
-                    self.tr("Dictionary"), self.__openLinkInNewTab)\
-                    .setData(wiktionaryUrl)
+                    self.tr("Dictionary"))
+                act.setData(wiktionaryUrl)
+                act.triggered.connect(
+                    lambda: self.__openLinkInNewTab(act))
                 menu.addSeparator()
             
             guessedUrl = QUrl.fromUserInput(self.selectedText().strip())
             if self.__isUrlValid(guessedUrl):
-                menu.addAction(
-                    self.tr("Go to web address"),
-                    self.__openLinkInNewTab).setData(guessedUrl)
+                act = menu.addAction(self.tr("Go to web address"))
+                act.setData(guessedUrl)
+                act.triggered.connect(
+                    lambda: self.__openLinkInNewTab(act))
                 menu.addSeparator()
         
         element = hit.element()
         if not element.isNull() and \
            element.tagName().lower() == "input" and \
            element.attribute("type", "text") == "text":
-            menu.addAction(self.tr("Add to web search toolbar"),
-                           self.__addSearchEngine).setData(element)
+            act = menu.addAction(
+                self.tr("Add to web search toolbar"))
+            act.setData(element)
+            act.triggered.connect(
+                lambda: self.__addSearchEngine(act))
             menu.addSeparator()
         
         menu.addAction(
@@ -1487,12 +1529,14 @@
             bool(url.scheme()) and \
             "." in url.host()
     
-    def __openLinkInNewTab(self):
+    def __openLinkInNewTab(self, act):
         """
         Private method called by the context menu to open a link in a new
         window.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         if url.isEmpty():
             return
@@ -1501,11 +1545,13 @@
         self.setSource(url)
         self.ctrlPressed = False
     
-    def __bookmarkLink(self):
+    def __bookmarkLink(self, act):
         """
         Private slot to bookmark a link via the context menu.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         if url.isEmpty():
             return
@@ -1515,11 +1561,13 @@
         dlg.setUrl(bytes(url.toEncoded()).decode())
         dlg.exec_()
     
-    def __sendLink(self):
+    def __sendLink(self, act):
         """
         Private slot to send a link via email.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         data = act.data()
         if isinstance(data, QUrl) and data.isEmpty():
             return
@@ -1552,29 +1600,35 @@
         """
         self.pageAction(QWebPage.CopyImageToClipboard).trigger()
     
-    def __copyLocation(self):
+    def __copyLocation(self, act):
         """
         Private slot to copy an image or media location to the clipboard.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         QApplication.clipboard().setText(url)
     
-    def __blockImage(self):
+    def __blockImage(self, act):
         """
         Private slot to add a block rule for an image URL.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
         import Helpviewer.HelpWindow
-        act = self.sender()
         url = act.data()
         dlg = Helpviewer.HelpWindow.HelpWindow.adBlockManager().showDialog()
         dlg.addCustomRule(url)
     
-    def __downloadMedia(self):
+    def __downloadMedia(self, act):
         """
         Private slot to download a media and save it to disk.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         self.mw.downloadManager().download(url, True, mainWindow=self.mw)
     
@@ -1600,11 +1654,13 @@
         else:
             self.__clickedMediaElement.evaluateJavaScript("this.muted = true")
     
-    def __virusTotal(self):
+    def __virusTotal(self, act):
         """
         Private slot to scan the selected URL with VirusTotal.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         self.mw.requestVirusTotalScan(url)
     
@@ -1624,14 +1680,13 @@
             engine = self.mw.openSearchManager().engine(engineName)
             self.search.emit(engine.searchUrl(searchText))
     
-    def __addSearchEngine(self):
+    def __addSearchEngine(self, act):
         """
         Private slot to add a new search engine.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
-        if act is None:
-            return
-        
         element = act.data()
         elementName = element.attribute("name")
         formElement = QWebElement(element)
@@ -1653,8 +1708,6 @@
         
         searchUrl = QUrl(self.page().mainFrame().baseUrl().resolved(
             QUrl(formElement.attribute("action"))))
-##        if searchUrl.scheme() != "http":
-##            return
         
         if qVersionTuple() >= (5, 0, 0):
             from PyQt5.QtCore import QUrlQuery
--- a/Helpviewer/HelpTabWidget.py	Wed Feb 07 20:14:09 2018 +0100
+++ b/Helpviewer/HelpTabWidget.py	Thu Feb 08 18:57:11 2018 +0100
@@ -203,9 +203,11 @@
         self.__tabBackContextMenu.addSeparator()
         self.__restoreClosedTabAct = self.__tabBackContextMenu.addAction(
             UI.PixmapCache.getIcon("trash.png"),
-            self.tr('Restore Closed Tab'), self.restoreClosedTab)
+            self.tr('Restore Closed Tab'))
         self.__restoreClosedTabAct.setEnabled(False)
         self.__restoreClosedTabAct.setData(0)
+        self.__restoreClosedTabAct.triggered.connect(
+            lambda: self.restoreClosedTab(self.__restoreClosedTabAct))
     
     def __showContextMenu(self, coord, index):
         """
@@ -328,7 +330,8 @@
                 self.__historyCompletionModel, self)
             self.__historyCompleter.activated[str].connect(self.__pathSelected)
         urlbar.setCompleter(self.__historyCompleter)
-        urlbar.returnPressed.connect(self.__lineEditReturnPressed)
+        urlbar.returnPressed.connect(
+            lambda: self.__lineEditReturnPressed(urlbar))
         if position == -1:
             self.__stackedUrlBar.addWidget(urlbar)
         else:
@@ -337,18 +340,23 @@
         browser = HelpBrowser(self.__mainWindow, self)
         urlbar.setBrowser(browser)
         
-        browser.sourceChanged.connect(self.__sourceChanged)
-        browser.titleChanged.connect(self.__titleChanged)
+        browser.sourceChanged.connect(
+            lambda url: self.__sourceChanged(url, browser))
+        browser.titleChanged.connect(
+            lambda title: self.__titleChanged(title, browser))
         browser.highlighted.connect(self.showMessage)
         browser.backwardAvailable.connect(
             self.__mainWindow.setBackwardAvailable)
         browser.forwardAvailable.connect(self.__mainWindow.setForwardAvailable)
-        browser.loadStarted.connect(self.__loadStarted)
-        browser.loadFinished.connect(self.__loadFinished)
-        browser.iconChanged.connect(self.__iconChanged)
+        browser.loadStarted.connect(
+            lambda: self.__loadStarted(browser))
+        browser.loadFinished.connect(
+            lambda ok: self.__loadFinished(ok, browser))
+        browser.faviconChanged.connect(
+            lambda: self.__iconChanged(browser))
         browser.search.connect(self.newBrowser)
         browser.page().windowCloseRequested.connect(
-            self.__windowCloseRequested)
+            lambda: self.__windowCloseRequested(browser.page()))
         browser.page().printRequested.connect(self.__printRequested)
         browser.zoomValueChanged.connect(self.browserZoomValueChanged)
         
@@ -417,14 +425,13 @@
         if index is not None:
             self.setCurrentIndex(index)
     
-    def __windowCloseRequested(self):
+    def __windowCloseRequested(self, page):
         """
         Private slot to handle the windowCloseRequested signal of a browser.
+        
+        @param page reference to the web page
+        @type HelpWebPage
         """
-        page = self.sender()
-        if page is None:
-            return
-        
         browser = page.view()
         if browser is None:
             return
@@ -672,34 +679,34 @@
                     """Please upgrade.</p>"""))
             return
     
-    def __sourceChanged(self, url):
+    def __sourceChanged(self, url, browser):
         """
         Private slot to handle a change of a browsers source.
         
-        @param url URL of the new site (QUrl)
+        @param url URL of the new site
+        @type QUrl
+        @param browser reference to the web browser
+        @type HelpBrowser
         """
-        browser = self.sender()
-        
-        if browser is not None:
-            self.sourceChanged.emit(browser, url)
+        self.sourceChanged.emit(browser, url)
     
-    def __titleChanged(self, title):
+    def __titleChanged(self, title, browser):
         """
         Private slot to handle a change of a browsers title.
         
-        @param title new title (string)
+        @param title new title
+        @type str
+        @param browser reference to the web browser
+        @type HelpBrowser
         """
-        browser = self.sender()
+        index = self.indexOf(browser)
+        if title == "":
+            title = browser.url().toString()
         
-        if browser is not None and isinstance(browser, QWidget):
-            index = self.indexOf(browser)
-            if title == "":
-                title = browser.url().toString()
-            
-            self.setTabText(index, self.__elide(title.replace("&", "&&")))
-            self.setTabToolTip(index, title)
-        
-            self.titleChanged.emit(browser, title)
+        self.setTabText(index, self.__elide(title.replace("&", "&&")))
+        self.setTabToolTip(index, title)
+    
+        self.titleChanged.emit(browser, title)
     
     def __elide(self, txt, mode=Qt.ElideRight, length=40):
         """
@@ -746,65 +753,63 @@
             self.tabCloseRequested.connect(self.closeBrowserAt)
             self.__closeButton.hide()
     
-    def __loadStarted(self):
+    def __loadStarted(self, browser):
         """
         Private method to handle the loadStarted signal.
-        """
-        browser = self.sender()
         
-        if browser is not None:
-            index = self.indexOf(browser)
-            anim = self.animationLabel(
-                index, os.path.join(getConfig("ericPixDir"), "loading.gif"),
-                100)
-            if not anim:
-                loading = QIcon(os.path.join(getConfig("ericPixDir"),
-                                "loading.gif"))
-                self.setTabIcon(index, loading)
-            else:
-                self.setTabIcon(index, QIcon())
-            self.setTabText(index, self.tr("Loading..."))
-            self.setTabToolTip(index, self.tr("Loading..."))
-            self.showMessage.emit(self.tr("Loading..."))
-            
-            self.__mainWindow.setLoadingActions(True)
+        @param browser reference to the web browser
+        @type HelpBrowser
+        """
+        index = self.indexOf(browser)
+        anim = self.animationLabel(
+            index, os.path.join(getConfig("ericPixDir"), "loading.gif"),
+            100)
+        if not anim:
+            loading = QIcon(os.path.join(getConfig("ericPixDir"),
+                            "loading.gif"))
+            self.setTabIcon(index, loading)
+        else:
+            self.setTabIcon(index, QIcon())
+        self.setTabText(index, self.tr("Loading..."))
+        self.setTabToolTip(index, self.tr("Loading..."))
+        self.showMessage.emit(self.tr("Loading..."))
+        
+        self.__mainWindow.setLoadingActions(True)
     
-    def __loadFinished(self, ok):
+    def __loadFinished(self, ok, browser):
         """
         Private method to handle the loadFinished signal.
         
-        @param ok flag indicating the result (boolean)
+        @param ok flag indicating the result
+        @type bool
+        @param browser reference to the web browser
+        @type HelpBrowser
         """
-        browser = self.sender()
-        if not isinstance(browser, HelpBrowser):
-            return
+        import Helpviewer.HelpWindow
+        index = self.indexOf(browser)
+        self.resetAnimation(index)
+        self.setTabIcon(
+            index, Helpviewer.HelpWindow.HelpWindow.icon(browser.url()))
+        if ok:
+            self.showMessage.emit(self.tr("Finished loading"))
+        else:
+            self.showMessage.emit(self.tr("Failed to load"))
         
-        if browser is not None:
-            import Helpviewer.HelpWindow
-            index = self.indexOf(browser)
-            self.resetAnimation(index)
-            self.setTabIcon(
-                index, Helpviewer.HelpWindow.HelpWindow.icon(browser.url()))
-            if ok:
-                self.showMessage.emit(self.tr("Finished loading"))
-            else:
-                self.showMessage.emit(self.tr("Failed to load"))
-            
-            self.__mainWindow.setLoadingActions(False)
+        self.__mainWindow.setLoadingActions(False)
     
-    def __iconChanged(self):
+    def __iconChanged(self, browser):
         """
         Private slot to handle the icon change.
+        
+        @param browser reference to the web browser
+        @type HelpBrowser
         """
-        browser = self.sender()
-        
-        if browser is not None and isinstance(browser, QWidget):
-            import Helpviewer.HelpWindow
-            self.setTabIcon(
-                self.indexOf(browser),
-                Helpviewer.HelpWindow.HelpWindow.icon(browser.url()))
-            Helpviewer.HelpWindow.HelpWindow.bookmarksManager()\
-                .iconChanged(browser.url())
+        import Helpviewer.HelpWindow
+        self.setTabIcon(
+            self.indexOf(browser),
+            Helpviewer.HelpWindow.HelpWindow.icon(browser.url()))
+        Helpviewer.HelpWindow.HelpWindow.bookmarksManager()\
+            .iconChanged(browser.url())
     
     def getSourceFileList(self):
         """
@@ -873,11 +878,13 @@
         """
         return self.__stackedUrlBar.currentWidget()
     
-    def __lineEditReturnPressed(self):
+    def __lineEditReturnPressed(self, edit):
         """
         Private slot to handle the entering of an URL.
+        
+        @param edit reference to the line edit
+        @type UrlBar
         """
-        edit = self.sender()
         url = self.__guessUrlFromPath(edit.text())
         request = QNetworkRequest(url)
         request.setRawHeader(b"X-Eric6-UserLoadAction", b"1")
@@ -947,14 +954,16 @@
             elif browser.url() != "":
                 browser.setFocus()
     
-    def restoreClosedTab(self):
+    def restoreClosedTab(self, act):
         """
         Public slot to restore the most recently closed tab.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
         if not self.canRestoreClosedTab():
             return
         
-        act = self.sender()
         tab = self.__closedTabsManager.getClosedTabAt(act.data())
         
         self.newBrowser(tab.url.toString(), position=tab.position)
@@ -995,9 +1004,10 @@
         index = 0
         for tab in self.__closedTabsManager.allClosedTabs():
             title = fm.elidedText(tab.title, Qt.ElideRight, maxWidth)
-            self.__closedTabsMenu.addAction(
-                self.__mainWindow.icon(tab.url), title,
-                self.restoreClosedTab).setData(index)
+            act = self.__closedTabsMenu.addAction(
+                self.__mainWindow.icon(tab.url), title)
+            act.setData(index)
+            act.triggered.connect(lambda: self.restoreClosedTab(act))
             index += 1
         self.__closedTabsMenu.addSeparator()
         self.__closedTabsMenu.addAction(
--- a/Helpviewer/History/HistoryMenu.py	Wed Feb 07 20:14:09 2018 +0100
+++ b/Helpviewer/History/HistoryMenu.py	Thu Feb 08 18:57:11 2018 +0100
@@ -404,9 +404,11 @@
         index = 0
         for tab in self.__tabWidget.closedTabsManager().allClosedTabs():
             title = fm.elidedText(tab.title, Qt.ElideRight, maxWidth)
-            self.__closedTabsMenu.addAction(
-                Helpviewer.HelpWindow.HelpWindow.icon(tab.url), title,
-                self.__tabWidget.restoreClosedTab).setData(index)
+            act = self.__closedTabsMenu.addAction(
+                Helpviewer.HelpWindow.HelpWindow.icon(tab.url), title)
+            act.setData(index)
+            act.triggered.connect(
+                lambda: self.__tabWidget.restoreClosedTab(act))
             index += 1
         self.__closedTabsMenu.addSeparator()
         self.__closedTabsMenu.addAction(
--- a/WebBrowser/History/HistoryMenu.py	Wed Feb 07 20:14:09 2018 +0100
+++ b/WebBrowser/History/HistoryMenu.py	Thu Feb 08 18:57:11 2018 +0100
@@ -424,10 +424,12 @@
         index = 0
         for tab in self.__tabWidget.closedTabsManager().allClosedTabs():
             title = fm.elidedText(tab.title, Qt.ElideRight, maxWidth)
-            self.__closedTabsMenu.addAction(
+            act = self.__closedTabsMenu.addAction(
                 WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(tab.url),
-                title,
-                self.__tabWidget.restoreClosedTab).setData(index)
+                title)
+            act.setData(index)
+            act.triggered.connect(
+                lambda: self.__tabWidget.restoreClosedTab(act))
             index += 1
         self.__closedTabsMenu.addSeparator()
         self.__closedTabsMenu.addAction(
--- a/WebBrowser/WebBrowserTabWidget.py	Wed Feb 07 20:14:09 2018 +0100
+++ b/WebBrowser/WebBrowserTabWidget.py	Thu Feb 08 18:57:11 2018 +0100
@@ -226,9 +226,11 @@
         self.__tabBackContextMenu.addSeparator()
         self.__restoreClosedTabAct = self.__tabBackContextMenu.addAction(
             UI.PixmapCache.getIcon("trash.png"),
-            self.tr('Restore Closed Tab'), self.restoreClosedTab)
+            self.tr('Restore Closed Tab'))
         self.__restoreClosedTabAct.setEnabled(False)
         self.__restoreClosedTabAct.setData(0)
+        self.__restoreClosedTabAct.triggered.connect(
+            lambda: self.restoreClosedTab(self.__restoreClosedTabAct))
     
     def __showContextMenu(self, coord, index):
         """
@@ -332,17 +334,15 @@
         page.setAudioMuted(not muted)
     
     @pyqtSlot(bool)
-    def __recentlyAudibleChanged(self, recentlyAudible):
+    def __recentlyAudibleChanged(self, recentlyAudible, page):
         """
         Private slot to react on the audible state of a page.
         
         @param recentlyAudible flag indicating the new audible state
         @type bool
+        @param page reference to the web page
+        @type WebBrowserPage
         """
-        page = self.sender()
-        if page is None:
-            return
-        
         browser = page.view()
         if browser is None:
             return
@@ -412,7 +412,8 @@
                 self.__historyCompletionModel, self)
             self.__historyCompleter.activated[str].connect(self.__pathSelected)
         urlbar.setCompleter(self.__historyCompleter)
-        urlbar.returnPressed.connect(self.__lineEditReturnPressed)
+        urlbar.returnPressed.connect(
+            lambda: self.__lineEditReturnPressed(urlbar))
         if position == -1:
             self.__stackedUrlBar.addWidget(urlbar)
         else:
@@ -421,22 +422,28 @@
         browser = WebBrowserView(self.__mainWindow, self)
         urlbar.setBrowser(browser)
         
-        browser.sourceChanged.connect(self.__sourceChanged)
-        browser.titleChanged.connect(self.__titleChanged)
+        browser.sourceChanged.connect(
+            lambda url: self.__sourceChanged(url, browser))
+        browser.titleChanged.connect(
+            lambda title: self.__titleChanged(title, browser))
         browser.highlighted.connect(self.showMessage)
         browser.backwardAvailable.connect(
             self.__mainWindow.setBackwardAvailable)
         browser.forwardAvailable.connect(self.__mainWindow.setForwardAvailable)
-        browser.loadStarted.connect(self.__loadStarted)
-        browser.loadFinished.connect(self.__loadFinished)
-        browser.faviconChanged.connect(self.__iconChanged)
+        browser.loadStarted.connect(
+            lambda: self.__loadStarted(browser))
+        browser.loadFinished.connect(
+            lambda ok: self.__loadFinished(ok, browser))
+        browser.faviconChanged.connect(
+            lambda: self.__iconChanged(browser))
         browser.search.connect(self.newBrowser)
         browser.page().windowCloseRequested.connect(
-            self.__windowCloseRequested)
+            lambda: self.__windowCloseRequested(browser.page()))
         browser.zoomValueChanged.connect(self.browserZoomValueChanged)
         if hasattr(WebBrowserPage, "recentlyAudibleChanged"):
             browser.page().recentlyAudibleChanged.connect(
-                self.__recentlyAudibleChanged)
+                lambda audible: self.__recentlyAudibleChanged(
+                    audible, browser.page()))
         
         if position == -1:
             index = self.addTab(browser, self.tr("..."))
@@ -514,14 +521,13 @@
         if index is not None:
             self.setCurrentIndex(index)
     
-    def __windowCloseRequested(self):
+    def __windowCloseRequested(self, page):
         """
         Private slot to handle the windowCloseRequested signal of a browser.
+        
+        @param page reference to the web page
+        @type WebBrowserPage
         """
-        page = self.sender()
-        if page is None:
-            return
-        
         browser = page.view()
         if browser is None:
             return
@@ -844,37 +850,37 @@
         browser.page().execPrintPage(printer, 10 * 1000)
         QApplication.restoreOverrideCursor()
     
-    def __sourceChanged(self, url):
+    def __sourceChanged(self, url, browser):
         """
         Private slot to handle a change of a browsers source.
         
-        @param url URL of the new site (QUrl)
+        @param url URL of the new site
+        @type QUrl
+        @param browser reference to the web browser
+        @type WebBrowserView
         """
-        browser = self.sender()
+        self.sourceChanged.emit(browser, url)
         
-        if browser is not None:
-            self.sourceChanged.emit(browser, url)
-            
-            if browser == self.currentBrowser():
-                self.currentUrlChanged.emit(url)
+        if browser == self.currentBrowser():
+            self.currentUrlChanged.emit(url)
     
-    def __titleChanged(self, title):
+    def __titleChanged(self, title, browser):
         """
         Private slot to handle a change of a browsers title.
         
-        @param title new title (string)
+        @param title new title
+        @type str
+        @param browser reference to the web browser
+        @type WebBrowserView
         """
-        browser = self.sender()
+        index = self.indexOf(browser)
+        if title == "":
+            title = browser.url().toString()
         
-        if browser is not None and isinstance(browser, QWidget):
-            index = self.indexOf(browser)
-            if title == "":
-                title = browser.url().toString()
-            
-            self.setTabText(index, self.__elide(title.replace("&", "&&")))
-            self.setTabToolTip(index, title)
-        
-            self.titleChanged.emit(browser, title)
+        self.setTabText(index, self.__elide(title.replace("&", "&&")))
+        self.setTabToolTip(index, title)
+    
+        self.titleChanged.emit(browser, title)
     
     def __elide(self, txt, mode=Qt.ElideRight, length=40):
         """
@@ -919,64 +925,62 @@
             self.tabCloseRequested.connect(self.closeBrowserAt)
             self.__closeButton.hide()
     
-    def __loadStarted(self):
+    def __loadStarted(self, browser):
         """
         Private method to handle the loadStarted signal.
-        """
-        browser = self.sender()
         
-        if browser is not None:
-            index = self.indexOf(browser)
-            anim = self.animationLabel(
-                index, os.path.join(getConfig("ericPixDir"), "loading.gif"),
-                100)
-            if not anim:
-                loading = QIcon(os.path.join(getConfig("ericPixDir"),
-                                "loading.gif"))
-                self.setTabIcon(index, loading)
-            else:
-                self.setTabIcon(index, QIcon())
-            self.setTabText(index, self.tr("Loading..."))
-            self.setTabToolTip(index, self.tr("Loading..."))
-            self.showMessage.emit(self.tr("Loading..."))
-            
-            self.__mainWindow.setLoadingActions(True)
+        @param browser reference to the web browser
+        @type WebBrowserView
+        """
+        index = self.indexOf(browser)
+        anim = self.animationLabel(
+            index, os.path.join(getConfig("ericPixDir"), "loading.gif"),
+            100)
+        if not anim:
+            loading = QIcon(os.path.join(getConfig("ericPixDir"),
+                            "loading.gif"))
+            self.setTabIcon(index, loading)
+        else:
+            self.setTabIcon(index, QIcon())
+        self.setTabText(index, self.tr("Loading..."))
+        self.setTabToolTip(index, self.tr("Loading..."))
+        self.showMessage.emit(self.tr("Loading..."))
+        
+        self.__mainWindow.setLoadingActions(True)
     
-    def __loadFinished(self, ok):
+    def __loadFinished(self, ok, browser):
         """
         Private method to handle the loadFinished signal.
         
-        @param ok flag indicating the result (boolean)
+        @param ok flag indicating the result
+        @type bool
+        @param browser reference to the web browser
+        @type WebBrowserView
         """
-        browser = self.sender()
-        if not isinstance(browser, WebBrowserView):
-            return
+        import WebBrowser.WebBrowserWindow
+        index = self.indexOf(browser)
+        self.resetAnimation(index)
+        self.setTabIcon(
+            index, WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(
+                browser.url()))
+        if ok:
+            self.showMessage.emit(self.tr("Finished loading"))
+        else:
+            self.showMessage.emit(self.tr("Failed to load"))
         
-        if browser is not None:
-            import WebBrowser.WebBrowserWindow
-            index = self.indexOf(browser)
-            self.resetAnimation(index)
-            self.setTabIcon(
-                index, WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(
-                    browser.url()))
-            if ok:
-                self.showMessage.emit(self.tr("Finished loading"))
-            else:
-                self.showMessage.emit(self.tr("Failed to load"))
-            
-            self.__mainWindow.setLoadingActions(False)
+        self.__mainWindow.setLoadingActions(False)
     
-    def __iconChanged(self):
+    def __iconChanged(self, browser):
         """
         Private slot to handle a change of the web site icon.
+        
+        @param browser reference to the web browser
+        @type WebBrowserView
         """
-        browser = self.sender()
-        
-        if browser is not None and isinstance(browser, QWidget):
-            self.setTabIcon(
-                self.indexOf(browser),
-                browser.icon())
-            self.__mainWindow.bookmarksManager().faviconChanged(browser.url())
+        self.setTabIcon(
+            self.indexOf(browser),
+            browser.icon())
+        self.__mainWindow.bookmarksManager().faviconChanged(browser.url())
     
     def getSourceFileList(self):
         """
@@ -1046,11 +1050,13 @@
         """
         return self.__stackedUrlBar.currentWidget()
     
-    def __lineEditReturnPressed(self):
+    def __lineEditReturnPressed(self, edit):
         """
         Private slot to handle the entering of an URL.
+        
+        @param edit reference to the line edit
+        @type UrlBar
         """
-        edit = self.sender()
         url = self.__guessUrlFromPath(edit.text())
         if e5App().keyboardModifiers() == Qt.AltModifier:
             self.newBrowser(url)
@@ -1116,14 +1122,16 @@
             elif browser.url() != "":
                 browser.setFocus()
     
-    def restoreClosedTab(self):
+    def restoreClosedTab(self, act):
         """
         Public slot to restore the most recently closed tab.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
         if not self.canRestoreClosedTab():
             return
         
-        act = self.sender()
         tab = self.__closedTabsManager.getClosedTabAt(act.data())
         
         self.newBrowser(tab.url.toString(), position=tab.position)
@@ -1164,9 +1172,10 @@
         index = 0
         for tab in self.__closedTabsManager.allClosedTabs():
             title = fm.elidedText(tab.title, Qt.ElideRight, maxWidth)
-            self.__closedTabsMenu.addAction(
-                self.__mainWindow.icon(tab.url), title,
-                self.restoreClosedTab).setData(index)
+            act = self.__closedTabsMenu.addAction(
+                self.__mainWindow.icon(tab.url), title)
+            act.setData(index)
+            act.triggered.connect(lambda: self.restoreClosedTab(act))
             index += 1
         self.__closedTabsMenu.addSeparator()
         self.__closedTabsMenu.addAction(
--- a/WebBrowser/WebBrowserView.py	Wed Feb 07 20:14:09 2018 +0100
+++ b/WebBrowser/WebBrowserView.py	Thu Feb 08 18:57:11 2018 +0100
@@ -556,10 +556,10 @@
                 boldFont.setBold(True)
                 
                 for suggestion in contextMenuData.spellCheckerSuggestions():
-                    act = menu.addAction(
-                        suggestion,
-                        self.__replaceMisspelledWord)
+                    act = menu.addAction(suggestion)
                     act.setFont(boldFont)
+                    act.triggered.connect(
+                        lambda: self.__replaceMisspelledWord)(act)
                 
                 if not bool(menu.actions()):
                     menu.addAction(self.tr("No suggestions")).setEnabled(False)
@@ -614,41 +614,55 @@
         if not menu.isEmpty():
             menu.addSeparator()
         
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("openNewTab.png"),
-            self.tr("Open Link in New Tab\tCtrl+LMB"),
-            self.__openLinkInNewTab).setData(hitTest.linkUrl())
-        menu.addAction(
+            self.tr("Open Link in New Tab\tCtrl+LMB"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__openLinkInNewTab(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("newWindow.png"),
-            self.tr("Open Link in New Window"),
-            self.__openLinkInNewWindow).setData(hitTest.linkUrl())
-        menu.addAction(
+            self.tr("Open Link in New Window"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__openLinkInNewWindow(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("privateMode.png"),
-            self.tr("Open Link in New Private Window"),
-            self.__openLinkInNewPrivateWindow).setData(hitTest.linkUrl())
+            self.tr("Open Link in New Private Window"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__openLinkInNewPrivateWindow(act))
         menu.addSeparator()
         menu.addAction(
             UI.PixmapCache.getIcon("download.png"),
             self.tr("Save Lin&k"), self.__downloadLink)
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("bookmark22.png"),
-            self.tr("Bookmark this Link"), self.__bookmarkLink)\
-            .setData(hitTest.linkUrl())
+            self.tr("Bookmark this Link"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__bookmarkLink(act))
         menu.addSeparator()
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("editCopy.png"),
-            self.tr("Copy Link to Clipboard"), self.__copyLink)\
-            .setData(hitTest.linkUrl())
-        menu.addAction(
+            self.tr("Copy Link to Clipboard"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__copyLink(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Link"),
-            self.__sendLink).setData(hitTest.linkUrl())
+            self.tr("Send Link"))
+        act.setData(hitTest.linkUrl())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         if Preferences.getWebBrowser("VirusTotalEnabled") and \
            Preferences.getWebBrowser("VirusTotalServiceKey") != "":
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("virustotal.png"),
-                self.tr("Scan Link with VirusTotal"),
-                self.__virusTotal).setData(hitTest.linkUrl())
+                self.tr("Scan Link with VirusTotal"))
+            act.setData(hitTest.linkUrl())
+            act.triggered.connect(
+                lambda: self.__virusTotal(act))
         
     def __createImageContextMenu(self, menu, hitTest):
         """
@@ -662,57 +676,69 @@
         if not menu.isEmpty():
             menu.addSeparator()
         
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("openNewTab.png"),
-            self.tr("Open Image in New Tab"),
-            self.__openLinkInNewTab).setData(hitTest.imageUrl())
+            self.tr("Open Image in New Tab"))
+        act.setData(hitTest.imageUrl())
+        act.triggered.connect(
+            lambda: self.__openLinkInNewTab(act))
         menu.addSeparator()
         menu.addAction(
             UI.PixmapCache.getIcon("download.png"),
             self.tr("Save Image"), self.__downloadImage)
         menu.addAction(
             self.tr("Copy Image to Clipboard"), self.__copyImage)
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("editCopy.png"),
-            self.tr("Copy Image Location to Clipboard"),
-            self.__copyLink).setData(hitTest.imageUrl())
-        menu.addAction(
+            self.tr("Copy Image Location to Clipboard"))
+        act.setData(hitTest.imageUrl())
+        act.triggered.connect(
+            lambda: self.__copyLink(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Image Link"),
-            self.__sendLink).setData(hitTest.imageUrl())
+            self.tr("Send Image Link"))
+        act.setData(hitTest.imageUrl())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         
         if hitTest.imageUrl().scheme() in ["http", "https"]:
             menu.addSeparator()
             engine = WebBrowserWindow.imageSearchEngine()
             searchEngineName = engine.searchEngine()
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("{0}.png".format(
                     searchEngineName.lower())),
-                self.tr("Search image in {0}").format(searchEngineName),
-                self.__searchImage).setData(
-                    engine.getSearchQuery(hitTest.imageUrl()))
+                self.tr("Search image in {0}").format(searchEngineName))
+            act.setData(engine.getSearchQuery(hitTest.imageUrl()))
+            act.triggered.connect(
+                lambda: self.__searchImage(act))
             self.__imageSearchMenu = menu.addMenu(
                 self.tr("Search image with..."))
             for searchEngineName in engine.searchEngineNames():
-                self.__imageSearchMenu.addAction(
+                act = self.__imageSearchMenu.addAction(
                     UI.PixmapCache.getIcon("{0}.png".format(
                         searchEngineName.lower())),
-                    self.tr("Search image in {0}").format(searchEngineName),
-                    self.__searchImage).setData(
-                        engine.getSearchQuery(
-                            hitTest.imageUrl(), searchEngineName))
+                    self.tr("Search image in {0}").format(searchEngineName))
+                act.setData(engine.getSearchQuery(
+                    hitTest.imageUrl(), searchEngineName))
+                act.triggered.connect(
+                    lambda: self.__searchImage(act))
         
         menu.addSeparator()
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("adBlockPlus.png"),
-            self.tr("Block Image"), self.__blockImage)\
-            .setData(hitTest.imageUrl().toString())
+            self.tr("Block Image"))
+        act.setData(hitTest.imageUrl().toString())
+        act.triggered.connect(
+            lambda: self.__blockImage(act))
         if Preferences.getWebBrowser("VirusTotalEnabled") and \
            Preferences.getWebBrowser("VirusTotalServiceKey") != "":
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("virustotal.png"),
-                self.tr("Scan Image with VirusTotal"),
-                self.__virusTotal).setData(hitTest.imageUrl())
+                self.tr("Scan Image with VirusTotal"))
+            act.setData(hitTest.imageUrl())
+            act.triggered.connect(
+                lambda: self.__virusTotal(act))
     
     def __createMediaContextMenu(self, menu, hitTest):
         """
@@ -743,14 +769,18 @@
                 UI.PixmapCache.getIcon("audioVolumeMuted.png"),
                 self.tr("Mute"), self.__muteMedia)
         menu.addSeparator()
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("editCopy.png"),
-            self.tr("Copy Media Address to Clipboard"),
-            self.__copyLink).setData(hitTest.mediaUrl())
-        menu.addAction(
+            self.tr("Copy Media Address to Clipboard"))
+        act.setData(hitTest.mediaUrl())
+        act.triggered.connect(
+            lambda: self.__copyLink(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Media Address"), self.__sendLink)\
-            .setData(hitTest.mediaUrl())
+            self.tr("Send Media Address"))
+        act.setData(hitTest.mediaUrl())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         menu.addAction(
             UI.PixmapCache.getIcon("download.png"),
             self.tr("Save Media"), self.__downloadMedia)
@@ -769,10 +799,12 @@
         
         menu.addAction(self.__mw.copyAct)
         menu.addSeparator()
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Text"),
-            self.__sendLink).setData(self.selectedText())
+            self.tr("Send Text"))
+        act.setData(self.selectedText())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         
         engineName = self.__mw.openSearchManager().currentEngineName()
         if engineName:
@@ -804,24 +836,29 @@
             googleTranslatorUrl = QUrl(
                 "http://translate.google.com/#auto/{0}/{1}".format(
                     langCode, self.selectedText()))
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("translate.png"),
-                self.tr("Google Translate"), self.__openLinkInNewTab)\
-                .setData(googleTranslatorUrl)
+                self.tr("Google Translate"))
+            act.setData(googleTranslatorUrl)
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
             wiktionaryUrl = QUrl(
                 "http://{0}.wiktionary.org/wiki/Special:Search?search={1}"
                 .format(langCode, self.selectedText()))
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("wikipedia.png"),
-                self.tr("Dictionary"), self.__openLinkInNewTab)\
-                .setData(wiktionaryUrl)
+                self.tr("Dictionary"))
+            act.setData(wiktionaryUrl)
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
             menu.addSeparator()
         
         guessedUrl = QUrl.fromUserInput(self.selectedText().strip())
         if self.__isUrlValid(guessedUrl):
-            menu.addAction(
-                self.tr("Go to web address"),
-                self.__openLinkInNewTab).setData(guessedUrl)
+            act = menu.addAction(self.tr("Go to web address"))
+            act.setData(guessedUrl)
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
     
     def __createPageContextMenu(self, menu):
         """
@@ -860,12 +897,18 @@
         menu.addAction(
             UI.PixmapCache.getIcon("bookmark22.png"),
             self.tr("Bookmark this Page"), self.addBookmark)
-        menu.addAction(
+        act = menu.addAction(
             UI.PixmapCache.getIcon("editCopy.png"),
-            self.tr("Copy Page Link"), self.__copyLink).setData(self.url())
-        menu.addAction(
+            self.tr("Copy Page Link"))
+        act.setData(self.url())
+        act.triggered.connect(
+            lambda: self.__copyLink(act))
+        act = menu.addAction(
             UI.PixmapCache.getIcon("mailSend.png"),
-            self.tr("Send Page Link"), self.__sendLink).setData(self.url())
+            self.tr("Send Page Link"))
+        act.setData(self.url())
+        act.triggered.connect(
+            lambda: self.__sendLink(act))
         menu.addSeparator()
         
         from .UserAgent.UserAgentMenu import UserAgentMenu
@@ -896,10 +939,12 @@
             w3url = QUrl.fromEncoded(
                 b"http://validator.w3.org/check?uri=" +
                 QUrl.toPercentEncoding(bytes(self.url().toEncoded()).decode()))
-            menu.addAction(
+            act = menu.addAction(
                 UI.PixmapCache.getIcon("w3.png"),
-                self.tr("Validate Page"), self.__openLinkInNewTab)\
-                .setData(w3url)
+                self.tr("Validate Page"))
+            act.setData(w3url)
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
             
             from .WebBrowserLanguagesDialog import WebBrowserLanguagesDialog
             languages = Preferences.toList(
@@ -915,11 +960,13 @@
                     b"&u=" +
                     QUrl.toPercentEncoding(
                         bytes(self.url().toEncoded()).decode()))
-                menu.addAction(
+                act = menu.addAction(
                     UI.PixmapCache.getIcon("translate.png"),
-                    self.tr("Google Translate"), self.__openLinkInNewTab)\
-                    .setData(googleTranslatorUrl)
-        
+                    self.tr("Google Translate"))
+                act.setData(googleTranslatorUrl)
+            act.triggered.connect(
+                lambda: self.__openLinkInNewTab(act))
+    
     def __checkForForm(self, act, pos):
         """
         Private method to check the given position for an open search form.
@@ -970,55 +1017,65 @@
             bool(url.scheme()) and \
             "." in url.host()
     
-    def __replaceMisspelledWord(self):
+    def __replaceMisspelledWord(self, act):
         """
         Private slot to replace a misspelled word under the context menu.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         suggestion = act.text()
         self.page().replaceMisspelledWord(suggestion)
     
-    def __openLinkInNewTab(self):
+    def __openLinkInNewTab(self, act):
         """
         Private method called by the context menu to open a link in a new
         tab.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         if url.isEmpty():
             return
         
         self.setSource(url, newTab=True)
     
-    def __openLinkInNewWindow(self):
+    def __openLinkInNewWindow(self, act):
         """
         Private slot called by the context menu to open a link in a new
         window.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         if url.isEmpty():
             return
         
         self.__mw.newWindow(url)
     
-    def __openLinkInNewPrivateWindow(self):
+    def __openLinkInNewPrivateWindow(self, act):
         """
         Private slot called by the context menu to open a link in a new
         private window.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         if url.isEmpty():
             return
         
         self.__mw.newPrivateWindow(url)
     
-    def __bookmarkLink(self):
+    def __bookmarkLink(self, act):
         """
         Private slot to bookmark a link via the context menu.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         if url.isEmpty():
             return
@@ -1028,11 +1085,13 @@
         dlg.setUrl(bytes(url.toEncoded()).decode())
         dlg.exec_()
     
-    def __sendLink(self):
+    def __sendLink(self, act):
         """
         Private slot to send a link via email.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         data = act.data()
         if isinstance(data, QUrl) and data.isEmpty():
             return
@@ -1041,11 +1100,13 @@
             data = data.toString()
         QDesktopServices.openUrl(QUrl("mailto:?body=" + data))
     
-    def __copyLink(self):
+    def __copyLink(self, act):
         """
         Private slot to copy a link to the clipboard.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         data = act.data()
         if isinstance(data, QUrl) and data.isEmpty():
             return
@@ -1072,20 +1133,24 @@
         """
         self.triggerPageAction(QWebEnginePage.CopyImageToClipboard)
     
-    def __blockImage(self):
+    def __blockImage(self, act):
         """
         Private slot to add a block rule for an image URL.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         dlg = WebBrowserWindow.adBlockManager().showDialog()
         dlg.addCustomRule(url)
     
-    def __searchImage(self):
+    def __searchImage(self, act):
         """
         Private slot to search for an image URL.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         self.setSource(url, newTab=True)
     
@@ -1107,11 +1172,13 @@
         """
         self.triggerPageAction(QWebEnginePage.ToggleMediaMute)
     
-    def __virusTotal(self):
+    def __virusTotal(self, act):
         """
         Private slot to scan the selected URL with VirusTotal.
+        
+        @param act reference to the action that triggered
+        @type QAction
         """
-        act = self.sender()
         url = act.data()
         self.__mw.requestVirusTotalScan(url)
     

eric ide

mercurial