diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 51f6c4685..ff991f670 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -64,6 +64,8 @@ Fixed - Sites like `qute://help` now redirect to `qute://help/` to make sure links work properly. - Fixes for the size calculation of pinned tabs in the tab bar. +- Worked around a crash with PyQt 5.9.1 compiled against Qt < 5.9.1 when using + :yank or qute:// URLs. Deprecated ~~~~~~~~~~ diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 3aad6bf02..5b179f9d6 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -814,7 +814,7 @@ class CommandDispatcher: flags |= QUrl.FullyEncoded url = QUrl(self._current_url()) url_query = QUrlQuery() - url_query_str = url.query() + url_query_str = urlutils.query_string(url) if '&' not in url_query_str and ';' in url_query_str: url_query.setQueryDelimiters('=', ';') url_query.setQuery(url_query_str) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 220bb1beb..aaeba234a 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -36,7 +36,7 @@ from PyQt5.QtCore import QUrlQuery, QUrl import qutebrowser from qutebrowser.config import config, configdata, configexc, configdiff from qutebrowser.utils import (version, utils, jinja, log, message, docutils, - objreg) + objreg, urlutils) from qutebrowser.misc import objects @@ -137,7 +137,7 @@ def data_for_url(url): """ path = url.path() host = url.host() - query = url.query() + query = urlutils.query_string(url) # A url like "qute:foo" is split as "scheme:path", not "scheme:host". log.misc.debug("url: {}, path: {}, host {}".format( url.toDisplayString(), path, host)) diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 709d7d732..c7eb367af 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -26,7 +26,7 @@ import ipaddress import posixpath import urllib.parse -from PyQt5.QtCore import QUrl +from PyQt5.QtCore import QUrl, QUrlQuery from PyQt5.QtNetwork import QHostInfo, QHostAddress, QNetworkProxy from qutebrowser.config import config @@ -615,6 +615,18 @@ def safe_display_string(qurl): return qurl.toDisplayString() +def query_string(qurl): + """Get a query string for the given URL. + + This is a WORKAROUND for: + https://www.riverbankcomputing.com/pipermail/pyqt/2017-November/039702.html + """ + try: + return qurl.query() + except AttributeError: # pragma: no cover + return QUrlQuery(qurl).query() + + class InvalidProxyTypeError(Exception): """Error raised when proxy_from_url gets an unknown proxy type.""" diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index 875cc2967..6b456b7c5 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -758,6 +758,11 @@ def test_safe_display_string_invalid(): urlutils.safe_display_string(QUrl()) +def test_query_string(): + url = QUrl('https://www.example.com/?foo=bar') + assert urlutils.query_string(url) == 'foo=bar' + + class TestProxyFromUrl: @pytest.mark.parametrize('url, expected', [