Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: sky/framework/sky-element/element-registry.sky

Issue 868973002: Don't set expression attributes before they're bound. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sky/examples/widgets/index.sky ('k') | sky/framework/sky-element/sky-binder.sky » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 <!-- 1 <!--
2 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Copyright 2014 The Chromium Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be 3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file. 4 // found in the LICENSE file.
5 --> 5 -->
6 <import src="sky-binder.sky" as="binder" /> 6 <import src="sky-binder.sky" as="binder" />
7 <script> 7 <script>
8 // TODO(esprehn): It would be nice if these were exposed by the platform so 8 // TODO(esprehn): It would be nice if these were exposed by the platform so
9 // the framework didn't need to hard code a list. 9 // the framework didn't need to hard code a list.
10 var globalAttributesNames = new Set([ 10 var globalAttributesNames = new Set([
11 'class', 11 'class',
12 'contenteditable', 12 'contenteditable',
13 'dir', 13 'dir',
14 'id', 14 'id',
15 'lang', 15 'lang',
16 'spellcheck', 16 'spellcheck',
17 'tabindex', 17 'tabindex',
18 'style', 18 'style',
19 ]); 19 ]);
20 20
21 function isExpandableAttribute(name) {
22 return name.startsWith('data-') || name.startsWith('on-');
23 }
24
25 function isGlobalAttribute(name) {
26 if (isExpandableAttribute(name))
27 return true;
28 return globalAttributesNames.has(name);
29 }
30
21 var attributeConverters = { 31 var attributeConverters = {
22 boolean: function(value) { 32 boolean: function(value) {
23 if (typeof value == 'string') 33 if (typeof value == 'string')
24 return value == 'true'; 34 return value == 'true';
25 return !!value; 35 return !!value;
26 }, 36 },
27 number: function(value) { 37 number: function(value) {
28 return Number(value); 38 return Number(value);
29 }, 39 },
30 string: function(value) { 40 string: function(value) {
(...skipping 18 matching lines...) Expand all
49 class ElementRegistration { 59 class ElementRegistration {
50 constructor(tagName) { 60 constructor(tagName) {
51 this.tagName = tagName; 61 this.tagName = tagName;
52 this.attributes = new Map(); 62 this.attributes = new Map();
53 this.eventHandlers = new Map(); 63 this.eventHandlers = new Map();
54 this.template = null; 64 this.template = null;
55 Object.preventExtensions(this); 65 Object.preventExtensions(this);
56 } 66 }
57 67
58 allowsAttribute(name) { 68 allowsAttribute(name) {
59 if (name.startsWith('data-')) 69 if (isGlobalAttribute(name))
60 return true;
61 if (globalAttributesNames.has(name))
62 return true; 70 return true;
63 if (this.attributes.has(name)) 71 if (this.attributes.has(name))
64 return true; 72 return true;
65 return false; 73 return false;
66 } 74 }
67 75
68 defineAttribute(name, type) { 76 defineAttribute(name, type) {
69 var converter = attributeConverters[type]; 77 var converter = attributeConverters[type];
70 78
71 if (!converter) { 79 if (!converter) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 } 121 }
114 122
115 function getRegistration(tagName) { 123 function getRegistration(tagName) {
116 return registrations.get(tagName); 124 return registrations.get(tagName);
117 } 125 }
118 126
119 function checkAttribute(tagName, attrName) { 127 function checkAttribute(tagName, attrName) {
120 var registration = getRegistration(tagName); 128 var registration = getRegistration(tagName);
121 129
122 if (!registration) 130 if (!registration)
123 return globalAttributesNames.has(attrName); 131 return isGlobalAttribute(attrName);
124 132
125 return registration.allowsAttribute(attrName); 133 return registration.allowsAttribute(attrName);
126 } 134 }
127 135
128 registerElement('img', { 136 registerElement('img', {
129 'width': 'number', 137 'width': 'number',
130 'height': 'number', 138 'height': 'number',
131 // TODO(esprehn): Sky probably doesn't want the crossorign attr. 139 // TODO(esprehn): Sky probably doesn't want the crossorign attr.
132 'crossorigin': 'string', 140 'crossorigin': 'string',
133 'src': 'string', 141 'src': 'string',
(...skipping 20 matching lines...) Expand all
154 162
155 registerElement('template', { 163 registerElement('template', {
156 'if': 'string', 164 'if': 'string',
157 'repeat': 'string', 165 'repeat': 'string',
158 }); 166 });
159 167
160 module.exports = { 168 module.exports = {
161 registerElement: registerElement, 169 registerElement: registerElement,
162 getRegistration: getRegistration, 170 getRegistration: getRegistration,
163 checkAttribute: checkAttribute, 171 checkAttribute: checkAttribute,
172 isGlobalAttribute: isGlobalAttribute,
173 isExpandableAttribute: isExpandableAttribute,
164 }; 174 };
165 </script> 175 </script>
OLDNEW
« no previous file with comments | « sky/examples/widgets/index.sky ('k') | sky/framework/sky-element/sky-binder.sky » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698