Index: sky/framework/sky-element/sky-element.sky |
diff --git a/sky/framework/sky-element/sky-element.sky b/sky/framework/sky-element/sky-element.sky |
deleted file mode 100644 |
index 07818bc21bb9183dd64cac621ad46106b523294a..0000000000000000000000000000000000000000 |
--- a/sky/framework/sky-element/sky-element.sky |
+++ /dev/null |
@@ -1,195 +0,0 @@ |
-<!-- |
-// Copyright 2014 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. |
---> |
-<import src="sky-binder.sky" as="binder" /> |
-<import src="element-registry.sky" as="registry" /> |
-<script> |
-function parseAttributeSpec(registration, definition) { |
- var spec = definition.getAttribute('attributes'); |
- |
- if (!spec) |
- return; |
- |
- var attributeTokens = spec.split(','); |
- |
- for (var i = 0; i < attributeTokens.length; ++i) { |
- var parts = attributeTokens[i].split(':'); |
- |
- if (parts.length != 2) { |
- console.error('Invalid attribute spec "' + spec + '", attributes must' + |
- ' be {name}:{type}, where type is one of boolean, number or' + |
- ' string.'); |
- continue; |
- } |
- |
- var name = parts[0].trim(); |
- var type = parts[1].trim(); |
- |
- registration.defineAttribute(name, type); |
- } |
-} |
- |
-function parseEventHandlers(registration, definition) { |
- var eventHandlers = []; |
- var attributes = definition.getAttributes(); |
- |
- for (var i = 0; i < attributes.length; i++) { |
- var attr = attributes[i]; |
- var name = attr.name; |
- var value = attr.value; |
- |
- if (name.startsWith('on-')) { |
- registration.eventHandlers.set(name.substring(3), value); |
- } |
- } |
-} |
- |
-class SkyElement extends HTMLElement { |
- |
- static register() { |
- var definition = document.currentScript.parentNode; |
- |
- if (definition.localName !== 'sky-element') { |
- throw new Error('register() calls must be inside a <sky-element>.'); |
- } |
- |
- var tagName = definition.getAttribute('name'); |
- if (!tagName) { |
- throw new Error('<sky-element> must have a name.'); |
- } |
- |
- var registration = registry.registerElement(tagName); |
- |
- parseAttributeSpec(registration, definition); |
- parseEventHandlers(registration, definition); |
- |
- registration.template = definition.querySelector('template'); |
- |
- registration.synthesizeAttributes(this.prototype); |
- |
- return document.registerElement(tagName, { |
- prototype: this.prototype, |
- }); |
- } |
- |
- created() { |
- // override |
- } |
- |
- attached() { |
- // override |
- } |
- |
- detached() { |
- // override |
- } |
- |
- attributeChanged(attrName, oldValue, newValue) { |
- // override |
- } |
- |
- shadowRootReady() { |
- // override |
- } |
- |
- createdCallback() { |
- this.isAttached = false; |
- this.propertyBindings = null; |
- this.dirtyPropertyBindings = null; |
- this.created(); |
- |
- Object.preventExtensions(this); |
- |
- // Invoke attributeChanged callback when element is first created too. |
- var attributes = this.getAttributes(); |
- for (var i = 0; i < attributes.length; ++i) { |
- var attribute = attributes[i]; |
- this.attributeChangedCallback(attribute.name, null, attribute.value); |
- } |
- |
- var registration = registry.getRegistration(this.localName); |
- registration.addInstanceEventListeners(this); |
- } |
- |
- attachedCallback() { |
- if (!this.shadowRoot) { |
- var registration = registry.getRegistration(this.localName); |
- if (registration.template) { |
- var shadow = this.ensureShadowRoot(); |
- var instance = binder.createInstance(registration.template, this); |
- shadow.appendChild(instance.fragment); |
- this.shadowRootReady(); |
- } |
- } |
- this.attached(); |
- this.isAttached = true; |
- } |
- |
- detachedCallback() { |
- this.detached(); |
- this.isAttached = false; |
- } |
- |
- attributeChangedCallback(name, oldValue, newValue) { |
- if (registry.isExpandableAttribute(name)) |
- return; |
- this.attributeChanged(name, oldValue, newValue); |
- var registration = registry.getRegistration(this.localName); |
- var converter = registration.attributes.get(name); |
- if (converter) { |
- this.notifyPropertyChanged(name, converter(oldValue), |
- converter(newValue)); |
- } |
- } |
- |
- notifyPropertyChanged(name, oldValue, newValue) { |
- if (oldValue == newValue) |
- return; |
- var notifier = Object.getNotifier(this); |
- notifier.notify({ |
- type: 'update', |
- name: name, |
- oldValue: oldValue, |
- }); |
- var handler = this[name + 'Changed']; |
- if (typeof handler == 'function') |
- handler.call(this, oldValue, newValue); |
- this.schedulePropertyBindingUpdate(name); |
- } |
- |
- addPropertyBinding(name, binding) { |
- if (!this.propertyBindings) |
- this.propertyBindings = new Map(); |
- this.propertyBindings.set(name, binding); |
- } |
- |
- getPropertyBinding(name) { |
- if (!this.propertyBindings) |
- return null; |
- return this.propertyBindings.get(name); |
- } |
- |
- schedulePropertyBindingUpdate(name) { |
- if (!this.dirtyPropertyBindings) { |
- this.dirtyPropertyBindings = new Set(); |
- Promise.resolve().then(this.updatePropertyBindings.bind(this)); |
- } |
- this.dirtyPropertyBindings.add(name); |
- } |
- |
- updatePropertyBindings() { |
- for (var name of this.dirtyPropertyBindings) { |
- var binding = this.getPropertyBinding(name); |
- if (binding) { |
- binding.setValue(this[name]); |
- binding.discardChanges(); |
- } |
- } |
- this.dirtyPropertyBindings = null; |
- } |
-}; |
- |
-module.exports = SkyElement; |
-</script> |