diff options
author | Florian Bruhin <me@the-compiler.org> | 2020-11-23 19:20:29 +0100 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2020-11-23 19:57:20 +0100 |
commit | 120f8ce1d48cee39b785b9e74cb541652a2ca26d (patch) | |
tree | d49cabfe5a6a5badf25603bcb99a5d175723e96b | |
parent | 63a0803b67344f90f40171f35948dc299d2db826 (diff) | |
download | qutebrowser-120f8ce1d48cee39b785b9e74cb541652a2ca26d.tar.gz qutebrowser-120f8ce1d48cee39b785b9e74cb541652a2ca26d.zip |
Fix content.headers.referer = 'never' with Qt 5.15
The --no-referrers flag was removed in Chromium 79:
https://chromium-review.googlesource.com/c/chromium/src/+/1808144
We now instead use the request interceptor to remove the referrer, which
is possible ever since Qt 5.12.4 and 5.13.1 and something we've wanted
to do anyways, see #4793.
The setting is still marked as "requires a restart" (and it doesn't
support URL patterns) because that's partially true: The `same-domain`
value is still handled via CLI arguments.
Fixes #5892 (together with the last commit for 'same-domain')
-rw-r--r-- | qutebrowser/browser/webengine/interceptor.py | 8 | ||||
-rw-r--r-- | qutebrowser/config/qtargs.py | 8 | ||||
-rw-r--r-- | tests/unit/config/test_qtargs.py | 20 |
3 files changed, 29 insertions, 7 deletions
diff --git a/qutebrowser/browser/webengine/interceptor.py b/qutebrowser/browser/webengine/interceptor.py index 95e01588b..1e48cd113 100644 --- a/qutebrowser/browser/webengine/interceptor.py +++ b/qutebrowser/browser/webengine/interceptor.py @@ -25,7 +25,7 @@ from PyQt5.QtCore import QUrl, QByteArray from PyQt5.QtWebEngineCore import (QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestInfo) -from qutebrowser.config import websettings +from qutebrowser.config import websettings, config from qutebrowser.browser import shared from qutebrowser.utils import utils, log, debug, qtutils from qutebrowser.extensions import interceptors @@ -204,5 +204,11 @@ class RequestInterceptor(QWebEngineUrlRequestInterceptor): for header, value in shared.custom_headers(url=url): info.setHttpHeader(header, value) + # Note this is ignored before Qt 5.12.4 and 5.13.1 due to + # https://bugreports.qt.io/browse/QTBUG-60203 - there, we set the + # commandline-flag in qtargs.py instead. + if config.val.content.headers.referer == 'never': + info.setHttpHeader(b'Referer', b'') + user_agent = websettings.user_agent(url) info.setHttpHeader(b'User-Agent', user_agent.encode('ascii')) diff --git a/qutebrowser/config/qtargs.py b/qutebrowser/config/qtargs.py index 6786d7973..7b66c6d92 100644 --- a/qutebrowser/config/qtargs.py +++ b/qutebrowser/config/qtargs.py @@ -201,7 +201,6 @@ def _qtwebengine_settings_args() -> Iterator[str]: }, 'content.headers.referer': { 'always': None, - 'never': '--no-referrers', } } @@ -216,6 +215,13 @@ def _qtwebengine_settings_args() -> Iterator[str]: else: referrer_setting['same-domain'] = '--reduced-referrer-granularity' + can_override_referer = ( + qtutils.version_check('5.12.4', compiled=False) and + not qtutils.version_check('5.13.0', compiled=False, exact=True) + ) + # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-60203 + referrer_setting['never'] = None if can_override_referer else '--no-referrers' + for setting, args in sorted(settings.items()): arg = args[config.instance.get(setting)] if arg is not None: diff --git a/tests/unit/config/test_qtargs.py b/tests/unit/config/test_qtargs.py index a2af26800..051956a00 100644 --- a/tests/unit/config/test_qtargs.py +++ b/tests/unit/config/test_qtargs.py @@ -253,11 +253,21 @@ class TestQtArgs: assert arg in args @pytest.mark.parametrize('qt_version, referer, arg', [ - ('5.15', 'always', None), - ('5.15', 'never', '--no-referrers'), - ('5.15', 'same-domain', '--enable-features=ReducedReferrerGranularity'), - ('5.14', 'same-domain', '--enable-features=ReducedReferrerGranularity'), - ('5.13', 'same-domain', '--reduced-referrer-granularity'), + # 'always' -> no arguments + ('5.15.0', 'always', None), + + # 'never' is handled via interceptor for most Qt versions + ('5.12.3', 'never', '--no-referrers'), + ('5.12.4', 'never', None), + ('5.13.0', 'never', '--no-referrers'), + ('5.13.1', 'never', None), + ('5.14.0', 'never', None), + ('5.15.0', 'never', None), + + # 'same-domain' - arguments depend on Qt versions + ('5.13.0', 'same-domain', '--reduced-referrer-granularity'), + ('5.14.0', 'same-domain', '--enable-features=ReducedReferrerGranularity'), + ('5.15.0', 'same-domain', '--enable-features=ReducedReferrerGranularity'), ]) def test_referer(self, config_stub, monkeypatch, parser, qt_version, referer, arg): monkeypatch.setattr(qtargs.objects, 'backend', usertypes.Backend.QtWebEngine) |