From 16719e1d070c9713c35984a42f3f86161f16b25e Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Mon, 19 Nov 2018 22:21:36 +0000 Subject: [PATCH] UIChangeableProperty --- packages/driver-browser-ui/src/index.js | 17 +++++++++++++++++ packages/driver-browser-ui/src/protocol.js | 5 +++++ 2 files changed, 22 insertions(+) diff --git a/packages/driver-browser-ui/src/index.js b/packages/driver-browser-ui/src/index.js index 490b4cb..b160f87 100644 --- a/packages/driver-browser-ui/src/index.js +++ b/packages/driver-browser-ui/src/index.js @@ -366,6 +366,23 @@ function splitClassValue(v) { /////////////////////////////////////////////////////////////////////////// +spawn named 'UIChangeablePropertyFactory' { + during Observe(P.UIChangeableProperty($selector, $property, _)) + spawn named ['UIChangeableProperty', selector, property] { + on start selectorMatch(document, selector).forEach((node) => { + react { + field this.value = node[property]; + assert P.UIChangeableProperty(selector, property, this.value); + const handlerClosure = Dataspace.wrapExternal((e) => { this.value = node[property]; }); + on start eventUpdater('change', handlerClosure, true)(node); + on stop eventUpdater('change', handlerClosure, false)(node); + } + }); + } +} + +/////////////////////////////////////////////////////////////////////////// + function escapeDataAttributeName(s) { // Per https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset, // the rules seem to be: diff --git a/packages/driver-browser-ui/src/protocol.js b/packages/driver-browser-ui/src/protocol.js index 85f05fa..47b717c 100644 --- a/packages/driver-browser-ui/src/protocol.js +++ b/packages/driver-browser-ui/src/protocol.js @@ -63,6 +63,11 @@ module.exports.UIAttribute = UIAttribute; assertion type UIProperty(selector, property, value); module.exports.UIProperty = UIProperty; +// Assertion. For clients to monitor the values of properties that, +// when changed, emit 'change' events. +assertion type UIChangeableProperty(selector, property, value); +module.exports.UIChangeableProperty = UIChangeableProperty; + // Messages. // NOTE: These do not treat "class" specially! message type SetAttribute(selector, attribute, value);