Add support for triggering change handlers when using :open-editor

This commit is contained in:
Jay Kamat 2018-09-08 19:29:15 -07:00
parent 93eb05598e
commit e295e8054c
No known key found for this signature in database
GPG Key ID: 5D2E399600F4F7B5
5 changed files with 22 additions and 0 deletions

View File

@ -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()

View File

@ -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

View File

@ -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.

View File

@ -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()

View File

@ -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);
};