summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2020-06-23 14:55:12 +0200
committerFlorian Bruhin <me@the-compiler.org>2020-06-23 14:55:12 +0200
commit66bf7d12fd546a897bd651233c68c891ba693670 (patch)
tree843b27aab15e4614ed9e80dbb3d48a76946fa948
parentb5631393b0267eaa2bd52cc62ee9e55e48070ca9 (diff)
parent7aa81c7fcbdcb927b31aaa882540847b00e1c22d (diff)
downloadqutebrowser-66bf7d12fd546a897bd651233c68c891ba693670.tar.gz
qutebrowser-66bf7d12fd546a897bd651233c68c891ba693670.zip
Merge remote-tracking branch 'origin/pr/5153'
-rw-r--r--qutebrowser/config/configdata.yml1
-rw-r--r--qutebrowser/utils/urlutils.py5
-rw-r--r--tests/unit/utils/test_urlutils.py134
3 files changed, 86 insertions, 54 deletions
diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml
index 2b5b94042..8d4ed044f 100644
--- a/qutebrowser/config/configdata.yml
+++ b/qutebrowser/config/configdata.yml
@@ -1938,6 +1938,7 @@ url.auto_search:
- naive: Use simple/naive check.
- dns: Use DNS requests (might be slow!).
- never: Never search automatically.
+ - schemeless: Always search automatically unless URL explicitly contains a scheme.
default: naive
desc: What search to start when something else than a URL is entered.
diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py
index 7c8cec7a5..761853a18 100644
--- a/qutebrowser/utils/urlutils.py
+++ b/qutebrowser/utils/urlutils.py
@@ -288,6 +288,11 @@ def is_url(urlstr: str) -> bool:
# URLs with explicit schemes are always URLs
log.url.debug("Contains explicit scheme")
url = True
+ elif (autosearch == 'schemeless' and
+ (not _has_explicit_scheme(qurl) or ' ' in urlstr)):
+ # When autosearch=schemeless, URLs must contain schemes to be valid
+ log.url.debug("No explicit scheme in given URL, treating as non-URL")
+ url = False
elif qurl_userinput.host() in ['localhost', '127.0.0.1', '::1']:
log.url.debug("Is localhost.")
url = True
diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py
index a9f32161d..72fe631ca 100644
--- a/tests/unit/utils/test_urlutils.py
+++ b/tests/unit/utils/test_urlutils.py
@@ -352,78 +352,101 @@ def test_get_search_url_invalid(url):
urlutils._get_search_url(url)
-@pytest.mark.parametrize('is_url, is_url_no_autosearch, uses_dns, url', [
+@attr.s
+class UrlParams:
+
+ url = attr.ib()
+ is_url = attr.ib(True)
+ is_url_no_autosearch = attr.ib(True)
+ use_dns = attr.ib(True)
+ is_url_in_schemeless = attr.ib(False)
+
+
+@pytest.mark.parametrize('auto_search',
+ ['dns', 'naive', 'schemeless', 'never'])
+@pytest.mark.parametrize('url_params', [
# Normal hosts
- (True, True, False, 'http://foobar'),
- (True, True, False, 'localhost:8080'),
- (True, True, True, 'qutebrowser.org'),
- (True, True, True, ' qutebrowser.org '),
- (True, True, False, 'http://user:password@example.com/foo?bar=baz#fish'),
- (True, True, True, 'existing-tld.domains'),
+ UrlParams('http://foobar', use_dns=False, is_url_in_schemeless=True),
+ UrlParams('localhost:8080', use_dns=False, is_url_in_schemeless=True),
+ UrlParams('qutebrowser.org'),
+ UrlParams(' qutebrowser.org '),
+ UrlParams('http://user:password@example.com/foo?bar=baz#fish',
+ use_dns=False, is_url_in_schemeless=True),
+ UrlParams('existing-tld.domains'),
# Internationalized domain names
- (True, True, True, '\u4E2D\u56FD.\u4E2D\u56FD'), # Chinese TLD
- (True, True, True, 'xn--fiqs8s.xn--fiqs8s'), # The same in punycode
+ UrlParams('\u4E2D\u56FD.\u4E2D\u56FD'), # Chinese TLD
+ UrlParams('xn--fiqs8s.xn--fiqs8s'), # The same in punycode
# Encoded space in explicit url
- (True, True, False, 'http://sharepoint/sites/it/IT%20Documentation/Forms/AllItems.aspx'),
+ UrlParams('http://sharepoint/sites/it/IT%20Documentation/Forms/AllItems.aspx', use_dns=False, is_url_in_schemeless=True),
# IPs
- (True, True, False, '127.0.0.1'),
- (True, True, False, '::1'),
- (True, True, True, '2001:41d0:2:6c11::1'),
- (True, True, True, '[2001:41d0:2:6c11::1]:8000'),
- (True, True, True, '94.23.233.17'),
- (True, True, True, '94.23.233.17:8000'),
+ UrlParams('127.0.0.1', use_dns=False),
+ UrlParams('::1', use_dns=False),
+ UrlParams('2001:41d0:2:6c11::1'),
+ UrlParams('[2001:41d0:2:6c11::1]:8000'),
+ UrlParams('94.23.233.17'),
+ UrlParams('94.23.233.17:8000'),
# Special URLs
- (True, True, False, 'file:///tmp/foo'),
- (True, True, False, 'about:blank'),
- (True, True, False, 'qute:version'),
- (True, True, False, 'qute://version'),
- (True, True, False, 'localhost'),
+ UrlParams('file:///tmp/foo', use_dns=False, is_url_in_schemeless=True),
+ UrlParams('about:blank', use_dns=False, is_url_in_schemeless=True),
+ UrlParams('qute:version', use_dns=False, is_url_in_schemeless=True),
+ UrlParams('qute://version', use_dns=False, is_url_in_schemeless=True),
+ UrlParams('localhost', use_dns=False),
# _has_explicit_scheme False, special_url True
- (True, True, False, 'qute::foo'),
- (True, True, False, 'qute:://foo'),
+ UrlParams('qute::foo', use_dns=False),
+ UrlParams('qute:://foo', use_dns=False),
# Invalid URLs
- (False, False, False, ''),
- (False, True, False, 'onlyscheme:'),
- (False, True, False, 'http:foo:0'),
+ UrlParams('', is_url=False, is_url_no_autosearch=False, use_dns=False),
+ UrlParams('onlyscheme:', is_url=False, use_dns=False),
+ UrlParams('http:foo:0', is_url=False, use_dns=False),
# Not URLs
- (False, True, False, 'foo bar'), # no DNS because of space
- (False, True, False, 'localhost test'), # no DNS because of space
- (False, True, False, 'another . test'), # no DNS because of space
- (False, True, True, 'foo'),
- (False, True, False, 'this is: not a URL'), # no DNS because of space
- (False, True, False, 'foo user@host.tld'), # no DNS because of space
- (False, True, False, '23.42'), # no DNS because bogus-IP
- (False, True, False, '1337'), # no DNS because bogus-IP
- (False, True, True, 'deadbeef'),
- (False, True, True, 'hello.'),
- (False, True, False, 'site:cookies.com oatmeal raisin'),
- (False, True, True, 'example.search_string'),
- (False, True, True, 'example_search.string'),
+ UrlParams('foo bar', is_url=False, use_dns=False), # no DNS b/c of space
+ UrlParams('localhost test', is_url=False, use_dns=False), # no DNS b/c spc
+ UrlParams('another . test', is_url=False, use_dns=False), # no DNS b/c spc
+ UrlParams('foo', is_url=False),
+ UrlParams('this is: not a URL', is_url=False, use_dns=False), # no DNS spc
+ UrlParams('foo user@host.tld', is_url=False, use_dns=False), # no DNS, spc
+ UrlParams('23.42', is_url=False, use_dns=False), # no DNS b/c bogus-IP
+ UrlParams('1337', is_url=False, use_dns=False), # no DNS b/c bogus-IP
+ UrlParams('deadbeef', is_url=False),
+ UrlParams('hello.', is_url=False),
+ UrlParams('site:cookies.com oatmeal raisin', is_url=False, use_dns=False),
+ UrlParams('example.search_string', is_url=False),
+ UrlParams('example_search.string', is_url=False),
# no DNS because there is no host
- (False, True, False, 'foo::bar'),
+ UrlParams('foo::bar', is_url=False, use_dns=False),
# Valid search term with autosearch
- (False, False, False, 'test foo'),
- (False, False, False, 'test user@host.tld'),
+ UrlParams('test foo', is_url=False,
+ is_url_no_autosearch=False, use_dns=False),
+ UrlParams('test user@host.tld', is_url=False,
+ is_url_no_autosearch=False, use_dns=False),
# autosearch = False
- (False, True, False, 'This is a URL without autosearch'),
-])
-@pytest.mark.parametrize('auto_search', ['dns', 'naive', 'never'])
-def test_is_url(config_stub, fake_dns,
- is_url, is_url_no_autosearch, uses_dns, url, auto_search):
+ UrlParams('This is a URL without autosearch', is_url=False, use_dns=False),
+], ids=lambda param: 'URL: ' + param.url)
+def test_is_url(config_stub, fake_dns, auto_search, url_params):
"""Test is_url().
Args:
- is_url: Whether the given string is a URL with auto_search dns/naive.
- is_url_no_autosearch: Whether the given string is a URL with
- auto_search false.
- uses_dns: Whether the given string should fire a DNS request for the
- given URL.
- url: The URL to test, as a string.
auto_search: With which auto_search setting to test
+ url_params: instance of UrlParams; each containing the following attrs
+ * url: The URL to test, as a string.
+ * is_url: Whether the given string is considered a URL when auto_search
+ is either dns or naive. [default: True]
+ * is_url_no_autosearch: Whether the given string is a URL with
+ auto_search false. [default: True]
+ * use_dns: Whether the given string should fire a DNS request for the
+ given URL. [default: True]
+ * is_url_in_schemeless: Whether the given string is treated as a URL
+ when auto_search=schemeless. [default: False]
"""
+ url = url_params.url
+ is_url = url_params.is_url
+ is_url_no_autosearch = url_params.is_url_no_autosearch
+ use_dns = url_params.use_dns
+ is_url_in_schemeless = url_params.is_url_in_schemeless
+
config_stub.val.url.auto_search = auto_search
if auto_search == 'dns':
- if uses_dns:
+ if use_dns:
fake_dns.answer = True
result = urlutils.is_url(url)
assert fake_dns.used
@@ -438,6 +461,9 @@ def test_is_url(config_stub, fake_dns,
result = urlutils.is_url(url)
assert not fake_dns.used
assert result == is_url
+ elif auto_search == 'schemeless':
+ assert urlutils.is_url(url) == is_url_in_schemeless
+ assert not fake_dns.used
elif auto_search == 'naive':
assert urlutils.is_url(url) == is_url
assert not fake_dns.used