--- a/Helpviewer/HelpBrowserWV.py Sun Feb 04 10:56:30 2018 +0100 +++ b/Helpviewer/HelpBrowserWV.py Fri Mar 02 19:35:16 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