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"