diff options
Diffstat (limited to 'qutebrowser/browser/webengine/webenginesettings.py')
-rw-r--r-- | qutebrowser/browser/webengine/webenginesettings.py | 140 |
1 files changed, 77 insertions, 63 deletions
diff --git a/qutebrowser/browser/webengine/webenginesettings.py b/qutebrowser/browser/webengine/webenginesettings.py index 1ffb55337..8a8c4766f 100644 --- a/qutebrowser/browser/webengine/webenginesettings.py +++ b/qutebrowser/browser/webengine/webenginesettings.py @@ -26,11 +26,13 @@ Module attributes: import os import operator +import pathlib from typing import cast, Any, List, Optional, Tuple, Union, TYPE_CHECKING -from PyQt5.QtGui import QFont -from PyQt5.QtWidgets import QApplication -from PyQt5.QtWebEngineWidgets import QWebEngineSettings, QWebEngineProfile +from qutebrowser.qt import machinery +from qutebrowser.qt.gui import QFont +from qutebrowser.qt.widgets import QApplication +from qutebrowser.qt.webenginecore import QWebEngineSettings, QWebEngineProfile from qutebrowser.browser import history from qutebrowser.browser.webengine import (spell, webenginequtescheme, cookies, @@ -110,91 +112,91 @@ class WebEngineSettings(websettings.AbstractSettings): _ATTRIBUTES = { 'content.xss_auditing': - Attr(QWebEngineSettings.XSSAuditingEnabled), + Attr(QWebEngineSettings.WebAttribute.XSSAuditingEnabled), 'content.images': - Attr(QWebEngineSettings.AutoLoadImages), + Attr(QWebEngineSettings.WebAttribute.AutoLoadImages), 'content.javascript.enabled': - Attr(QWebEngineSettings.JavascriptEnabled), + Attr(QWebEngineSettings.WebAttribute.JavascriptEnabled), 'content.javascript.can_open_tabs_automatically': - Attr(QWebEngineSettings.JavascriptCanOpenWindows), + Attr(QWebEngineSettings.WebAttribute.JavascriptCanOpenWindows), 'content.plugins': - Attr(QWebEngineSettings.PluginsEnabled), + Attr(QWebEngineSettings.WebAttribute.PluginsEnabled), 'content.hyperlink_auditing': - Attr(QWebEngineSettings.HyperlinkAuditingEnabled), + Attr(QWebEngineSettings.WebAttribute.HyperlinkAuditingEnabled), 'content.local_content_can_access_remote_urls': - Attr(QWebEngineSettings.LocalContentCanAccessRemoteUrls), + Attr(QWebEngineSettings.WebAttribute.LocalContentCanAccessRemoteUrls), 'content.local_content_can_access_file_urls': - Attr(QWebEngineSettings.LocalContentCanAccessFileUrls), + Attr(QWebEngineSettings.WebAttribute.LocalContentCanAccessFileUrls), 'content.webgl': - Attr(QWebEngineSettings.WebGLEnabled), + Attr(QWebEngineSettings.WebAttribute.WebGLEnabled), 'content.local_storage': - Attr(QWebEngineSettings.LocalStorageEnabled), + Attr(QWebEngineSettings.WebAttribute.LocalStorageEnabled), 'content.desktop_capture': - Attr(QWebEngineSettings.ScreenCaptureEnabled, + Attr(QWebEngineSettings.WebAttribute.ScreenCaptureEnabled, converter=lambda val: True if val == 'ask' else val), # 'ask' is handled via the permission system 'input.spatial_navigation': - Attr(QWebEngineSettings.SpatialNavigationEnabled), + Attr(QWebEngineSettings.WebAttribute.SpatialNavigationEnabled), 'input.links_included_in_focus_chain': - Attr(QWebEngineSettings.LinksIncludedInFocusChain), + Attr(QWebEngineSettings.WebAttribute.LinksIncludedInFocusChain), 'scrolling.smooth': - Attr(QWebEngineSettings.ScrollAnimatorEnabled), + Attr(QWebEngineSettings.WebAttribute.ScrollAnimatorEnabled), 'content.print_element_backgrounds': - Attr(QWebEngineSettings.PrintElementBackgrounds), + Attr(QWebEngineSettings.WebAttribute.PrintElementBackgrounds), 'content.autoplay': - Attr(QWebEngineSettings.PlaybackRequiresUserGesture, + Attr(QWebEngineSettings.WebAttribute.PlaybackRequiresUserGesture, converter=operator.not_), 'content.dns_prefetch': - Attr(QWebEngineSettings.DnsPrefetchEnabled), + Attr(QWebEngineSettings.WebAttribute.DnsPrefetchEnabled), 'tabs.favicons.show': - Attr(QWebEngineSettings.AutoLoadIconsForPage, + Attr(QWebEngineSettings.WebAttribute.AutoLoadIconsForPage, converter=lambda val: val != 'never'), } _FONT_SIZES = { 'fonts.web.size.minimum': - QWebEngineSettings.MinimumFontSize, + QWebEngineSettings.FontSize.MinimumFontSize, 'fonts.web.size.minimum_logical': - QWebEngineSettings.MinimumLogicalFontSize, + QWebEngineSettings.FontSize.MinimumLogicalFontSize, 'fonts.web.size.default': - QWebEngineSettings.DefaultFontSize, + QWebEngineSettings.FontSize.DefaultFontSize, 'fonts.web.size.default_fixed': - QWebEngineSettings.DefaultFixedFontSize, + QWebEngineSettings.FontSize.DefaultFixedFontSize, } _FONT_FAMILIES = { - 'fonts.web.family.standard': QWebEngineSettings.StandardFont, - 'fonts.web.family.fixed': QWebEngineSettings.FixedFont, - 'fonts.web.family.serif': QWebEngineSettings.SerifFont, - 'fonts.web.family.sans_serif': QWebEngineSettings.SansSerifFont, - 'fonts.web.family.cursive': QWebEngineSettings.CursiveFont, - 'fonts.web.family.fantasy': QWebEngineSettings.FantasyFont, + 'fonts.web.family.standard': QWebEngineSettings.FontFamily.StandardFont, + 'fonts.web.family.fixed': QWebEngineSettings.FontFamily.FixedFont, + 'fonts.web.family.serif': QWebEngineSettings.FontFamily.SerifFont, + 'fonts.web.family.sans_serif': QWebEngineSettings.FontFamily.SansSerifFont, + 'fonts.web.family.cursive': QWebEngineSettings.FontFamily.CursiveFont, + 'fonts.web.family.fantasy': QWebEngineSettings.FontFamily.FantasyFont, } _UNKNOWN_URL_SCHEME_POLICY = { 'disallow': - QWebEngineSettings.DisallowUnknownUrlSchemes, + QWebEngineSettings.UnknownUrlSchemePolicy.DisallowUnknownUrlSchemes, 'allow-from-user-interaction': - QWebEngineSettings.AllowUnknownUrlSchemesFromUserInteraction, + QWebEngineSettings.UnknownUrlSchemePolicy.AllowUnknownUrlSchemesFromUserInteraction, 'allow-all': - QWebEngineSettings.AllowAllUnknownUrlSchemes, + QWebEngineSettings.UnknownUrlSchemePolicy.AllowAllUnknownUrlSchemes, } # Mapping from WebEngineSettings::initDefaults in # qtwebengine/src/core/web_engine_settings.cpp _FONT_TO_QFONT = { - QWebEngineSettings.StandardFont: QFont.Serif, - QWebEngineSettings.FixedFont: QFont.Monospace, - QWebEngineSettings.SerifFont: QFont.Serif, - QWebEngineSettings.SansSerifFont: QFont.SansSerif, - QWebEngineSettings.CursiveFont: QFont.Cursive, - QWebEngineSettings.FantasyFont: QFont.Fantasy, + QWebEngineSettings.FontFamily.StandardFont: QFont.StyleHint.Serif, + QWebEngineSettings.FontFamily.FixedFont: QFont.StyleHint.Monospace, + QWebEngineSettings.FontFamily.SerifFont: QFont.StyleHint.Serif, + QWebEngineSettings.FontFamily.SansSerifFont: QFont.StyleHint.SansSerif, + QWebEngineSettings.FontFamily.CursiveFont: QFont.StyleHint.Cursive, + QWebEngineSettings.FontFamily.FantasyFont: QFont.StyleHint.Fantasy, } _JS_CLIPBOARD_SETTINGS = { @@ -256,15 +258,10 @@ class ProfileSetter: 'content.cache.size': self.set_http_cache_size, 'content.cookies.store': self.set_persistent_cookie_policy, 'spellcheck.languages': self.set_dictionary_language, + 'content.headers.user_agent': self.set_http_headers, + 'content.headers.accept_language': self.set_http_headers, } - # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-75884 - # (note this isn't actually fixed properly before Qt 5.15) - header_bug_fixed = qtutils.version_check('5.15', compiled=False) - if header_bug_fixed: - for name in ['user_agent', 'accept_language']: - self._name_to_method[f'content.headers.{name}'] = self.set_http_headers - def update_setting(self, name): """Update a setting based on its name.""" try: @@ -286,15 +283,10 @@ class ProfileSetter: settings = self._profile.settings() settings.setAttribute( - QWebEngineSettings.FullScreenSupportEnabled, True) + QWebEngineSettings.WebAttribute.FullScreenSupportEnabled, True) settings.setAttribute( - QWebEngineSettings.FocusOnNavigationEnabled, False) - - try: - settings.setAttribute(QWebEngineSettings.PdfViewerEnabled, False) - except AttributeError: - # Added in Qt 5.13 - pass + QWebEngineSettings.WebAttribute.FocusOnNavigationEnabled, False) + settings.setAttribute(QWebEngineSettings.WebAttribute.PdfViewerEnabled, False) def set_http_headers(self): """Set the user agent and accept-language for the given profile. @@ -326,9 +318,9 @@ class ProfileSetter: if self._profile.isOffTheRecord(): return if config.val.content.cookies.store: - value = QWebEngineProfile.AllowPersistentCookies + value = QWebEngineProfile.PersistentCookiesPolicy.AllowPersistentCookies else: - value = QWebEngineProfile.NoPersistentCookies + value = QWebEngineProfile.PersistentCookiesPolicy.NoPersistentCookies self._profile.setPersistentCookiesPolicy(value) def set_dictionary_language(self): @@ -397,7 +389,11 @@ def _init_default_profile(): """Init the default QWebEngineProfile.""" global default_profile - default_profile = QWebEngineProfile.defaultProfile() + if machinery.IS_QT6: + default_profile = QWebEngineProfile("Default") + else: + default_profile = QWebEngineProfile.defaultProfile() + assert not default_profile.isOffTheRecord() assert parsed_user_agent is None # avoid earlier profile initialization non_ua_version = version.qtwebengine_versions(avoid_init=True) @@ -470,6 +466,7 @@ def _init_site_specific_quirks(): # Needed because Slack adds an error which prevents using it relatively # aggressively, despite things actually working fine. # September 2020: Qt 5.12 works, but Qt <= 5.11 shows the error. + # FIXME:qt6 Still needed? # https://github.com/qutebrowser/qutebrowser/issues/4669 ("ua-slack", 'https://*.slack.com/*', new_chrome_ua), ] @@ -489,20 +486,37 @@ def _init_site_specific_quirks(): ) -def _init_devtools_settings(): - """Make sure the devtools always get images/JS permissions.""" - settings: List[Tuple[str, Any]] = [ +def _init_default_settings(): + """Set permissions required for internal functionality. + + - Make sure the devtools always get images/JS permissions. + - On Qt 6, make sure files in the data path can load external resources. + """ + devtools_settings: List[Tuple[str, Any]] = [ ('content.javascript.enabled', True), ('content.images', True), ('content.cookies.accept', 'all'), ] - for setting, value in settings: + for setting, value in devtools_settings: for pattern in ['chrome-devtools://*', 'devtools://*']: config.instance.set_obj(setting, value, pattern=urlmatch.UrlPattern(pattern), hide_userconfig=True) + if machinery.IS_QT6: + userscripts_settings: List[Tuple[str, Any]] = [ + ("content.local_content_can_access_remote_urls", True), + ("content.local_content_can_access_file_urls", False), + ] + # https://codereview.qt-project.org/c/qt/qtwebengine/+/375672 + url = pathlib.Path(standarddir.data(), "userscripts").as_uri() + for setting, value in userscripts_settings: + config.instance.set_obj(setting, + value, + pattern=urlmatch.UrlPattern(f"{url}/*"), + hide_userconfig=True) + def init(): """Initialize the global QWebSettings.""" @@ -543,7 +557,7 @@ def init(): log.init.debug("Misc initialization...") _init_site_specific_quirks() - _init_devtools_settings() + _init_default_settings() def shutdown(): |