Updated Branches: refs/heads/5.4-js-rewrite 553e39d35 -> 97099758b
add support for triggering native events to core/spi Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/97099758 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/97099758 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/97099758 Branch: refs/heads/5.4-js-rewrite Commit: 97099758bc844cc357ac49f797544e0ef48cdce3 Parents: 3071d35 Author: Howard M. Lewis Ship <[email protected]> Authored: Mon Aug 13 11:37:22 2012 -0700 Committer: Howard M. Lewis Ship <[email protected]> Committed: Mon Aug 13 11:37:22 2012 -0700 ---------------------------------------------------------------------- .../coffeescript/META-INF/modules/core/spi.coffee | 32 ++++++++++++-- .../integration/app1/pages/test-spi.coffee | 27 +++++++++++- 2 files changed, 52 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/97099758/tapestry-core/src/main/coffeescript/META-INF/modules/core/spi.coffee ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/coffeescript/META-INF/modules/core/spi.coffee b/tapestry-core/src/main/coffeescript/META-INF/modules/core/spi.coffee index a9c0d0c..8532bd8 100644 --- a/tapestry-core/src/main/coffeescript/META-INF/modules/core/spi.coffee +++ b/tapestry-core/src/main/coffeescript/META-INF/modules/core/spi.coffee @@ -24,6 +24,17 @@ define ["_", "prototype"], (_) -> split = (str) -> _(str.split " ").reject (s) -> s is "" + fireNativeEvent = (element, eventName) -> + if document.createEventObject + # IE support: + event = document.createEventObject() + element.fireEvent "on#{eventName}", event + else + # Everyone else: + event = document.createEvent "HTMLEvents" + event.initEvent eventName, true, true + element.dispatchEvent event + # _internal_: Converts content (provided to `ElementWrapper.update()` or `append()`) into an appropriate type. This # primarily exists to validate the value, and to "unpack" an ElementWrapper into a DOM element. convertContent = (content) -> @@ -270,16 +281,27 @@ define ["_", "prototype"], (_) -> visible: -> @element.visible() - # Fires a named event, passing an optional _memo_ object to event handler functions. + # Fires a named event, passing an optional _memo_ object to event handler functions. This must support + # common native events (exact list TBD), as well as native events (in Prototype, native events must have + # a prefix that ends with a colon). # - # Returns this ElementWrapper. + # * eventName - name of event to trigger on the wrapped Element + # * memo - optional value assocated with the event; available as WrappedeEvent.memo in event handler functions (must + # be null for native events) # - # eventName - name of event to trigger on the wrapped Element - # memo - optional value assocated with the event; available as WrappedeEvent.memo in event handler functions + # Returns this ElementWrapper. trigger: (eventName, memo) -> throw new Error("Attempt to trigger event with null event name") unless eventName? - @element.fire eventName, memo + if (eventName.indexOf ':') > 0 + # Custom event is supported directly by Prototype: + @element.fire eventName, memo + else + # Native events take some extra work: + throw new Error("Memo must be null when triggering a native event") if memo + + fireNativeEvent @element, eventName + this # Adds an event handler for one or more events. http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/97099758/tapestry-core/src/test/coffeescript/org/apache/tapestry5/integration/app1/pages/test-spi.coffee ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/coffeescript/org/apache/tapestry5/integration/app1/pages/test-spi.coffee b/tapestry-core/src/test/coffeescript/org/apache/tapestry5/integration/app1/pages/test-spi.coffee index 08f530c..33e07d9 100644 --- a/tapestry-core/src/test/coffeescript/org/apache/tapestry5/integration/app1/pages/test-spi.coffee +++ b/tapestry-core/src/test/coffeescript/org/apache/tapestry5/integration/app1/pages/test-spi.coffee @@ -19,6 +19,7 @@ require ["core/spi"], (spi) -> # Remember that Prototype will never trigger a native event, just a # custom event, so we create a custom event here. + # NOTE: support for native events was added later. eh = container.on "x:click", "a", (event) -> event.stop() clicks++ @@ -39,6 +40,24 @@ require ["core/spi"], (spi) -> equal clicks, 2, "notifications resume after EventHandler started" + eh.stop() + + test "trigger native events", -> + + clicks = 0 + container = spi.wrap "spi-eventelement" + button = container.find "a" + + eh = container.on "click", "a", (event) -> + event.stop() + clicks++ + + button.trigger "click" + + equal clicks, 1, "native event was triggered" + + eh.stop() + test "selector used with events filters", -> clicks = 0 @@ -46,7 +65,7 @@ require ["core/spi"], (spi) -> primary = container.find "a.btn-primary" secondary = container.find "a[data-use=secondary]" - container.on "x:click", "a.btn-primary", (event) -> + eh = container.on "x:click", "a.btn-primary", (event) -> event.stop() clicks++ @@ -58,18 +77,22 @@ require ["core/spi"], (spi) -> equal clicks, 1, "click on non-selected element does not invoke handler" + eh.stop() + test "this is matched element in handler", -> container = spi.wrap "spi-eventelement" primary = container.find "a.btn-primary" - container.on "x:click", "a.btn-primary", (event) -> + eh = container.on "x:click", "a.btn-primary", (event) -> event.stop() strictEqual this, primary.element, "this should be the element that was matched" primary.trigger "x:click" + eh.stop() + test "visibility, hide(), and show()", -> e = (spi.wrap "spi-visibility").find "span"
