summaryrefslogtreecommitdiff
path: root/qutebrowser/browser/greasemonkey.py
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2019-02-23 12:49:58 +0100
committerFlorian Bruhin <me@the-compiler.org>2019-02-23 12:52:30 +0100
commit6dd978ae05a4fb0525967c390ece2e51bbdb2a1a (patch)
treeaa63609e3b8592b24c7626d689e9a88fb7ed0b92 /qutebrowser/browser/greasemonkey.py
parentfa3612897bc648769fb793df8eae09aebefa0a39 (diff)
downloadqutebrowser-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.py37
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.