From 0a6bdfed49950f45f4a8b17e75459b05da87d272 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Thu, 19 Feb 2015 23:19:06 -0800 Subject: [PATCH] Make it possible to create reasonable subclasses of Event After this CL, authors can create custom subclasses of Event that actually work in a reasonable way, including being able to dispatch. R=hansmuller@google.com, hansmuller@chromium.org Review URL: https://codereview.chromium.org/938003004 --- .../scripts/templates/interface_dart.template | 8 +++-- engine/core/events/Event.h | 4 +-- engine/core/events/Event.idl | 6 +--- tests/events/custom-event-expected.txt | 6 ++++ tests/events/custom-event.sky | 35 +++++++++++++++++++ 5 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 tests/events/custom-event-expected.txt create mode 100644 tests/events/custom-event.sky diff --git a/engine/bindings/scripts/templates/interface_dart.template b/engine/bindings/scripts/templates/interface_dart.template index b4c66a245f2..3ec63ac3c89 100644 --- a/engine/bindings/scripts/templates/interface_dart.template +++ b/engine/bindings/scripts/templates/interface_dart.template @@ -11,7 +11,7 @@ part of sky.core; {{ '{' if arg.is_named else '[' }} {%- endif -%} {{ arg.dart_type }} {{ arg.name }} - {%- if arg.is_optional %} {{ ':' if arg.is_named else '='}} {{ arg.dart_default_value }} + {%- if arg.is_optional %} {{ ':' if arg.is_named else '='}} {{ arg.dart_default_value }} {#- TODO(eseidel): This does not support having both optional and named arguments! -#} {%- if loop.last -%}{{ '}' if arg.is_named else ']' }}{%- endif -%} {%- endif -%} @@ -24,7 +24,11 @@ class {{interface_name}} extends {{ parent_interface if parent_interface else 'N // Constructors {# TODO(eseidel): We only ever have one constructor. #} {%- for constructor in constructors %} - void _constructor({{ args_macro(constructor.arguments) }}) native "{{interface_name}}_constructorCallback"; + void _constructor( + {%- for arg in constructor.arguments -%} + {{ arg.dart_type }} {{ arg.name }}{% if not loop.last %}, {% endif %} + {%- endfor -%} + ) native "{{interface_name}}_constructorCallback"; {{interface_name}}({{ args_macro(constructor.arguments) }}) { _constructor( {%- for arg in constructor.arguments -%} {{ arg.name }}{% if not loop.last %}, {% endif %} diff --git a/engine/core/events/Event.h b/engine/core/events/Event.h index 727fbd193cb..5d3efb9f3b5 100644 --- a/engine/core/events/Event.h +++ b/engine/core/events/Event.h @@ -62,9 +62,9 @@ public: // A factory for a simple event. The event doesn't bubble, and isn't // cancelable. // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#fire-a-simple-event - static PassRefPtr create(const AtomicString& type) + static PassRefPtr create(const AtomicString& type, bool bubbles = false, bool cancelable = false) { - return adoptRef(new Event(type, false, false)); + return adoptRef(new Event(type, bubbles, cancelable)); } static PassRefPtr createCancelable(const AtomicString& type) { diff --git a/engine/core/events/Event.idl b/engine/core/events/Event.idl index 76f067b6376..d6ab9e9186b 100644 --- a/engine/core/events/Event.idl +++ b/engine/core/events/Event.idl @@ -18,9 +18,8 @@ * Boston, MA 02110-1301, USA. */ -// Introduced in DOM Level 2: [ - EventConstructor, + Constructor(DOMString type, [Named] optional boolean bubbles, [Named] optional boolean cancelable), ] interface Event { // DOM PhaseType const unsigned short NONE = 0; @@ -38,9 +37,6 @@ void stopPropagation(); void preventDefault(); - void initEvent([Default=Undefined] optional DOMString eventTypeArg, - [Default=Undefined] optional boolean canBubbleArg, - [Default=Undefined] optional boolean cancelableArg); // DOM Level 3 Additions. readonly attribute boolean defaultPrevented; diff --git a/tests/events/custom-event-expected.txt b/tests/events/custom-event-expected.txt new file mode 100644 index 00000000000..ab65dcd73e0 --- /dev/null +++ b/tests/events/custom-event-expected.txt @@ -0,0 +1,6 @@ +CONSOLE: unittest-suite-wait-for-done +CONSOLE: PASS: should be able to dispatch +CONSOLE: +CONSOLE: All 1 tests passed. +CONSOLE: unittest-suite-success +DONE diff --git a/tests/events/custom-event.sky b/tests/events/custom-event.sky new file mode 100644 index 00000000000..4a86eb2831a --- /dev/null +++ b/tests/events/custom-event.sky @@ -0,0 +1,35 @@ +