Adam Barth 7d00bd5e06 Implement Custom Elements
This CL implements custom elements. The design is as follows:

1) Authors subclass Element and call registerElement.
2) When we create C++ elements for custom elements, we call the author's
   constructor synchronously.
3) The attach/detach/attributeChanged callbacks are called either:
   a) when exiting the current custom element callback scoped (e.g., before
      returning from appendChild), or
   b) when draining the microtask queue.

The implementation in this CL is a bit fragile because we don't detect name
registration conflicts and we let you create custom elements with the same name
as built-in elements. Also, not every part of the engine is prepared to execute
script synchronously below createElement. We'll need to iron out these issues
over time, but this CL is a start.

R=ojan@chromium.org

Review URL: https://codereview.chromium.org/943013002
2015-02-20 16:15:42 -08:00

56 lines
1.5 KiB
Plaintext

<sky>
<script>
import "../resources/third_party/unittest/unittest.dart";
import "../resources/unit.dart";
import "dart:sky";
class FooElement extends Element {
FooElement() : super("foo");
attachedCallback() {
++attachedCallbackCount;
}
detachedCallback() {
++detachedCallbackCount;
}
attributeChangedCallback(String name, String oldValue, String newValue) {
++attributeChangedCallbackCount;
}
int attachedCallbackCount = 0;
int detachedCallbackCount = 0;
int attributeChangedCallbackCount = 0;
}
void main() {
initUnit();
document.registerElement("foo", FooElement);
test("callbacks should be called", () {
Element sky = document.querySelector("sky");
FooElement foo = document.createElement("foo");
expect(foo.attachedCallbackCount, equals(0));
expect(foo.detachedCallbackCount, equals(0));
expect(foo.attributeChangedCallbackCount, equals(0));
sky.appendChild(foo);
expect(foo.attachedCallbackCount, equals(1));
expect(foo.detachedCallbackCount, equals(0));
expect(foo.attributeChangedCallbackCount, equals(0));
foo.setAttribute("bar", "baz");
expect(foo.attachedCallbackCount, equals(1));
expect(foo.detachedCallbackCount, equals(0));
expect(foo.attributeChangedCallbackCount, equals(1));
foo.remove();
expect(foo.attachedCallbackCount, equals(1));
expect(foo.detachedCallbackCount, equals(1));
expect(foo.attributeChangedCallbackCount, equals(1));
});
}
</script>
</sky>