From 085b988e6a965f0a44eadc7d4f697a0d273a7c32 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Sat, 21 Feb 2015 08:02:32 -0800 Subject: [PATCH] Make it possible for sky-element to register any tag name ... instead of hard-coding "example". We do this by adding a custom constructor for Element that gets the |tagName| property off the instance. R=esprehn@chromium.org Review URL: https://codereview.chromium.org/943153002 --- engine/bindings/BUILD.gn | 1 + engine/bindings/custom/dart_element_custom.cc | 37 +++++++++++++++++++ .../scripts/templates/interface_dart.template | 4 +- engine/core/dom/Element.cpp | 11 ------ engine/core/dom/Element.h | 3 -- engine/core/dom/Element.idl | 3 +- framework/sky-element.sky | 4 +- 7 files changed, 42 insertions(+), 21 deletions(-) create mode 100644 engine/bindings/custom/dart_element_custom.cc diff --git a/engine/bindings/BUILD.gn b/engine/bindings/BUILD.gn index 6163a4c1e6..ae26c6bc5f 100644 --- a/engine/bindings/BUILD.gn +++ b/engine/bindings/BUILD.gn @@ -13,6 +13,7 @@ source_set("bindings") { "builtin_natives.h", "builtin_sky.cc", "builtin_sky.h", + "custom/dart_element_custom.cc", "dart_callback.cc", "dart_callback.h", "dart_event_listener.cc", diff --git a/engine/bindings/custom/dart_element_custom.cc b/engine/bindings/custom/dart_element_custom.cc new file mode 100644 index 0000000000..39ea4a02ea --- /dev/null +++ b/engine/bindings/custom/dart_element_custom.cc @@ -0,0 +1,37 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "sky/engine/config.h" +#include "sky/engine/core/dom/Element.h" + +#include "dart/runtime/include/dart_api.h" +#include "sky/engine/core/script/dom_dart_state.h" +#include "sky/engine/tonic/dart_converter.h" + +namespace blink { +namespace DartElementInternal { + +void constructorCallback(Dart_NativeArguments args) { + Dart_Handle receiver = Dart_GetNativeArgument(args, 0); + DCHECK(!LogIfError(receiver)); + + Dart_Handle tag_name = Dart_GetField(receiver, + Dart_NewStringFromCString("tagName")); + if (!Dart_IsString(tag_name)) { + Dart_ThrowException(Dart_NewStringFromCString("tagName is not a string")); + return; + } + + RefPtr element = Element::create( + QualifiedName(StringFromDart(tag_name)), DOMDartState::CurrentDocument()); + + // TODO(abarth): We should remove these states because elements are never + // waiting for upgrades. + element->setCustomElementState(Element::WaitingForUpgrade); + element->setCustomElementState(Element::Upgraded); + element->AssociateWithDartWrapper(args); +} + +} // namespace DartElementInternal +} // namespace blink diff --git a/engine/bindings/scripts/templates/interface_dart.template b/engine/bindings/scripts/templates/interface_dart.template index 3ec63ac3c8..d99e7a614b 100644 --- a/engine/bindings/scripts/templates/interface_dart.template +++ b/engine/bindings/scripts/templates/interface_dart.template @@ -19,11 +19,11 @@ part of sky.core; {%- endfor -%} {%- endmacro -%} -{% if not constructors %}abstract {% endif -%} +{% if not constructors and not custom_constructors %}abstract {% endif -%} class {{interface_name}} extends {{ parent_interface if parent_interface else 'NativeFieldWrapperClass2' }} { // Constructors {# TODO(eseidel): We only ever have one constructor. #} -{%- for constructor in constructors %} +{%- for constructor in constructors + custom_constructors %} void _constructor( {%- for arg in constructor.arguments -%} {{ arg.dart_type }} {{ arg.name }}{% if not loop.last %}, {% endif %} diff --git a/engine/core/dom/Element.cpp b/engine/core/dom/Element.cpp index 1918bbbe4b..78d958c9d3 100644 --- a/engine/core/dom/Element.cpp +++ b/engine/core/dom/Element.cpp @@ -87,17 +87,6 @@ namespace blink { -PassRefPtr Element::create(Document& document, const AtomicString& tagName) -{ - DCHECK(DartState::Current()) << "This function should be used only by the bindings"; - RefPtr element = create(QualifiedName(tagName), &document); - // TODO(abarth): We should remove these states because elements are never - // waiting for upgrades. - element->setCustomElementState(Element::WaitingForUpgrade); - element->setCustomElementState(Element::Upgraded); - return element.release(); -} - PassRefPtr Element::create(const QualifiedName& tagName, Document* document) { return adoptRef(new Element(tagName, document, CreateElement)); diff --git a/engine/core/dom/Element.h b/engine/core/dom/Element.h index 66c1e2224e..06fb806f0a 100644 --- a/engine/core/dom/Element.h +++ b/engine/core/dom/Element.h @@ -65,9 +65,6 @@ enum SpellcheckAttributeState { class Element : public ContainerNode { DEFINE_WRAPPERTYPEINFO(); public: - // Used for custom elements. - static PassRefPtr create(Document& document, const AtomicString& tagName); - static PassRefPtr create(const QualifiedName&, Document*); virtual ~Element(); diff --git a/engine/core/dom/Element.idl b/engine/core/dom/Element.idl index 3147577951..9741ef4a91 100644 --- a/engine/core/dom/Element.idl +++ b/engine/core/dom/Element.idl @@ -3,8 +3,7 @@ // found in the LICENSE file. [ - Constructor(DOMString tagName), - ConstructorCallWith=Document, + CustomConstructor, ] interface Element : ParentNode { readonly attribute DOMString tagName; diff --git a/framework/sky-element.sky b/framework/sky-element.sky index 38d757a8f5..8b04f79a50 100644 --- a/framework/sky-element.sky +++ b/framework/sky-element.sky @@ -34,9 +34,7 @@ abstract class SkyElement extends Element { String get tagName => _getTagName(runtimeType); - // TODO(abarth): Rather than hard-coding "example" here, we should make the - // bindings read the |tagName| property of this object during construction. - SkyElement() : super("example") { + SkyElement() { created(); // Invoke attributeChanged callback when element is first created too. -- GitLab