Greasemonkey: Add run-at document-idle.
Supposed to be after all the assets have finished loading and in page js has run. Not that we can garuntee that last bit. If a script misbehaves because a precondition isn't yet met I suggest adding a defer method to the script that adds a timer until the precondition is met. Also changed the map/filter calls to use list comprehensions to keep pylint happy. Even if it does look uglier.
This commit is contained in:
parent
13728387d7
commit
25f626a436
@ -238,6 +238,7 @@ class GreasemonkeyManager(QObject):
|
|||||||
"""Re-Read greasemonkey scripts from disk."""
|
"""Re-Read greasemonkey scripts from disk."""
|
||||||
self._run_start = []
|
self._run_start = []
|
||||||
self._run_end = []
|
self._run_end = []
|
||||||
|
self._run_idle = []
|
||||||
|
|
||||||
scripts_dir = os.path.abspath(_scripts_dir())
|
scripts_dir = os.path.abspath(_scripts_dir())
|
||||||
log.greasemonkey.debug("Reading scripts from: {}".format(scripts_dir))
|
log.greasemonkey.debug("Reading scripts from: {}".format(scripts_dir))
|
||||||
@ -254,6 +255,8 @@ class GreasemonkeyManager(QObject):
|
|||||||
self._run_start.append(script)
|
self._run_start.append(script)
|
||||||
elif script.run_at == 'document-end':
|
elif script.run_at == 'document-end':
|
||||||
self._run_end.append(script)
|
self._run_end.append(script)
|
||||||
|
elif script.run_at == 'document-idle':
|
||||||
|
self._run_idle.append(script)
|
||||||
else:
|
else:
|
||||||
log.greasemonkey.warning("Script {} has invalid run-at "
|
log.greasemonkey.warning("Script {} has invalid run-at "
|
||||||
"defined, defaulting to "
|
"defined, defaulting to "
|
||||||
@ -269,15 +272,18 @@ class GreasemonkeyManager(QObject):
|
|||||||
"""Fetch scripts that are registered to run for url.
|
"""Fetch scripts that are registered to run for url.
|
||||||
|
|
||||||
returns a tuple of lists of scripts meant to run at (document-start,
|
returns a tuple of lists of scripts meant to run at (document-start,
|
||||||
document-end)
|
document-end, document-idle)
|
||||||
"""
|
"""
|
||||||
match = functools.partial(fnmatch.fnmatch, url)
|
match = functools.partial(fnmatch.fnmatch, url)
|
||||||
tester = (lambda script:
|
tester = (lambda script:
|
||||||
any(map(match, script.includes())) and not
|
any([match(pat) for pat in script.includes]) and
|
||||||
any(map(match, script.excludes())))
|
not any([match(pat) for pat in script.excludes]))
|
||||||
return (list(filter(tester, self._run_start)),
|
return (
|
||||||
list(filter(tester, self._run_end)))
|
[script for script in self._run_start if tester(script)],
|
||||||
|
[script for script in self._run_end if tester(script)],
|
||||||
|
[script for script in self._run_idle if tester(script)]
|
||||||
|
)
|
||||||
|
|
||||||
def all_scripts(self):
|
def all_scripts(self):
|
||||||
"""Return all scripts found in the configured script directory."""
|
"""Return all scripts found in the configured script directory."""
|
||||||
return self._run_start + self._run_end
|
return self._run_start + self._run_end + self._run_idle
|
||||||
|
@ -90,6 +90,8 @@ class BrowserPage(QWebPage):
|
|||||||
functools.partial(self.inject_userjs, load='start'))
|
functools.partial(self.inject_userjs, load='start'))
|
||||||
self.mainFrame().initialLayoutCompleted.connect(
|
self.mainFrame().initialLayoutCompleted.connect(
|
||||||
functools.partial(self.inject_userjs, load='end'))
|
functools.partial(self.inject_userjs, load='end'))
|
||||||
|
self.mainFrame().loadFinished.connect(
|
||||||
|
functools.partial(self.inject_userjs, load='idle'))
|
||||||
|
|
||||||
def javaScriptPrompt(self, frame, js_msg, default):
|
def javaScriptPrompt(self, frame, js_msg, default):
|
||||||
"""Override javaScriptPrompt to use qutebrowser prompts."""
|
"""Override javaScriptPrompt to use qutebrowser prompts."""
|
||||||
@ -292,20 +294,20 @@ class BrowserPage(QWebPage):
|
|||||||
"""Inject user javascripts into the page.
|
"""Inject user javascripts into the page.
|
||||||
|
|
||||||
param: The page load stage to inject the corresponding scripts
|
param: The page load stage to inject the corresponding scripts
|
||||||
for. Support values are "start" and "end",
|
for. Support values are "start", "end" and "idle",
|
||||||
corresponding to the allowed values of the `@run-at`
|
corresponding to the allowed values of the `@run-at`
|
||||||
directive in the greasemonkey metadata spec.
|
directive in the greasemonkey metadata spec.
|
||||||
"""
|
"""
|
||||||
greasemonkey = objreg.get('greasemonkey')
|
greasemonkey = objreg.get('greasemonkey')
|
||||||
url = self.currentFrame().url()
|
url = self.currentFrame().url()
|
||||||
start_scripts, end_scripts = greasemonkey.scripts_for(url.toDisplayString())
|
start_scripts, end_scripts, idle_scripts = \
|
||||||
log.greasemonkey.debug('scripts: {}'.format(start_scripts if start else end_scripts))
|
greasemonkey.scripts_for(url.toDisplayString())
|
||||||
|
|
||||||
toload = []
|
|
||||||
if load == "start":
|
if load == "start":
|
||||||
toload = start_scripts
|
toload = start_scripts
|
||||||
elif load == "end":
|
elif load == "end":
|
||||||
toload = end_scripts
|
toload = end_scripts
|
||||||
|
elif load == "idle":
|
||||||
|
toload = idle_scripts
|
||||||
|
|
||||||
for script in toload:
|
for script in toload:
|
||||||
log.webview.debug('Running GM script: {}'.format(script.name))
|
log.webview.debug('Running GM script: {}'.format(script.name))
|
||||||
|
Loading…
Reference in New Issue
Block a user