Index: sky/framework/sky-element/element-registry.sky |
diff --git a/sky/framework/sky-element/element-registry.sky b/sky/framework/sky-element/element-registry.sky |
deleted file mode 100644 |
index ba317a808c18719a32f1f5515400d7b01540083f..0000000000000000000000000000000000000000 |
--- a/sky/framework/sky-element/element-registry.sky |
+++ /dev/null |
@@ -1,179 +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" /> |
-<script> |
-// TODO(esprehn): It would be nice if these were exposed by the platform so |
-// the framework didn't need to hard code a list. |
-var globalAttributesNames = new Set([ |
- 'class', |
- 'contenteditable', |
- 'dir', |
- 'id', |
- 'lang', |
- 'spellcheck', |
- 'tabindex', |
- 'style', |
-]); |
- |
-function isExpandableAttribute(name) { |
- return name.startsWith('data-') || name.startsWith('on-'); |
-} |
- |
-function isGlobalAttribute(name) { |
- if (isExpandableAttribute(name)) |
- return true; |
- return globalAttributesNames.has(name); |
-} |
- |
-var attributeConverters = { |
- boolean: function(value) { |
- if (typeof value == 'string') |
- return value == 'true'; |
- return !!value; |
- }, |
- number: function(value) { |
- return Number(value); |
- }, |
- string: function(value) { |
- if (value === null) |
- return ''; |
- return String(value); |
- }, |
-}; |
- |
-function eventHandlerCallback(event) { |
- var element = event.currentTarget; |
- var registration = getRegistration(element.localName); |
- var method = registration.eventHandlers.get(event.type); |
- var handler = element[method]; |
- if (!(typeof handler == 'function')) { |
- throw new Error('Element ' + element.localName + |
- ' specifies invalid event handler "' + method + '"'); |
- } |
- handler.call(element, event); |
-} |
- |
-class ElementRegistration { |
- constructor(tagName) { |
- this.tagName = tagName; |
- this.attributes = new Map(); |
- this.eventHandlers = new Map(); |
- this.template = null; |
- Object.preventExtensions(this); |
- } |
- |
- allowsAttribute(name) { |
- if (isGlobalAttribute(name)) |
- return true; |
- if (this.attributes.has(name)) |
- return true; |
- return false; |
- } |
- |
- defineAttribute(name, type) { |
- var converter = attributeConverters[type]; |
- |
- if (!converter) { |
- console.error('Invalid attribute type "' + type + '", type must be one' |
- + ' of boolean, number or string.'); |
- return; |
- } |
- |
- this.attributes.set(name, converter); |
- } |
- |
- synthesizeAttributes(prototype) { |
- this.attributes.forEach(function(converter, name) { |
- Object.defineProperty(prototype, name, { |
- get: function() { |
- return converter(this.getAttribute(name)); |
- }, |
- set: function(newValue) { |
- this.setAttribute(name, converter(newValue)); |
- }, |
- enumerable: true, |
- configurable: true, |
- }); |
- }); |
- } |
- |
- addInstanceEventListeners(instance) { |
- for (var eventName of this.eventHandlers.keys()) { |
- instance.addEventListener(eventName, eventHandlerCallback); |
- } |
- } |
-} |
- |
-var registrations = new Map(); |
- |
-function registerElement(tagName, attributes) { |
- if (registrations.has(tagName)) |
- throw new Error('tagName "' + tagName + '" registered twice.'); |
- var registration = new ElementRegistration(tagName); |
- for (var name in attributes) { |
- registration.defineAttribute(name, attributes[name]); |
- } |
- registrations.set(tagName, registration); |
- return registration; |
-} |
- |
-function getRegistration(tagName) { |
- return registrations.get(tagName); |
-} |
- |
-function checkAttribute(tagName, attrName) { |
- var registration = getRegistration(tagName); |
- |
- if (!registration) |
- return isGlobalAttribute(attrName); |
- |
- return registration.allowsAttribute(attrName); |
-} |
- |
-registerElement('img', { |
- 'width': 'number', |
- 'height': 'number', |
- // TODO(esprehn): Sky probably doesn't want the crossorign attr. |
- 'crossorigin': 'string', |
- 'src': 'string', |
-}); |
- |
-registerElement('import', { |
- 'as': 'string', |
- 'src': 'string', |
- 'async': 'boolean', |
-}); |
- |
-registerElement('a', { |
- 'href': 'string', |
- 'async': 'boolean', |
-}); |
- |
-registerElement('content', { |
- 'select': 'string', |
-}); |
- |
-registerElement('style', { |
- 'media': 'string', |
-}); |
- |
-registerElement('template', { |
- 'if': 'string', |
- 'repeat': 'string', |
-}); |
- |
-registerElement('iframe', { |
- 'src': 'string', |
-}); |
- |
-module.exports = { |
- registerElement: registerElement, |
- getRegistration: getRegistration, |
- checkAttribute: checkAttribute, |
- isGlobalAttribute: isGlobalAttribute, |
- isExpandableAttribute: isExpandableAttribute, |
-}; |
-</script> |