diff options
author | Florian Bruhin <me@the-compiler.org> | 2019-02-23 12:49:58 +0100 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2019-02-23 12:52:30 +0100 |
commit | 6dd978ae05a4fb0525967c390ece2e51bbdb2a1a (patch) | |
tree | aa63609e3b8592b24c7626d689e9a88fb7ed0b92 /qutebrowser/browser/greasemonkey.py | |
parent | fa3612897bc648769fb793df8eae09aebefa0a39 (diff) | |
download | qutebrowser-6dd978ae05a4fb0525967c390ece2e51bbdb2a1a.tar.gz qutebrowser-6dd978ae05a4fb0525967c390ece2e51bbdb2a1a.zip |
GreaseMonkey: Force document-end for known-broken scripts
See #4322
Diffstat (limited to 'qutebrowser/browser/greasemonkey.py')
-rw-r--r-- | qutebrowser/browser/greasemonkey.py | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/qutebrowser/browser/greasemonkey.py b/qutebrowser/browser/greasemonkey.py index 9314f81c6..2aac71e18 100644 --- a/qutebrowser/browser/greasemonkey.py +++ b/qutebrowser/browser/greasemonkey.py @@ -31,7 +31,8 @@ import attr from PyQt5.QtCore import pyqtSignal, QObject, QUrl from qutebrowser.utils import (log, standarddir, jinja, objreg, utils, - javascript, urlmatch, version, usertypes) + javascript, urlmatch, version, usertypes, + qtutils) from qutebrowser.api import cmdutils from qutebrowser.browser import downloads from qutebrowser.misc import objects @@ -116,6 +117,40 @@ class GreasemonkeyScript: script.includes = ['*'] return script + def force_document_end(self): + """Check whether to force @run-at document-end. + + This needs to be done on QtWebEngine with Qt 5.12 for known-broken + scripts. + + On Qt 5.12, accessing the DOM isn't possible with "@run-at + document-start". It was documented to be impossible before, but seems + to work fine. + + However, some scripts do DOM access with "@run-at document-start". Fix + those by forcing them to use document-end instead. + """ + if objects.backend != usertypes.Backend.QtWebEngine: + return False + elif not qtutils.version_check('5.12', compiled=False): + return False + + broken_scripts = [ + ('http://userstyles.org', None), + ('https://github.com/ParticleCore', 'Iridium'), + ] + return any(self._matches_id(namespace=namespace, name=name) + for namespace, name in broken_scripts) + + def _matches_id(self, *, namespace, name): + """Check if this script matches the given namespace/name. + + Both namespace and name can be None in order to match any script. + """ + matches_namespace = namespace is None or self.namespace == namespace + matches_name = name is None or self.name == name + return matches_namespace and matches_name + def code(self): """Return the processed JavaScript code of this script. |