From efe96462c9a18f14bdb6025d499e18dbaac5ce7c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 4 Jan 2015 20:16:15 +0100 Subject: [PATCH] Pass more useful information to userscripts. Closes #379. --- qutebrowser/browser/commands.py | 24 ++++++++++++++++++++++-- qutebrowser/browser/hints.py | 16 ++++++++++++---- qutebrowser/commands/userscripts.py | 22 +++++++++++++++------- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index fe2508440..3b8c75df4 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -830,8 +830,28 @@ class CommandDispatcher: args: Arguments to pass to the userscript. """ cmd = os.path.expanduser(cmd) - userscripts.run(cmd, *args, url=self._current_url(), - win_id=self._win_id) + env = { + 'QUTE_MODE': 'command', + } + + idx = self._current_index() + tabbed_browser = self._tabbed_browser() + if idx != -1: + env['QUTE_TITLE'] = tabbed_browser.tabText(idx) + + webview = tabbed_browser.currentWidget() + if webview is not None and webview.hasSelection(): + env['QUTE_SELECTED_TEXT'] = webview.selectedText() + env['QUTE_SELECTED_HTML'] = webview.selectedHtml() + + try: + url = tabbed_browser.current_url() + except qtutils.QtValueError: + pass + else: + env['QUTE_URL'] = url.toString(QUrl.FullyEncoded) + + userscripts.run(cmd, *args, win_id=self._win_id, env=env) @cmdutils.register(instance='command-dispatcher', scope='window') def quickmark_save(self): diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 22c723a0c..d274e8469 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -443,16 +443,24 @@ class HintManager(QObject): window=self._win_id) download_manager.get(url, elem.webFrame().page()) - def _call_userscript(self, url, context): + def _call_userscript(self, elem, context): """Call an userscript from a hint. Args: - url: The URL to open as a QUrl. + elem: The QWebElement to use in the userscript. context: The HintContext to use. """ cmd = context.args[0] args = context.args[1:] - userscripts.run(cmd, *args, url=url, win_id=self._win_id) + env = { + 'QUTE_MODE': 'hints', + 'QUTE_SELECTED_TEXT': str(elem), + 'QUTE_SELECTED_HTML': elem.toOuterXml(), + } + url = self._resolve_url(elem, context.baseurl) + if url is not None: + env['QUTE_URL'] = url.toString(QUrl.FullyEncoded) + userscripts.run(cmd, *args, win_id=self._win_id, env=env) def _spawn(self, url, context): """Spawn a simple command from a hint. @@ -767,6 +775,7 @@ class HintManager(QObject): Target.hover: self._click, # _download needs a QWebElement to get the frame. Target.download: self._download, + Target.userscript: self._call_userscript, } # Handlers which take a QUrl url_handlers = { @@ -774,7 +783,6 @@ class HintManager(QObject): Target.yank_primary: self._yank, Target.run: self._run_cmd, Target.fill: self._preset_cmd_text, - Target.userscript: self._call_userscript, Target.spawn: self._spawn, } elem = self._context.elems[keystr].elem diff --git a/qutebrowser/commands/userscripts.py b/qutebrowser/commands/userscripts.py index 9c7008f57..b978e3d05 100644 --- a/qutebrowser/commands/userscripts.py +++ b/qutebrowser/commands/userscripts.py @@ -24,10 +24,11 @@ import os.path import tempfile from PyQt5.QtCore import (pyqtSignal, pyqtSlot, QObject, QStandardPaths, - QSocketNotifier, QProcessEnvironment, QProcess, QUrl) + QSocketNotifier, QProcessEnvironment, QProcess) from qutebrowser.utils import message, log, objreg, standarddir from qutebrowser.commands import runners, cmdexc +from qutebrowser.config import config class _QtFIFOReader(QObject): @@ -305,19 +306,26 @@ else: UserscriptRunner = _DummyUserscriptRunner -def run(cmd, *args, url, win_id): - """Convenience method to run an userscript.""" +def run(cmd, *args, win_id, env): + """Convenience method to run an userscript. + + Args: + cmd: The userscript binary to run. + *args: The arguments to pass to the userscript. + win_id: The window id the userscript is executed in. + env: A dictionary of variables to add to the process environment. + """ tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) - # We don't remove the password in the URL here, as it's probably safe to - # pass via env variable.. - urlstr = url.toString(QUrl.FullyEncoded) commandrunner = runners.CommandRunner(win_id, tabbed_browser) runner = UserscriptRunner(win_id, tabbed_browser) runner.got_cmd.connect( lambda cmd: log.commands.debug("Got userscript command: {}".format( cmd))) runner.got_cmd.connect(commandrunner.run_safely) - runner.run(cmd, *args, env={'QUTE_URL': urlstr}) + user_agent = config.get('network', 'user-agent') + if user_agent is not None: + env['QUTE_USER_AGENT'] = user_agent + runner.run(cmd, *args, env=env) runner.finished.connect(commandrunner.deleteLater) runner.finished.connect(runner.deleteLater)