diff -r 4fdbb36fe794 -r 93f95c4b3153 WebBrowser/WebBrowserView.py --- a/WebBrowser/WebBrowserView.py Sat Feb 18 12:23:35 2017 +0100 +++ b/WebBrowser/WebBrowserView.py Sat Feb 18 19:59:14 2017 +0100 @@ -17,13 +17,14 @@ import os from PyQt5.QtCore import pyqtSignal, QUrl, QFileInfo, Qt, QTimer, QEvent, \ - QPoint, QDateTime, qVersion + QPoint, QDateTime, qVersion, QStandardPaths from PyQt5.QtGui import QDesktopServices, QClipboard, QIcon, \ QContextMenuEvent, QPixmap from PyQt5.QtWidgets import qApp, QStyle, QMenu, QApplication -from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage +from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage, \ + QWebEngineDownloadItem -from E5Gui import E5MessageBox +from E5Gui import E5MessageBox, E5FileDialog from WebBrowser.WebBrowserWindow import WebBrowserWindow from .WebBrowserPage import WebBrowserPage @@ -503,6 +504,28 @@ @type WebHitTestResult """ # TODO: Qt 5.8 - add support for spell checking + spellCheckActionCount = 0 + if qVersion() >= "5.7.0": + contextMenuData = self.page().contextMenuData() + hitTest.updateWithContextMenuData(contextMenuData) + + if qVersion() >= "5.8.0" and \ + bool(contextMenuData.misspelledWord()): + boldFont = menu.font() + boldFont.setBold(True) + + for suggestion in contextMenuData.spellCheckerSuggestions(): + act = menu.addAction( + suggestion, + lambda: self.page().replaceMisspelledWord(suggestion)) + act.setFont(boldFont) + + if bool(menu.actions()): + menu.addAction(self.tr("No suggestions")).setEnabled(False) + + menu.addSeparator() + spellCheckActionCount = len(menu.actions()) + if not hitTest.linkUrl().isEmpty() and \ hitTest.linkUrl().scheme() != "javascript": self.__createLinkContextMenu(menu, hitTest) @@ -514,15 +537,17 @@ self.__createMediaContextMenu(menu, hitTest) if hitTest.isContentEditable(): - menu.addAction(self.__mw.undoAct) - menu.addAction(self.__mw.redoAct) - menu.addSeparator() - menu.addAction(self.__mw.cutAct) - menu.addAction(self.__mw.copyAct) - menu.addAction(self.__mw.pasteAct) - menu.addSeparator() - self.__mw.personalInformationManager().createSubMenu( - menu, self, hitTest) + # check, if only spell checker actions were added + if len(menu.actions()) == spellCheckActionCount: + menu.addAction(self.__mw.undoAct) + menu.addAction(self.__mw.redoAct) + menu.addSeparator() + menu.addAction(self.__mw.cutAct) + menu.addAction(self.__mw.copyAct) + menu.addAction(self.__mw.pasteAct) + menu.addSeparator() + self.__mw.personalInformationManager().createSubMenu( + menu, self, hitTest) if hitTest.tagName() == "input": menu.addSeparator() @@ -1340,7 +1365,6 @@ """ # find the render widget receiving events for the web page if obj is self and evt.type() == QEvent.ChildAdded: - # TODO: Qt 5.8 - check, if this still works on 5.8 (see Qupzilla) child = evt.child() if child and child.inherits( "QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget"): @@ -1615,8 +1639,76 @@ if url.isEmpty(): return - # TODO: Qt 5.8 - use QWebEnginePage.save() - self.triggerPageAction(QWebEnginePage.SavePage) + if qVersion() >= "5.8.0": + # since Qt 5.8.0 + fileName, savePageFormat = self.__getSavePageFileNameAndFormat() + if fileName: + self.page().save(fileName, savePageFormat) + else: + self.triggerPageAction(QWebEnginePage.SavePage) + + def __getSavePageFileNameAndFormat(self): + """ + Private method to get the file name to save the page to. + + @return tuple containing the file name to save to and the + save page format + @rtype tuple of (str, QWebEngineDownloadItem.SavePageFormat) + """ + documentLocation = QStandardPaths.writableLocation( + QStandardPaths.DocumentsLocation) + filterList = [ + self.tr("Web Archive (*.mhtml *.mht)"), + self.tr("HTML File (*.html *.htm)"), + self.tr("HTML File with all resources (*.html *.htm)"), + ] + extensionsList = [ + # tuple of extensions for *nix and Windows + # keep in sync with filters list + (".mhtml", ".mht"), + (".html", ".htm"), + (".html", ".htm"), + ] + if self.url().fileName(): + defaultFileName = os.path.join(documentLocation, + self.url().fileName()) + else: + defaultFileName = os.path.join(documentLocation, + self.page().title()) + if Utilities.isWindowsPlatform(): + defaultFileName += ".mht" + else: + defaultFileName += ".mhtml" + + fileName = "" + saveFormat = QWebEngineDownloadItem.MimeHtmlSaveFormat + + fileName, selectedFilter = E5FileDialog.getSaveFileNameAndFilter( + None, + self.tr("Save Web Page"), + defaultFileName, + ";;".join(filterList), + None) + if fileName: + index = filterList.index(selectedFilter) + if index == 0: + saveFormat = QWebEngineDownloadItem.MimeHtmlSaveFormat + elif index == 1: + saveFormat = QWebEngineDownloadItem.SingleHtmlSaveFormat + else: + saveFormat = QWebEngineDownloadItem.CompleteHtmlSaveFormat + + extension = os.path.splitext(fileName)[1] + if not extension: + # add the platform specific default extension + if Utilities.isWindowsPlatform(): + extensionsIndex = 1 + else: + extensionsIndex = 0 + extensions = extensionsList[index] + fileName += extensions[extensionsIndex] + + return fileName, saveFormat ########################################################################### ## Miscellaneous methods below