diff --git a/engine/bindings/BUILD.gn b/engine/bindings/BUILD.gn index 6163a4c1e692e59a3a7172a8dbc7e7e5bb357424..ae26c6bc5f76a57b42dd6afbfd0f70241b14c014 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 0000000000000000000000000000000000000000..39ea4a02eaa53efbc152d80ffad685c55f83ad70 --- /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 3ec63ac3c89cff72fdd05738edf56110b99dbcb4..d99e7a614bc0ce5710016e33e1cb1cd943373711 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 1918bbbe4bcc694fb67d5151679665be556fbad0..78d958c9d31c2020761e7fe64a2f3fc8ef43ded8 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 66c1e2224e7ab7835b549ab575fe8b892f286c10..06fb806f0a18d1fedfdcd82c3fa0400ca1c9896a 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 31475779513a44afc376f497aea331e28b2bc0db..9741ef4a91d2997339cfc938dbd53409dede7fe0 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 38d757a8f5a4fc45685ca4e1c9effd831b7675ca..8b04f79a5048e9db4bf0f0b5abfcd32df0616953 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.