Sat, 05 Mar 2016 16:44:41 +0100
Continued porting the web browser.
- adjusted the default mode of the configuration dialog to handle the QtWebEngine based browser
- adjusted the install and uninstall scripts
--- a/Preferences/ConfigurationDialog.py Sat Mar 05 14:34:49 2016 +0100 +++ b/Preferences/ConfigurationDialog.py Sat Mar 05 16:44:41 2016 +0100 @@ -82,7 +82,7 @@ WebBrowserMode = 4 def __init__(self, parent=None, fromEric=True, displayMode=DefaultMode, - expandedEntries=[]): + expandedEntries=[], webEngine=False): """ Constructor @@ -95,6 +95,7 @@ @exception RuntimeError raised to indicate an invalid dialog mode @keyparam expandedEntries list of entries to be shown expanded (list of strings) + @keyparam webEngine flag indicating QtWebEngine is used (bool) """ assert displayMode in ( ConfigurationWidget.DefaultMode, @@ -107,6 +108,7 @@ super(ConfigurationWidget, self).__init__(parent) self.fromEric = fromEric self.displayMode = displayMode + self.__webEngine = webEngine self.__setupUi() @@ -319,25 +321,49 @@ [self.tr("Viewmanager"), "preferences-viewmanager.png", "ViewmanagerPage", "0interfacePage", None], } - try: - from PyQt5 import QtWebKit # __IGNORE_WARNING__ + if webEngine: self.configItems.update({ - "helpAppearancePage": + "0webBrowserPage": + [self.tr("Web Browser"), "ericWeb.png", + None, None, None], + "webBrowserAppearancePage": [self.tr("Appearance"), "preferences-styles.png", - "HelpAppearancePage", "0helpPage", None], + "WebBrowserAppearancePage", "0webBrowserPage", None], + "webBrowserPage": + [self.tr("eric6 Web Browser"), "ericWeb.png", + "WebBrowserPage", "0webBrowserPage", None], "helpFlashCookieManagerPage": [self.tr("Flash Cookie Manager"), "flashCookie16.png", - "HelpFlashCookieManagerPage", "0helpPage", None], + "HelpFlashCookieManagerPage", "0webBrowserPage", None], "helpVirusTotalPage": [self.tr("VirusTotal Interface"), "virustotal.png", - "HelpVirusTotalPage", "0helpPage", None], - "helpWebBrowserPage": - [self.tr("eric6 Web Browser"), "ericWeb.png", - "HelpWebBrowserPage", "0helpPage", None], + "HelpVirusTotalPage", "0webBrowserPage", None], }) - except ImportError: - pass + else: + try: + from PyQt5 import QtWebKit # __IGNORE_WARNING__ + self.configItems.update({ + "0helpBrowserPage": + [self.tr("Web Browser"), "ericWeb.png", + None, None, None], + "helpAppearancePage": + [self.tr("Appearance"), "preferences-styles.png", + "HelpAppearancePage", "0helpBrowserPage", None], + "helpWebBrowserPage": + [self.tr("eric6 Web Browser"), "ericWeb.png", + "HelpWebBrowserPage", "0helpBrowserPage", None], + "helpFlashCookieManagerPage": + [self.tr("Flash Cookie Manager"), + "flashCookie16.png", + "HelpFlashCookieManagerPage", "0helpBrowserPage", + None], + "helpVirusTotalPage": + [self.tr("VirusTotal Interface"), "virustotal.png", + "HelpVirusTotalPage", "0helpBrowserPage", None], + }) + except ImportError: + pass self.configItems.update( e5App().getObject("PluginManager").getPluginConfigData()) @@ -363,30 +389,27 @@ [self.tr("Security"), "preferences-security.png", "SecurityPage", None, None], - "0helpPage": - [self.tr("Help"), "preferences-help.png", - None, None, None], "helpDocumentationPage": [self.tr("Help Documentation"), "preferences-helpdocumentation.png", - "HelpDocumentationPage", "0helpPage", None], + "HelpDocumentationPage", None, None], } try: from PyQt5 import QtWebKit # __IGNORE_WARNING__ self.configItems.update({ "helpAppearancePage": [self.tr("Appearance"), "preferences-styles.png", - "HelpAppearancePage", "0helpPage", None], + "HelpAppearancePage", None, None], "helpFlashCookieManagerPage": [self.tr("Flash Cookie Manager"), "flashCookie16.png", - "HelpFlashCookieManagerPage", "0helpPage", None], + "HelpFlashCookieManagerPage", None, None], "helpVirusTotalPage": [self.tr("VirusTotal Interface"), "virustotal.png", - "HelpVirusTotalPage", "0helpPage", None], + "HelpVirusTotalPage", None, None], "helpWebBrowserPage": [self.tr("eric6 Web Browser"), "ericWeb.png", - "HelpWebBrowserPage", "0helpPage", None], + "HelpWebBrowserPage", None, None], }) except ImportError: pass @@ -885,6 +908,13 @@ pageName = item.data(0, Qt.UserRole) if pageName not in self.__expandedEntries: self.__expandedEntries.append(pageName) + + def isUsingWebEngine(self): + """ + Public method to get an indication, if QtWebEngine is being used. + """ + return self.__webEngine or \ + self.displayMode == ConfigurationWidget.WebBrowserMode class ConfigurationDialog(QDialog): @@ -906,7 +936,7 @@ def __init__(self, parent=None, name=None, modal=False, fromEric=True, displayMode=ConfigurationWidget.DefaultMode, - expandedEntries=[]): + expandedEntries=[], webEngine=False): """ Constructor @@ -920,6 +950,7 @@ WebBrowserMode) @keyparam expandedEntries list of entries to be shown expanded (list of strings) + @keyparam webEngine flag indicating QtWebEngine is used (bool) """ super(ConfigurationDialog, self).__init__(parent) if name: @@ -933,7 +964,8 @@ self.cw = ConfigurationWidget(self, fromEric=fromEric, displayMode=displayMode, - expandedEntries=expandedEntries) + expandedEntries=expandedEntries, + webEngine=webEngine) size = self.cw.size() self.layout.addWidget(self.cw) self.resize(size) @@ -1001,15 +1033,17 @@ """ Main window class for the standalone dialog. """ - def __init__(self, parent=None): + def __init__(self, parent=None, webEngine=False): """ Constructor @param parent reference to the parent widget (QWidget) + @keyparam webEngine flag indicating QtWebEngine is used (bool) """ super(ConfigurationWindow, self).__init__(parent) - self.cw = ConfigurationWidget(self, fromEric=False) + self.cw = ConfigurationWidget(self, fromEric=False, + webEngine=webEngine) size = self.cw.size() self.setCentralWidget(self.cw) self.resize(size)
--- a/Preferences/ConfigurationPages/SecurityPage.py Sat Mar 05 14:34:49 2016 +0100 +++ b/Preferences/ConfigurationPages/SecurityPage.py Sat Mar 05 16:44:41 2016 +0100 @@ -75,8 +75,9 @@ self.dnsPrefetchCheckBox.setEnabled(False) # TODO: add config for default Mode else: - self.dnsPrefetchCheckBox.setEnabled(False) - self.dnsGroup.hide() + if self.__configDlg.isUsingWebEngine(): + self.dnsPrefetchCheckBox.setEnabled(False) + self.dnsGroup.hide() def save(self): """
--- a/Preferences/ConfigurationPages/WebBrowserPage.py Sat Mar 05 14:34:49 2016 +0100 +++ b/Preferences/ConfigurationPages/WebBrowserPage.py Sat Mar 05 16:44:41 2016 +0100 @@ -84,11 +84,10 @@ ## self.sendRefererCheckBox.setChecked( ## Preferences.getWebBrowser("SendReferer")) - # TODO: Cache -## self.diskCacheCheckBox.setChecked( -## Preferences.getWebBrowser("DiskCacheEnabled")) -## self.cacheSizeSpinBox.setValue( -## Preferences.getWebBrowser("DiskCacheSize")) + self.diskCacheCheckBox.setChecked( + Preferences.getWebBrowser("DiskCacheEnabled")) + self.cacheSizeSpinBox.setValue( + Preferences.getWebBrowser("DiskCacheSize")) self.startupCombo.setCurrentIndex( Preferences.getWebBrowser("StartupBehavior")) @@ -153,7 +152,6 @@ self.doNotTrackCheckBox.hide() self.sendRefererCheckBox.hide() self.refererWhitelistButton.hide() - self.noCacheHostsButton.hide() def save(self): """ @@ -207,13 +205,12 @@ ## "SendReferer", ## self.sendRefererCheckBox.isChecked()) - # TODO: Cache -## Preferences.setWebBrowser( -## "DiskCacheEnabled", -## self.diskCacheCheckBox.isChecked()) -## Preferences.setWebBrowser( -## "DiskCacheSize", -## self.cacheSizeSpinBox.value()) + Preferences.setWebBrowser( + "DiskCacheEnabled", + self.diskCacheCheckBox.isChecked()) + Preferences.setWebBrowser( + "DiskCacheSize", + self.cacheSizeSpinBox.value()) Preferences.setWebBrowser( "StartupBehavior", @@ -306,16 +303,6 @@ ## from Helpviewer.Network.SendRefererWhitelistDialog import \ ## SendRefererWhitelistDialog ## SendRefererWhitelistDialog(self).exec_() - - # TODO: Cache -## @pyqtSlot() -## def on_noCacheHostsButton_clicked(self): -## """ -## Private slot to edit the list of hosts exempted from caching. -## """ -## from Helpviewer.Network.NoCacheHostsDialog import \ -## NoCacheHostsDialog -## NoCacheHostsDialog(self).exec_() def create(dlg):
--- a/Preferences/ConfigurationPages/WebBrowserPage.ui Sat Mar 05 14:34:49 2016 +0100 +++ b/Preferences/ConfigurationPages/WebBrowserPage.ui Sat Mar 05 16:44:41 2016 +0100 @@ -462,38 +462,11 @@ </property> <layout class="QGridLayout" name="gridLayout_2"> <item row="0" column="0" colspan="3"> - <layout class="QHBoxLayout" name="horizontalLayout_5"> - <item> - <widget class="QCheckBox" name="diskCacheCheckBox"> - <property name="text"> - <string>Enable disk cache</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_7"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="noCacheHostsButton"> - <property name="toolTip"> - <string>Press to edit the list of hosts exempted from caching</string> - </property> - <property name="text"> - <string>Edit Exempted Hosts ...</string> - </property> - </widget> - </item> - </layout> + <widget class="QCheckBox" name="diskCacheCheckBox"> + <property name="text"> + <string>Enable disk cache</string> + </property> + </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_7"> @@ -723,7 +696,6 @@ <tabstop>xssAuditingCheckBox</tabstop> <tabstop>expireHistory</tabstop> <tabstop>diskCacheCheckBox</tabstop> - <tabstop>noCacheHostsButton</tabstop> <tabstop>cacheSizeSpinBox</tabstop> <tabstop>languageCombo</tabstop> <tabstop>spatialCheckBox</tabstop>
--- a/Preferences/__init__.py Sat Mar 05 14:34:49 2016 +0100 +++ b/Preferences/__init__.py Sat Mar 05 16:44:41 2016 +0100 @@ -1030,6 +1030,8 @@ "ShowPreview": True, "WebInspectorPort": 42024, "WebInspectorEnabled": False, + "DiskCacheEnabled": True, + "DiskCacheSize": 50, # 50 MB # Grease Monkey "GreaseMonkeyDisabledScripts": [], # Downloads @@ -2775,7 +2777,7 @@ ## if QWebSettings is None: ## value = prefClass.helpDefaults[key] ## return value -## elif key in ["DiskCacheSize", "AcceptCookies", +## elif key in ["AcceptCookies", ## "KeepCookiesUntil", "StartupBehavior", ## "OfflineStorageDatabaseQuota", ## "OfflineWebApplicationCacheQuota", "CachePolicy", @@ -2787,7 +2789,7 @@ "SearchLanguage", "WebInspectorPort", "DefaultFontSize", "DefaultFixedFontSize", "MinimumFontSize", "MinimumLogicalFontSize", - ]: + "DiskCacheSize", ]: return int(prefClass.settings.value( "WebBrowser/" + key, prefClass.webBrowserDefaults[key])) ## elif key in ["DiskCacheEnabled", "FilterTrackingCookies", @@ -2813,7 +2815,7 @@ "SyncEnabled", "SyncBookmarks", "SyncHistory", "SyncPasswords", "SyncUserAgents", "SyncSpeedDial", "SyncEncryptData", "SyncEncryptPasswordsOnly", - "ShowPreview", "WebInspectorEnabled", + "ShowPreview", "WebInspectorEnabled", "DiskCacheEnabled", ]: return toBool(prefClass.settings.value( "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
--- a/UI/UserInterface.py Sat Mar 05 14:34:49 2016 +0100 +++ b/UI/UserInterface.py Sat Mar 05 16:44:41 2016 +0100 @@ -5229,8 +5229,13 @@ home = QUrl.fromLocalFile(home).toString() if WEBENGINE_AVAILABLE or WEBKIT_AVAILABLE: - if not (useSingle or Preferences.getHelp("SingleHelpWindow")) or \ - self.helpWindow is None: + single = useSingle + if WEBENGINE_AVAILABLE: + single = single or \ + Preferences.getWebBrowser("SingleWebBrowserWindow") + elif WEBKIT_AVAILABLE: + single = single or Preferences.getHelp("SingleHelpWindow") + if not single or self.helpWindow is None: if WEBENGINE_AVAILABLE: from WebBrowser.WebBrowserWindow import WebBrowserWindow help = WebBrowserWindow(home, '.', None, 'web_browser', @@ -5246,10 +5251,11 @@ else: help.showMaximized() - if useSingle or Preferences.getHelp("SingleHelpWindow"): + if single: self.helpWindow = help try: - self.helpWindow.webBrowserClosed.connect(self.__helpClosed) + self.helpWindow.webBrowserClosed.connect( + self.__helpClosed) except AttributeError: self.helpWindow.helpClosed.connect(self.__helpClosed) self.preferencesChanged.connect( @@ -5269,7 +5275,11 @@ """ Private slot to handle the helpClosed signal of the help window. """ - if Preferences.getHelp("SingleHelpWindow"): + if WEBENGINE_AVAILABLE: + single = Preferences.getWebBrowser("SingleWebBrowserWindow") + elif WEBKIT_AVAILABLE: + single = Preferences.getHelp("SingleHelpWindow") + if single: self.preferencesChanged.disconnect( self.helpWindow.preferencesChanged) self.masterPasswordChanged.disconnect( @@ -5327,6 +5337,7 @@ dlg = ConfigurationDialog( self, 'Configuration', expandedEntries=self.__expandedConfigurationEntries, + webEngine=WEBENGINE_AVAILABLE, ) dlg.preferencesChanged.connect(self.__preferencesChanged) dlg.masterPasswordChanged.connect(self.__masterPasswordChanged)
--- a/WebBrowser/Bookmarks/BookmarksToolBar.py Sat Mar 05 14:34:49 2016 +0100 +++ b/WebBrowser/Bookmarks/BookmarksToolBar.py Sat Mar 05 16:44:41 2016 +0100 @@ -90,6 +90,8 @@ self.tr("Open in New &Tab\tCtrl+LMB"), self.__openBookmarkInNewTab) menuAction.setData(v) + # TODO: Bookmarks: add open in new window + # TODO: Bookmarks: add open in private window menu.addSeparator() menuAction = menu.addAction(
--- a/WebBrowser/WebBrowserWindow.py Sat Mar 05 14:34:49 2016 +0100 +++ b/WebBrowser/WebBrowserWindow.py Sat Mar 05 16:44:41 2016 +0100 @@ -2755,8 +2755,14 @@ self.searchEdit.preferencesChanged() if not self.isPrivate(): - # TODO: Cache settings - pass + profile = self.webProfile() + if Preferences.getWebBrowser("DiskCacheEnabled"): + profile.setHttpCacheType(QWebEngineProfile.DiskHttpCache) + profile.setHttpCacheMaximumSize( + Preferences.getWebBrowser("DiskCacheSize") * 1024 * 1024) + else: + profile.setHttpCacheType(QWebEngineProfile.MemoryHttpCache) + profile.setHttpCacheMaximumSize(0) self.__virusTotal.preferencesChanged() if not Preferences.getWebBrowser("VirusTotalEnabled") or \ @@ -3250,6 +3256,7 @@ if history: self.historyManager().clear(historyPeriod) self.__tabWidget.clearClosedTabsList() + self.webProfile().clearAllVisitedLinks() if searches: self.searchEdit.clear() if downloads: @@ -4069,7 +4076,28 @@ cls._webProfile.downloadRequested.connect( cls.downloadRequested) - # TODO: Cache settings + # add the default user agent string + userAgent = cls._webProfile.httpUserAgent() + cls._webProfile.defaultUserAgent = userAgent + + if not private: + if Preferences.getWebBrowser("DiskCacheEnabled"): + cls._webProfile.setHttpCacheType( + QWebEngineProfile.DiskHttpCache) + cls._webProfile.setHttpCacheMaximumSize( + Preferences.getWebBrowser("DiskCacheSize") + * 1024 * 1024) + cls._webProfile.setCachePath(os.path.join( + Utilities.getConfigDir(), "web_browser")) + else: + cls._webProfile.setHttpCacheType( + QWebEngineProfile.MemoryHttpCache) + cls._webProfile.setHttpCacheMaximumSize(0) + cls._webProfile.setPersistentStoragePath(os.path.join( + Utilities.getConfigDir(), "web_browser", + "persistentstorage")) + cls._webProfile.setPersistentCookiesPolicy( + QWebEngineProfile.AllowPersistentCookies) # Setup QWebChannel user script script = QWebEngineScript()
--- a/eric6.e4p Sat Mar 05 14:34:49 2016 +0100 +++ b/eric6.e4p Sat Mar 05 16:44:41 2016 +0100 @@ -2012,6 +2012,7 @@ <Other>eric6.appdata.xml</Other> <Other>eric6.desktop</Other> <Other>eric6.e4p</Other> + <Other>eric6_browser.desktop</Other> <Other>eric6_webbrowser.desktop</Other> <Other>eric6config.linux</Other> <Other>icons</Other>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6_browser.desktop Sat Mar 05 16:44:41 2016 +0100 @@ -0,0 +1,15 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Exec=eric6_browser@MARKER@ +MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https; +Icon=ericWeb@MARKER@ +Terminal=false +Name=eric6 Web Browser@PY_MARKER@ +Name[de]=eric6 Web Browser@PY_MARKER@ +Comment=Web Browser for PyQt5 +Comment[de]=Web Browser für PyQt5 +GenericName=Web Browser +GenericName[de]=Web Browser +Categories=Qt;Python;Network;WebBrowser;QtWebEngine +StartupNotify=true
--- a/eric6_configure.py Sat Mar 05 14:34:49 2016 +0100 +++ b/eric6_configure.py Sat Mar 05 16:44:41 2016 +0100 @@ -37,10 +37,16 @@ settingsDir) sys.argv.remove(arg) -try: - from PyQt5 import QtWebEngineWidgets # __IGNORE_WARNING__ -except ImportError: - pass +# TODO: adjust this to 5.6.0 when done +from PyQt5.QtCore import qVersion +if qVersion() < "5.5.0": + WEBENGINE_AVAILABLE = False +else: + try: + from PyQt5 import QtWebEngineWidgets # __IGNORE_WARNING__ + WEBENGINE_AVAILABLE = True + except ImportError: + WEBENGINE_AVAILABLE = False # make ThirdParty package available as a packages repository sys.path.insert(2, os.path.join(os.path.dirname(__file__), @@ -59,7 +65,7 @@ @return reference to the main widget (QWidget) """ from Preferences.ConfigurationDialog import ConfigurationWindow - w = ConfigurationWindow() + w = ConfigurationWindow(webEngine=WEBENGINE_AVAILABLE) w.show() w.showConfigurationPageByName("empty") return w
--- a/install.py Sat Mar 05 14:34:49 2016 +0100 +++ b/install.py Sat Mar 05 16:44:41 2016 +0100 @@ -511,7 +511,9 @@ for name in ["/usr/share/applications/eric6" + marker + ".desktop", "/usr/share/appdata/eric6" + marker + ".appdata.xml", "/usr/share/applications/eric6_webbrowser" + marker + - ".desktop"]: + ".desktop", + "/usr/share/applications/eric6_browser" + marker + + ".desktop",]: if os.path.exists(name): os.remove(name) @@ -527,7 +529,7 @@ "eric6_plugininstall", "eric6_pluginuninstall", "eric6_pluginrepository", "eric6_sqlbrowser", "eric6_webbrowser", "eric6_iconeditor", - "eric6_snap", "eric6_hexeditor", + "eric6_snap", "eric6_hexeditor", "eric6_browser", ] if includePythonVariant: marker = PythonMarkers[sys.version_info.major] @@ -637,7 +639,7 @@ "eric6_qregularexpression", "eric6_re", "eric6_snap", "eric6_sqlbrowser", "eric6_tray", "eric6_trpreviewer", "eric6_uipreviewer", "eric6_unittest", "eric6_webbrowser", - "eric6"]: + "eric6_browser", "eric6"]: wnames.append(createPyWrapper(cfg['ericDir'], name)) # set install prefix, if not None @@ -814,6 +816,10 @@ os.path.join(sourceDir, "eric6_webbrowser.desktop"), os.path.join(dst, "eric6_webbrowser" + marker + ".desktop"), marker) + copyDesktopFile( + os.path.join(sourceDir, "eric6_browser.desktop"), + os.path.join(dst, "eric6_browser" + marker + ".desktop"), + marker) dst = os.path.normpath( os.path.join(distDir, "usr/share/appdata")) if not os.path.exists(dst): @@ -843,6 +849,11 @@ "/usr/share/applications/eric6_webbrowser" + marker + ".desktop", marker) + copyDesktopFile( + os.path.join(sourceDir, "eric6_browser.desktop"), + "/usr/share/applications/eric6_browser" + marker + + ".desktop", + marker) # Create a Mac application bundle if sys.platform == "darwin":
--- a/uninstall.py Sat Mar 05 14:34:49 2016 +0100 +++ b/uninstall.py Sat Mar 05 16:44:41 2016 +0100 @@ -115,6 +115,8 @@ "/usr/share/appdata/eric6" + marker + ".appdata.xml", "/usr/share/applications/eric6_webbrowser" + marker + ".desktop", + "/usr/share/applications/eric6_browser" + marker + + ".desktop", "/usr/share/pixmaps/eric" + marker + ".png", "/usr/share/pixmaps/ericWeb" + marker + ".png"]: if os.path.exists(name): @@ -132,7 +134,7 @@ "eric6_plugininstall", "eric6_pluginuninstall", "eric6_pluginrepository", "eric6_sqlbrowser", "eric6_webbrowser", "eric6_iconeditor", - "eric6_snap", "eric6_hexeditor", + "eric6_snap", "eric6_hexeditor", "eric6_browser", ] if includePythonVariant: marker = PythonMarkers[sys.version_info.major]