diff -r 0c976706e8c1 -r bace7fb85a01 WebBrowser/WebBrowserView.py --- a/WebBrowser/WebBrowserView.py Sun Feb 04 10:56:30 2018 +0100 +++ b/WebBrowser/WebBrowserView.py Fri Mar 02 19:35:16 2018 +0100 @@ -16,9 +16,9 @@ import os -from PyQt5.QtCore import pyqtSignal, PYQT_VERSION, Qt, QUrl, QFileInfo, \ - QTimer, QEvent, QPoint, QPointF, QDateTime, QStandardPaths, QByteArray, \ - QIODevice, QDataStream +from PyQt5.QtCore import pyqtSignal, pyqtSlot, PYQT_VERSION, Qt, QUrl, \ + QFileInfo, QTimer, QEvent, QPoint, QPointF, QDateTime, QStandardPaths, \ + QByteArray, QIODevice, QDataStream from PyQt5.QtGui import QDesktopServices, QClipboard, QIcon, \ QContextMenuEvent, QPixmap from PyQt5.QtWidgets import qApp, QStyle, QMenu, QApplication @@ -152,6 +152,7 @@ self.__page.safeBrowsingAbort.connect(self.safeBrowsingAbort) self.__page.safeBrowsingBad.connect(self.safeBrowsingBad) + self.__page.printRequested.connect(self.__printPage) def __setRwhvqt(self): """ @@ -188,6 +189,11 @@ @param url URL to be loaded @type QUrl """ + if self.__page is not None and \ + not self.__page.acceptNavigationRequest( + url, QWebEnginePage.NavigationTypeTyped, True): + return + super(WebBrowserView, self).load(url) if not self.__firstLoad: @@ -556,10 +562,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 +620,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 +682,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 +775,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 +805,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 +842,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): """ @@ -835,7 +878,8 @@ menu.addSeparator() if self.__mw.saveAsAct is not None: menu.addAction(self.__mw.saveAsAct) - menu.addSeparator() + menu.addAction(self.__mw.saveVisiblePageScreenAct) + menu.addSeparator() if self.url().toString() == "eric:speeddial": # special menu for the spedd dial page @@ -860,12 +904,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 +946,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 +967,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 +1024,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 +1092,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 +1107,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 +1140,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 +1179,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) @@ -1163,13 +1237,16 @@ """ Private slot to show the web inspector window. """ - if self.__inspector is None: - from .WebInspector import WebInspector - self.__inspector = WebInspector() - self.__inspector.setView(self, True) - self.__inspector.show() - else: - self.closeWebInspector() + from .WebInspector import WebInspector + if WebInspector.isEnabled(): + if self.__inspector is None: + self.__inspector = WebInspector() + self.__inspector.setView(self, True) + self.__inspector.inspectorClosed.connect( + self.closeWebInspector) + self.__inspector.show() + else: + self.closeWebInspector() def closeWebInspector(self): """ @@ -1562,6 +1639,29 @@ from .Tools import WebIconProvider return WebIconProvider.instance().iconForUrl(self.url()) + def title(self): + """ + Public method to get the view title. + + @return view title + @rtype str + """ + titleStr = super(WebBrowserView, self).title() + if not titleStr: + if self.url().isEmpty(): + url = self.__page.requestedUrl() + else: + url = self.url() + + titleStr = url.host() + if not titleStr: + titleStr = url.toString(QUrl.RemoveFragment) + + if not titleStr or titleStr == "about:blank": + titleStr = self.tr("Empty Page") + + return titleStr + def __linkHovered(self, link): """ Private slot to handle the linkHovered signal. @@ -2081,3 +2181,14 @@ return self.__page.getSafeBrowsingStatus() else: return True + + ########################################################################### + ## Methods below implement print support from the page + ########################################################################### + + @pyqtSlot() + def __printPage(self): + """ + Private slot to support printing from the web page. + """ + self.__mw.tabWidget.printBrowser(browser=self)