summaryrefslogtreecommitdiff
path: root/qutebrowser
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2021-06-11 19:14:14 +0200
committerFlorian Bruhin <me@the-compiler.org>2021-06-11 19:14:14 +0200
commitb0d3c8eee3ee78c011feeac36cf7c8ee9785b63b (patch)
treea92b03c89138f37b73582152348ee4503343a1e7 /qutebrowser
parentc6cdd3f8440b22a294911ebed0492beea8913c49 (diff)
downloadqutebrowser-b0d3c8eee3ee78c011feeac36cf7c8ee9785b63b.tar.gz
qutebrowser-b0d3c8eee3ee78c011feeac36cf7c8ee9785b63b.zip
Greasemonkey: Make sure script names are unique
Fixes #6353
Diffstat (limited to 'qutebrowser')
-rw-r--r--qutebrowser/browser/greasemonkey.py15
-rw-r--r--qutebrowser/browser/webengine/webenginetab.py7
2 files changed, 21 insertions, 1 deletions
diff --git a/qutebrowser/browser/greasemonkey.py b/qutebrowser/browser/greasemonkey.py
index 03db3be0c..7fea5820c 100644
--- a/qutebrowser/browser/greasemonkey.py
+++ b/qutebrowser/browser/greasemonkey.py
@@ -67,6 +67,7 @@ class GreasemonkeyScript:
self.runs_on_sub_frames = True
self.jsworld = "main"
self.name = ''
+ self.dedup_suffix = 1
for name, value in properties:
if name == 'name':
@@ -104,6 +105,20 @@ class GreasemonkeyScript:
def __str__(self):
return self.name
+ def full_name(self) -> str:
+ """Get the full name of this script.
+
+ This includes a GM- prefix, its namespace (if any) and deduplication
+ counter suffix, if set.
+ """
+ parts = ['GM-']
+ if self.namespace is not None:
+ parts += [self.namespace, '/']
+ parts.append(self.name)
+ if self.dedup_suffix > 1:
+ parts.append(f"-{self.dedup_suffix}")
+ return ''.join(parts)
+
@classmethod
def parse(cls, source, filename=None):
"""GreasemonkeyScript factory.
diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py
index f9b636bde..b2ca42cbe 100644
--- a/qutebrowser/browser/webengine/webenginetab.py
+++ b/qutebrowser/browser/webengine/webenginetab.py
@@ -1112,7 +1112,12 @@ class _WebEngineScripts(QObject):
page_scripts = self._widget.page().scripts()
self._remove_all_greasemonkey_scripts()
+ seen_names = set()
for script in scripts:
+ while script.full_name() in seen_names:
+ script.dedup_suffix += 1
+ seen_names.add(script.full_name())
+
new_script = QWebEngineScript()
try:
@@ -1144,7 +1149,7 @@ class _WebEngineScripts(QObject):
new_script.setInjectionPoint(QWebEngineScript.DocumentReady)
new_script.setSourceCode(script.code())
- new_script.setName(f"GM-{script.name}")
+ new_script.setName(script.full_name())
new_script.setRunsOnSubFrames(script.runs_on_sub_frames)
if script.needs_document_end_workaround():