From ab81ea14306d5dd52c074440d352e300cfcae45b Mon Sep 17 00:00:00 2001 From: "igor.vaynberg" Date: Mon, 20 Sep 2010 17:28:03 -0700 Subject: [PATCH 1/3] html elements should have keyboard and mouse events --- specs/html/spec.js | 7 +++++++ src/html/element.js | 2 ++ 2 files changed, 9 insertions(+) diff --git a/specs/html/spec.js b/specs/html/spec.js index ff6a19f0..acfc9023 100644 --- a/specs/html/spec.js +++ b/specs/html/spec.js @@ -859,3 +859,10 @@ test("Option", function() { x = new Option('text1', 'value1'); x = new Option('text2', 'value2', true, true); }); + +test("Event Handlers Defined", function() { + var a=document.createElement("a"); + ok(a["onfocus"], "html events defined"); + ok(a["onclick"], "mouse events defined"); + ok(a["onkeydown"], "keyboard events defined"); +}); diff --git a/src/html/element.js b/src/html/element.js index 8f992c92..d17e76d7 100644 --- a/src/html/element.js +++ b/src/html/element.js @@ -41,6 +41,8 @@ HTMLElement = function(ownerDocument) { HTMLElement.prototype = new Element(); __extend__(HTMLElement.prototype, HTMLEvents.prototype); +__extend__(HTMLElement.prototype, MouseEvents.prototype); +__extend__(HTMLElement.prototype, KeyboardEvents.prototype); __extend__(HTMLElement.prototype, { get className() { return this.getAttribute("class")||''; From fe1cd1ab8591e1e91aeae4236c362f900987a59e Mon Sep 17 00:00:00 2001 From: "igor.vaynberg" Date: Tue, 21 Sep 2010 08:59:00 -0700 Subject: [PATCH 2/3] adding proper handling of inline event handlers with return values --- src/event/eventtarget.js | 5 ++++- src/html/htmlevents.js | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/event/eventtarget.js b/src/event/eventtarget.js index 2afc0369..e31d5162 100644 --- a/src/event/eventtarget.js +++ b/src/event/eventtarget.js @@ -120,7 +120,10 @@ function __dispatchEvent__(target, event, bubbles){ }); } if (target["on" + event.type]) { - target["on" + event.type](event); + var returnValue=target["on" + event.type](event); + if (returnValue === false) { + event.preventDefault(); + } } if (bubbles && !event.cancelled){ __bubbleEvent__(target, event); diff --git a/src/html/htmlevents.js b/src/html/htmlevents.js index 57f73803..c690638d 100644 --- a/src/html/htmlevents.js +++ b/src/html/htmlevents.js @@ -9,7 +9,10 @@ var __eval__ = function(script, node){ if (!script == "" && Envjs.scriptTypes['']){ // don't assemble environment if no script... try{ - Envjs.eval(node.ownerDocument.ownerWindow, script, script+" ("+node+")"); + // wrap the inline handler in a double enclosure so we can correctly handle the return value + // otherwise we get "error evaluating InternalError: invalid return" + var exec="(function(){var result=(function(){"+script+"})(); return result;})()"; + Envjs.eval(node.ownerDocument.ownerWindow, exec, script+" ("+node+")"); }catch(e){ console.log('error evaluating %s', e); } From 93a1519ca9100e704a845d73e3afbb11bc21bd7b Mon Sep 17 00:00:00 2001 From: "igor.vaynberg" Date: Tue, 21 Sep 2010 08:59:15 -0700 Subject: [PATCH 3/3] a test for inline event handlers that is failing :/ --- specs/html/spec.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/specs/html/spec.js b/specs/html/spec.js index acfc9023..23fe315a 100644 --- a/specs/html/spec.js +++ b/specs/html/spec.js @@ -866,3 +866,21 @@ test("Event Handlers Defined", function() { ok(a["onclick"], "mouse events defined"); ok(a["onkeydown"], "keyboard events defined"); }); + +test("Event Handlers Invoked on Inline Attributes", function() { + try { + // enable eval of inline scripts for the duration of this test + Envjs.scriptTypes[""]=true; + + var a=document.createElement("a"); + ok(a, "created anchor tag"); + a.setAttribute("onclick", "ok(true,'event invoked on an inline handler');"); + + var event = document.createEvent('MouseEvents'); + ok(event, "created event"); + event.initEvent('click', true, true); + a.dispatchEvent(event); + } finally { + Envjs.scriptTypes[""]=false; + } +});