diff options
author | Jimmy <jimmy@spalge.com> | 2018-04-03 20:29:31 +1200 |
---|---|---|
committer | Jimmy <jimmy@spalge.com> | 2018-04-14 10:31:20 +1200 |
commit | c5334fb68367708294fe3382979a190292893074 (patch) | |
tree | d0fc8c5f2187bbaa8c56b1ea11287b657408e3cb /qutebrowser/browser/greasemonkey.py | |
parent | 08295112218cb7a5c8bd3af94f0626fe03ec674c (diff) | |
download | qutebrowser-c5334fb68367708294fe3382979a190292893074.tar.gz qutebrowser-c5334fb68367708294fe3382979a190292893074.zip |
Greasemonkey: use UrlPatterns for match directives
The greasemonkey `@match` directive is used to match urls against
chromium url patterns (as opposed to `@include` which treats its
argument as a glob expression). I was using fnmatch for both here
because I am lazy and knew someone else was going to implement chromium
url patterns for me eventually. Now it is done and I should switch to
using them instead. The most common failing case that this will fix is
something matching on `*://*.domain.com/*` because it wouldn't match
the url with no subdomain.
This codepath is only used on webengine 5.7.1 and webkit backends.
Diffstat (limited to 'qutebrowser/browser/greasemonkey.py')
-rw-r--r-- | qutebrowser/browser/greasemonkey.py | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/qutebrowser/browser/greasemonkey.py b/qutebrowser/browser/greasemonkey.py index a43644bf6..55a2e7356 100644 --- a/qutebrowser/browser/greasemonkey.py +++ b/qutebrowser/browser/greasemonkey.py @@ -32,6 +32,7 @@ from PyQt5.QtCore import pyqtSignal, QObject, QUrl from qutebrowser.utils import (log, standarddir, jinja, objreg, utils, javascript) +from qutebrowser.utils.urlmatch import UrlPattern from qutebrowser.commands import cmdutils from qutebrowser.browser import downloads @@ -48,6 +49,7 @@ class GreasemonkeyScript: def __init__(self, properties, code): self._code = code self.includes = [] + self.matches = [] self.excludes = [] self.requires = [] self.description = None @@ -63,8 +65,10 @@ class GreasemonkeyScript: self.namespace = value elif name == 'description': self.description = value - elif name in ['include', 'match']: + elif name == 'include': self.includes.append(value) + elif name == 'match': + self.matches.append(value) elif name in ['exclude', 'exclude_match']: self.excludes.append(value) elif name == 'run-at': @@ -92,7 +96,7 @@ class GreasemonkeyScript: props = "" script = cls(re.findall(cls.PROPS_REGEX, props), source) script.script_meta = props - if not script.includes: + if not script.includes and not script.matches: script.includes = ['*'] return script @@ -117,7 +121,7 @@ class GreasemonkeyScript: return json.dumps({ 'name': self.name, 'description': self.description, - 'matches': self.includes, + 'matches': self.matches, 'includes': self.includes, 'excludes': self.excludes, 'run-at': self.run_at, @@ -324,8 +328,12 @@ class GreasemonkeyManager(QObject): # Otherwise they are glob expressions. return fnmatch.fnmatch(string_url, pattern) + def _chromium_match(pattern): + return UrlPattern(pattern).matches(url) + tester = (lambda script: - any(_match(pat) for pat in script.includes) and + (any(_match(pat) for pat in script.includes) or + any(_chromium_match(pat) for pat in script.matches)) and not any(_match(pat) for pat in script.excludes)) return MatchingScripts( |