You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2012/08/13 20:47:04 UTC
[1/9] git commit: add support for triggering native events to core/spi
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 <hl...@apache.org>
Authored: Mon Aug 13 11:37:22 2012 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
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"