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

Unified Diff: lib/polymer_element.dart

Issue 19497002: Reducing the amount of code we generate in the compiler: We still continue (Closed) Base URL: git@github.com:dart-lang/web-ui.git@master
Patch Set: Created 7 years, 5 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
Index: lib/polymer_element.dart
diff --git a/lib/polymer_element.dart b/lib/polymer_element.dart
index 1fb2c3ec8792a95c2d553204a340294bc29196f6..8be4a670f9501f6e58090ff05138577261cca577 100644
--- a/lib/polymer_element.dart
+++ b/lib/polymer_element.dart
@@ -8,6 +8,7 @@ import 'dart:async';
import 'dart:html';
import 'dart:mirrors';
+import 'package:mdv/mdv.dart' as mdv;
import 'package:observe/observe.dart';
import 'custom_element.dart';
@@ -19,23 +20,8 @@ import 'src/utils_observe.dart' show toCamelCase, toHyphenedName;
* but it is designed to work with the `<element>` element and adds additional
* features.
*/
-// TODO(sigmund): change this to take the 'localName' (recent polymer change)
-void registerPolymerElement(Element elementElement, CustomElement create()) {
- // Creates the CustomElement and then publish attributes.
- createElement() {
- final CustomElement element = create();
- // TODO(jmesserly): to simplify the DWC compiler, we always emit calls to
- // registerPolymerElement, regardless of the base class type.
- if (element is PolymerElement) {
- PolymerElement pElement = element;
- pElement._parseHostEvents(elementElement);
- pElement._parseLocalEvents(elementElement);
- pElement._publishAttributes(elementElement);
- }
- return element;
- }
-
- registerCustomElement(elementElement.attributes['name'], createElement);
+void registerPolymerElement(String localName, PolymerElement create()) {
+ registerCustomElement(localName, () => create().._initialize(localName));
}
/**
@@ -67,10 +53,45 @@ abstract class PolymerElement extends CustomElement with _EventsMixin {
// TODO(sigmund): delete. The next line is only added to avoid warnings from
// the analyzer (see http://dartbug.com/11672)
Element get host => super.host;
+
+ /**
+ * The declaration of this polymer-element, used to extract template contents
+ * and other information.
+ */
+ static Map<String, Element> _declarations = {};
+ static Element getDeclaration(String localName) {
+ if (localName == null) return null;
+ var element = _declarations[localName];
+ if (element == null) {
+ element = document.query('polymer-element[name="$localName"]');
+ _declarations[localName] = element;
+ }
+ return element;
+ }
+
Map<String, PathObserver> _publishedAttrs;
Map<String, StreamSubscription> _bindings;
+ List<String> _localNames = [];
Jennifer Messerly 2013/07/18 23:56:04 final?
Siggi Cherem (dart-lang) 2013/07/19 22:52:52 Done.
+
+ void _initialize(String localName) {
+ if (localName == null) return;
- void _publishAttributes(Element elementElement) {
+ var declaration = getDeclaration(localName);
+ if (declaration == null) return;
+
+ if (declaration.attributes['extends'] != null) {
+ var base = declaration.attributes['extends'];
+ // Skip normal tags, only initialize parent custom elements.
+ if (base.contains('-')) _initialize(base);
+ }
+
+ _parseHostEvents(declaration);
+ _parseLocalEvents(declaration);
+ _publishAttributes(declaration);
+ _localNames.add(localName);
+ }
+
+ void _publishAttributes(elementElement) {
_bindings = {};
_publishedAttrs = {};
@@ -93,14 +114,33 @@ abstract class PolymerElement extends CustomElement with _EventsMixin {
// var value = attributes[name];
// if (value != null) propObserver.value = value;
// });
-
+ _initShadowRoot();
_addHostListeners();
}
- // TODO(sigmund): make this private once we create the shadow root directly
- // here in polymer element.
- void shadowRootReady(ShadowRoot root, String elementName) {
- _addInstanceListeners(root, elementName);
+ void _initShadowRoot() {
+ for (var localName in _localNames) {
+ var declaration = getDeclaration(localName);
+ var root = createShadowRoot(localName);
+ _addInstanceListeners(root, localName);
+
+ // TODO(jmesserly): warn if apply-author-styles was not set and we don't
+ // have Shadow DOM support? In that case, styles won't have proper
Jennifer Messerly 2013/07/18 23:56:04 I think this TODO is obsolete :)
Siggi Cherem (dart-lang) 2013/07/19 22:52:52 Done.
+ // encapsulation.
+ if (root is ShadowRoot &&
Jennifer Messerly 2013/07/18 23:56:04 root is always ShadowRoot now, right?
Siggi Cherem (dart-lang) 2013/07/19 22:52:52 I think so. removed.
+ declaration.attributes['apply-author-styles'] != null) {
Jennifer Messerly 2013/07/18 23:56:04 does polymer have apply-author-styles?
Siggi Cherem (dart-lang) 2013/07/19 22:52:52 turns out they have it as a property in the protot
+ root.applyAuthorStyles = true;
+ }
+
+ var templateNode = declaration.children.firstWhere(
+ (n) => n.localName == 'template', orElse: () => null);
+ if (templateNode == null) return;
+
+ root.nodes.add(cloneTemplate(templateNode.content));
+ var syntax = templateNode.attributes['syntax'];
Jennifer Messerly 2013/07/18 23:56:04 mind adding a TODO? we should treat syntax like Po
Siggi Cherem (dart-lang) 2013/07/19 22:52:52 Done.
+ mdv.bindModel(root, this,
+ syntax != null ? TemplateElement.syntax[syntax] : null);
+ }
}
void bind(String name, model, String path) {

Powered by Google App Engine
This is Rietveld 408576698