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

Unified Diff: third_party/polymer/v0_8/components-chromium/polymer/src/lib/template/x-if-extracted.js

Issue 1082403004: Import Polymer 0.8 and several key elements. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Also remove polymer/explainer Created 5 years, 8 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: third_party/polymer/v0_8/components-chromium/polymer/src/lib/template/x-if-extracted.js
diff --git a/third_party/polymer/v0_8/components-chromium/polymer/src/lib/template/x-if-extracted.js b/third_party/polymer/v0_8/components-chromium/polymer/src/lib/template/x-if-extracted.js
new file mode 100644
index 0000000000000000000000000000000000000000..d8cb6f3275a26675ea41efbc7a52d1c593243cfd
--- /dev/null
+++ b/third_party/polymer/v0_8/components-chromium/polymer/src/lib/template/x-if-extracted.js
@@ -0,0 +1,126 @@
+
+
+ /**
+ * Stamps the template iff the `if` property is truthy.
+ *
+ * When `if` becomes falsey, the stamped content is hidden but not
+ * removed from dom. When `if` subsequently becomes truthy again, the content
+ * is simply re-shown. This approach is used due to its favorable performance
+ * characteristics: the expense of creating template content is paid only
+ * once and lazily.
+ *
+ * Set the `restamp` property to true to force the stamped content to be
+ * created / destroyed when the `if` condition changes.
+ */
+ Polymer({
+
+ is: 'x-if',
+ extends: 'template',
+
+ properties: {
+
+ 'if': {
+ type: Boolean,
+ value: false
+ },
+
+ restamp: {
+ type: Boolean,
+ value: false
+ }
+
+ },
+
+ behaviors: [
+ Polymer.Templatizer
+ ],
+
+ observers: [
+ 'render(if, restamp)'
+ ],
+
+ render: function() {
+ this.debounce('render', function() {
+ if (this.if) {
+ if (!this.ctor) {
+ this._wrapTextNodes(this._content);
+ this.templatize(this);
+ }
+ this._ensureInstance();
+ } else if (this.restamp) {
+ this._teardownInstance();
+ }
+ if (!this.restamp && this._instance) {
+ this._showHideInstance(this.if);
+ }
+ });
+ },
+
+ _ensureInstance: function() {
+ if (!this._instance) {
+ // TODO(sorvell): pickup stamping logic from x-repeat
+ this._instance = this.stamp();
+ var root = this._instance.root;
+ this._instance._children = Array.prototype.slice.call(root.childNodes);
+ // TODO(sorvell): this incantation needs to be simpler.
+ var parent = Polymer.dom(Polymer.dom(this).parentNode);
+ parent.insertBefore(root, this);
+ }
+ },
+
+ _teardownInstance: function() {
+ if (this._instance) {
+ var parent = Polymer.dom(Polymer.dom(this).parentNode);
+ this._instance._children.forEach(function(n) {
+ parent.removeChild(n);
+ });
+ this._instance = null;
+ }
+ },
+
+ _wrapTextNodes: function(root) {
+ // wrap text nodes in span so they can be hidden.
+ for (var n = root.firstChild; n; n=n.nextSibling) {
+ if (n.nodeType === Node.TEXT_NODE) {
+ var s = document.createElement('span');
+ root.insertBefore(s, n);
+ s.appendChild(n);
+ n = s;
+ }
+ }
+ },
+
+ // Implements extension point from Templatizer mixin
+ _getStampedChildren: function() {
+ return this._instance._children;
+ },
+
+ _showHideInstance: function(showing) {
+ this._getAllStampedChildren().forEach(function(n) {
+ if (n.setAttribute) {
+ this.serializeValueToAttribute(!showing, 'hidden', n);
+ }
+ }, this);
+ },
+
+ // Implements extension point from Templatizer mixin
+ // Called as side-effect of a host property change, responsible for
+ // notifying parent.<prop> path change on instance
+ _forwardParentProp: function(prop, value) {
+ if (this._instance) {
+ this._instance.parent[prop] = value;
+ this._instance.notifyPath('parent.' + prop, value, true);
+ }
+ },
+
+ // Implements extension point from Templatizer
+ // Called as side-effect of a host path change, responsible for
+ // notifying parent.<path> path change on each row
+ _forwardParentPath: function(path, value) {
+ if (this._instance) {
+ this._instance.notifyPath('parent.' + path, value, true);
+ }
+ }
+
+ });
+

Powered by Google App Engine
This is Rietveld 408576698