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

Unified Diff: pkg/polymer/lib/src/declaration.dart

Issue 182193002: [polymer] interop with polymer-element and polymer.js (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/polymer/lib/src/boot.dart ('k') | pkg/polymer/lib/src/instance.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/polymer/lib/src/declaration.dart
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index 362a6905c303d6b889ca3f39d5fa1caa16fab65a..3cdaba828b519dc9f99c23779847dddb460f7dce 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -4,45 +4,22 @@
part of polymer;
-/// **Warning**: this class is experiental and subject to change.
+/// *Warning* this class is experimental and subject to change.
///
-/// The implementation for the `polymer-element` element.
-///
-/// Normally you do not need to use this class directly, see [PolymerElement].
-class PolymerDeclaration extends HtmlElement {
- static const _TAG = 'polymer-element';
-
- factory PolymerDeclaration() => new Element.tag(_TAG);
- // Fully ported from revision:
- // https://github.com/Polymer/polymer/blob/b7200854b2441a22ce89f6563963f36c50f5150d
- //
- // src/declaration/attributes.js
- // src/declaration/events.js
- // src/declaration/polymer-element.js
- // src/declaration/properties.js
- // src/declaration/prototype.js (note: most code not needed in Dart)
- // src/declaration/styles.js
- //
- // Not yet ported:
- // src/declaration/path.js - blocked on HTMLImports.getDocumentUrl
-
- Type _type;
- Type get type => _type;
-
- // TODO(jmesserly): this is a cache, because it's tricky in Dart to get from
- // Type -> Supertype.
- Type _supertype;
- Type get supertype => _supertype;
-
- // TODO(jmesserly): this is also a cache, since we can't store .element on
- // each level of the __proto__ like JS does.
- PolymerDeclaration _super;
- PolymerDeclaration get superDeclaration => _super;
-
- String _extendsName;
-
- String _name;
- String get name => _name;
+/// The data associated with a polymer-element declaration, if it is backed
+/// by a Dart class instead of a JavaScript prototype.
+class PolymerDeclaration {
+ /// The polymer-element for this declaration.
+ final HtmlElement element;
+
+ /// The Dart type corresponding to this custom element declaration.
+ final Type type;
+
+ /// If we extend another custom element, this points to the super declaration.
+ final PolymerDeclaration superDeclaration;
+
+ /// The name of the custom element.
+ final String name;
/// Map of publish properties. Can be a field or a property getter, but if
/// this map contains a getter, is because it also has a corresponding setter.
@@ -70,7 +47,7 @@ class PolymerDeclaration extends HtmlElement {
List<Element> get styles => _styles;
DocumentFragment get templateContent {
- final template = this.querySelector('template');
+ final template = element.querySelector('template');
return template != null ? templateBind(template).content : null;
}
@@ -82,86 +59,24 @@ class PolymerDeclaration extends HtmlElement {
// per element (why does the js implementation stores 1 per template node?)
Expando<Set<String>> _templateDelegates;
- PolymerDeclaration.created() : super.created() {
- // fetch the element name
- _name = attributes['name'];
- // fetch our extendee name
- _extendsName = attributes['extends'];
- // install element definition, if ready
- registerWhenReady();
- }
-
- void registerWhenReady() {
- // if we have no prototype, wait
- if (waitingForType(name)) {
- return;
- }
- if (waitingForExtendee(_extendsName)) {
- //console.warn(name + ': waitingForExtendee:' + extendee);
- return;
- }
- // TODO(sjmiles): HTMLImports polyfill awareness:
- // elements in the main document are likely to parse
- // in advance of elements in imports because the
- // polyfill parser is simulated
- // therefore, wait for imports loaded before
- // finalizing elements in the main document
- // TODO(jmesserly): Polymer.dart waits for HTMLImportsLoaded, so I've
- // removed "whenImportsLoaded" for now. Restore the workaround if needed.
- _register(_extendsName);
- }
-
- void _register(extendee) {
- //console.group('registering', name);
- register(name, extendee);
- //console.groupEnd();
- // subclasses may now register themselves
- _notifySuper(name);
- }
-
- bool waitingForType(String name) {
- if (_getRegisteredType(name) != null) return false;
-
- // then wait for a prototype
- _waitType[name] = this;
- // if explicitly marked as 'noscript'
- if (attributes.containsKey('noscript')) {
- // TODO(sorvell): CustomElements polyfill awareness:
- // noscript elements should upgrade in logical order
- // script injection ensures this under native custom elements;
- // under imports + ce polyfills, scripts run before upgrades.
- // dependencies should be ready at upgrade time so register
- // prototype at this time.
- // TODO(jmesserly): I'm not sure how to port this; since script
- // injection doesn't work for Dart, we'll just call Polymer.register
- // here and hope for the best.
- Polymer.register(name);
- }
- return true;
- }
+ String get extendee => superDeclaration != null ?
+ superDeclaration.name : null;
- bool waitingForExtendee(String extendee) {
- // if extending a custom element...
- if (extendee != null && extendee.indexOf('-') >= 0) {
- // wait for the extendee to be _registered first
- if (!_isRegistered(extendee)) {
- _waitSuper.putIfAbsent(extendee, () => []).add(this);
- return true;
- }
- }
- return false;
- }
+ // Dart note: since polymer-element is handled in JS now, we have a simplified
+ // flow for registering. We don't need to wait for the supertype or the code
+ // to be noticed.
+ PolymerDeclaration(this.element, this.name, this.type, this.superDeclaration);
- void register(String name, String extendee) {
+ void register() {
// build prototype combining extendee, Polymer base, and named api
- buildType(name, extendee);
+ buildType();
// back reference declaration element
// TODO(sjmiles): replace `element` with `elementElement` or `declaration`
_declarations[name] = this;
// more declarative features
- desugar(name, extendee);
+ desugar();
// register our custom element
registerType(name);
@@ -175,16 +90,9 @@ class PolymerDeclaration extends HtmlElement {
///
/// *Note*: unlike the JavaScript version, we do not have to metaprogram the
/// prototype, which simplifies this method.
- void buildType(String name, String extendee) {
- // get our custom type
- _type = _getRegisteredType(name);
-
- // get basal prototype
- _supertype = _getRegisteredType(extendee);
- if (_supertype != null) _super = _getDeclaration(extendee);
-
+ void buildType() {
// transcribe `attributes` declarations onto own prototype's `publish`
- publishAttributes(_super);
+ publishAttributes(superDeclaration);
publishProperties();
@@ -202,7 +110,7 @@ class PolymerDeclaration extends HtmlElement {
}
/// Implement various declarative features.
- void desugar(name, extendee) {
+ void desugar() {
// compile list of attributes to copy to instances
accumulateInstanceAttributes();
// parse on-* delegates declared on `this` element
@@ -249,7 +157,7 @@ class PolymerDeclaration extends HtmlElement {
var baseTag;
var decl = this;
while (decl != null) {
- baseTag = decl.attributes['extends'];
+ baseTag = decl.element.attributes['extends'];
decl = decl.superDeclaration;
}
document.register(name, type, extendsTag: baseTag);
@@ -264,10 +172,10 @@ class PolymerDeclaration extends HtmlElement {
_publish = new Map.from(superDecl._publish);
}
- _publish = _getPublishedProperties(_type, _publish);
+ _publish = _getPublishedProperties(type, _publish);
// merge names from 'attributes' attribute
- var attrs = attributes['attributes'];
+ var attrs = element.attributes['attributes'];
if (attrs != null) {
// names='a b c' or names='a,b,c'
// record each name for publishing
@@ -284,7 +192,7 @@ class PolymerDeclaration extends HtmlElement {
continue;
}
- var decl = smoke.getDeclaration(_type, property);
+ var decl = smoke.getDeclaration(type, property);
if (decl == null || decl.isMethod || decl.isFinal) {
window.console.warn('property for attribute $attr of polymer-element '
'name=$name not found.');
@@ -303,10 +211,12 @@ class PolymerDeclaration extends HtmlElement {
void accumulateInstanceAttributes() {
// inherit instance attributes
_instanceAttributes = new Map<String, Object>();
- if (_super != null) _instanceAttributes.addAll(_super._instanceAttributes);
+ if (superDeclaration != null) {
+ _instanceAttributes.addAll(superDeclaration._instanceAttributes);
+ }
// merge attributes from element
- attributes.forEach((name, value) {
+ element.attributes.forEach((name, value) {
if (isInstanceAttribute(name)) {
_instanceAttributes[name] = value;
}
@@ -328,7 +238,7 @@ class PolymerDeclaration extends HtmlElement {
}
void addAttributeDelegates(Map<String, String> delegates) {
- attributes.forEach((name, value) {
+ element.attributes.forEach((name, value) {
if (_hasEventPrefix(name)) {
var start = value.indexOf('{{');
var end = value.lastIndexOf('}}');
@@ -388,7 +298,7 @@ class PolymerDeclaration extends HtmlElement {
}
List<Element> findNodes(String selector, [bool matcher(Element e)]) {
- var nodes = this.querySelectorAll(selector).toList();
+ var nodes = element.querySelectorAll(selector).toList();
var content = templateContent;
if (content != null) {
nodes = nodes..addAll(content.querySelectorAll(selector));
@@ -443,7 +353,7 @@ class PolymerDeclaration extends HtmlElement {
var options = const smoke.QueryOptions(includeFields: false,
includeProperties: false, includeMethods: true, includeInherited: true,
includeUpTo: HtmlElement);
- for (var decl in smoke.query(_type, options)) {
+ for (var decl in smoke.query(type, options)) {
String name = smoke.symbolToName(decl.name);
if (name.endsWith(_OBSERVE_SUFFIX) && name != 'attributeChanged') {
// TODO(jmesserly): now that we have a better system, should we
@@ -461,7 +371,7 @@ class PolymerDeclaration extends HtmlElement {
var options = const smoke.QueryOptions(includeFields: false,
includeProperties: false, includeMethods: true, includeInherited: true,
includeUpTo: HtmlElement, withAnnotations: const [ObserveProperty]);
- for (var decl in smoke.query(_type, options)) {
+ for (var decl in smoke.query(type, options)) {
for (var meta in decl.annotations) {
if (meta is! ObserveProperty) continue;
if (_observe == null) _observe = new HashMap();
@@ -491,26 +401,6 @@ final Map _typesByName = new Map<String, Type>();
Type _getRegisteredType(String name) => _typesByName[name];
-/// elements waiting for prototype, by name
-final Map _waitType = new Map<String, PolymerDeclaration>();
-
-void _notifyType(String name) {
- var waiting = _waitType.remove(name);
- if (waiting != null) waiting.registerWhenReady();
-}
-
-/// elements waiting for super, by name
-final Map _waitSuper = new Map<String, List<PolymerDeclaration>>();
-
-void _notifySuper(String name) {
- var waiting = _waitSuper.remove(name);
- if (waiting != null) {
- for (var w in waiting) {
- w.registerWhenReady();
- }
- }
-}
-
/// track document.register'ed tag names and their declarations
final Map _declarations = new Map<String, PolymerDeclaration>();
@@ -549,8 +439,7 @@ void _shimShadowDomStyling(DocumentFragment template, String name,
shadowCss.callMethod('shimStyling', [template, name, extendee]);
}
-final bool _hasShadowDomPolyfill = js.context != null &&
- js.context.hasProperty('ShadowDOMPolyfill');
+final bool _hasShadowDomPolyfill = js.context.hasProperty('ShadowDOMPolyfill');
const _STYLE_SELECTOR = 'style';
const _SHEET_SELECTOR = '[rel=stylesheet]';
« no previous file with comments | « pkg/polymer/lib/src/boot.dart ('k') | pkg/polymer/lib/src/instance.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698