Add bubbles, cancelable, and composed options to dispatch_event

This commit is contained in:
Jay Kamat 2018-09-19 23:51:15 -07:00
parent e295e8054c
commit 1da2bdb1e5
No known key found for this signature in database
GPG Key ID: 5D2E399600F4F7B5
7 changed files with 32 additions and 13 deletions

View File

@ -1653,7 +1653,7 @@ class CommandDispatcher:
try:
elem.set_value(text)
# Kick off js handlers to trick them into thinking there was input.
elem.dispatch_event("input")
elem.dispatch_event("input", bubbles=True)
except webelem.OrphanedError:
message.error('Edited element vanished')
ed.backup()

View File

@ -139,8 +139,16 @@ class AbstractWebElement(collections.abc.MutableMapping):
"""Set the element value."""
raise NotImplementedError
def dispatch_event(self, event):
"""Set the element value."""
def dispatch_event(self, event, bubbles=False,
cancelable=False, composed=False):
"""Dispatch an event to the element.
Args:
bubbles: Whether this event should bubble.
cancelable: Whether this event can be cancelled.
composed: Whether the event will trigger listeners outside of a
shadow root
"""
raise NotImplementedError
def insert_text(self, text):

View File

@ -135,8 +135,10 @@ 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 dispatch_event(self, event, bubbles=False,
cancelable=False, composed=False):
self._js_call('dispatch_event', event, bubbles, cancelable, composed)
def caret_position(self):
"""Get the text caret position for the current element.

View File

@ -128,13 +128,16 @@ class WebKitElement(webelem.AbstractWebElement):
value = javascript.string_escape(value)
self._elem.evaluateJavaScript("this.value='{}'".format(value))
def dispatch_event(self, event):
def dispatch_event(self, event, bubbles=False,
cancelable=False, composed=False):
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))
event = javascript.string_escape(event)
self._elem.evaluateJavaScript(
"this.dispatchEvent(new Event('{}', "
"{{'bubbles': {}, 'cancelable': {}, 'composed': {}}}))"
.format(event, str(bubbles).lower(), str(cancelable).lower(),
str(composed).lower()))
def caret_position(self):
"""Get the text caret position for the current element."""

View File

@ -59,3 +59,4 @@ rules:
multiline-ternary: ["error", "always-multiline"]
max-lines-per-function: "off"
require-unicode-regexp: "off"
max-params: "off"

View File

@ -1,5 +1,5 @@
/* eslint-disable max-len, max-statements, complexity,
max-params, default-case, valid-jsdoc */
default-case, valid-jsdoc */
// Copyright 2014 The Chromium Authors. All rights reserved.
//

View File

@ -362,9 +362,14 @@ window._qutebrowser.webelem = (function() {
document.execCommand("insertText", false, text);
};
funcs.dispatch_event = (id, event) => {
funcs.dispatch_event = (id, event, bubbles = false,
cancelable = false, composed = false) => {
const elem = elements[id];
elem.dispatchEvent(new Event(event));
elem.dispatchEvent(
new Event(event, {"bubbles": bubbles,
"cancelable": cancelable,
"composed": composed}));
};
funcs.set_attribute = (id, name, value) => {