diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index d5e1797ac..a931eb66e 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1652,6 +1652,8 @@ class CommandDispatcher: """ try: elem.set_value(text) + # Kick off js handlers to trick them into thinking there was input. + elem.dispatch_event("input") except webelem.OrphanedError: message.error('Edited element vanished') ed.backup() diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index 1d719738b..621ec91e2 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -139,6 +139,10 @@ class AbstractWebElement(collections.abc.MutableMapping): """Set the element value.""" raise NotImplementedError + def dispatch_event(self, event): + """Set the element value.""" + raise NotImplementedError + def insert_text(self, text): """Insert the given text into the element.""" raise NotImplementedError diff --git a/qutebrowser/browser/webengine/webengineelem.py b/qutebrowser/browser/webengine/webengineelem.py index aefa51f5a..44176cf73 100644 --- a/qutebrowser/browser/webengine/webengineelem.py +++ b/qutebrowser/browser/webengine/webengineelem.py @@ -135,6 +135,9 @@ class WebEngineElement(webelem.AbstractWebElement): def set_value(self, value): self._js_call('set_value', value) + def dispatch_event(self, event): + self._js_call('dispatch_event', event) + def caret_position(self): """Get the text caret position for the current element. diff --git a/qutebrowser/browser/webkit/webkitelem.py b/qutebrowser/browser/webkit/webkitelem.py index 7ec979d09..81cb24780 100644 --- a/qutebrowser/browser/webkit/webkitelem.py +++ b/qutebrowser/browser/webkit/webkitelem.py @@ -128,6 +128,14 @@ class WebKitElement(webelem.AbstractWebElement): value = javascript.string_escape(value) self._elem.evaluateJavaScript("this.value='{}'".format(value)) + def dispatch_event(self, event): + self._check_vanished() + if self._tab.is_deleted(): + raise webelem.OrphanedError("Tab containing element vanished") + log.webelem.debug("Firing event on {!r} via javascript.".format(self)) + self._elem.evaluateJavaScript("this.dispatchEvent(new Event('{}'))" + .format(event)) + def caret_position(self): """Get the text caret position for the current element.""" self._check_vanished() diff --git a/qutebrowser/javascript/webelem.js b/qutebrowser/javascript/webelem.js index ad18899f6..5b1a0679b 100644 --- a/qutebrowser/javascript/webelem.js +++ b/qutebrowser/javascript/webelem.js @@ -362,6 +362,11 @@ window._qutebrowser.webelem = (function() { document.execCommand("insertText", false, text); }; + funcs.dispatch_event = (id, event) => { + const elem = elements[id]; + elem.dispatchEvent(new Event(event)); + }; + funcs.set_attribute = (id, name, value) => { elements[id].setAttribute(name, value); };