| Index: lib/src/iron-component-page/iron-component-page.html
|
| diff --git a/lib/src/iron-component-page/iron-component-page.html b/lib/src/iron-component-page/iron-component-page.html
|
| index d8693e93b4461dbe5428436d71cb1c46bc9b9b42..d4a0c5a3b6b029ee5d9d12c76d80a9272b0f477c 100644
|
| --- a/lib/src/iron-component-page/iron-component-page.html
|
| +++ b/lib/src/iron-component-page/iron-component-page.html
|
| @@ -58,7 +58,7 @@ documentation page including demos (if available).
|
| No documentation found.
|
| </div>
|
| </div>
|
| - <iframe id="demo" src="[[_frameSrc(view, base)]]"></iframe>
|
| + <div id="demo"></div>
|
| </iron-selector>
|
| </div>
|
| </paper-header-panel>
|
| @@ -135,8 +135,8 @@ documentation page including demos (if available).
|
| */
|
| active: {
|
| type: String,
|
| - observer: '_activeChanged',
|
| - notify: true
|
| + notify: true,
|
| + value: ''
|
| },
|
|
|
| /**
|
| @@ -161,17 +161,21 @@ documentation page including demos (if available).
|
| /** The Hydrolysis element descriptors that have been loaded. */
|
| docElements: {
|
| type: Array,
|
| - observer: '_descriptorsChanged',
|
| notify: true,
|
| - readOnly: true
|
| + readOnly: true,
|
| + value: function() {
|
| + return [];
|
| + }
|
| },
|
|
|
| /** The Hydrolysis behavior descriptors that have been loaded. */
|
| docBehaviors: {
|
| type: Array,
|
| - observer: '_descriptorsChanged',
|
| notify: true,
|
| - readOnly: true
|
| + readOnly: true,
|
| + value: function() {
|
| + return [];
|
| + }
|
| },
|
|
|
| /**
|
| @@ -246,6 +250,11 @@ documentation page including demos (if available).
|
| _srcUrl: String,
|
| },
|
|
|
| + observers: [
|
| + '_updateFrameSrc(view, base)',
|
| + '_activeChanged(active, _analyzer)'
|
| + ],
|
| +
|
| ready: function() {
|
| var elements = this._loadJson();
|
| if (elements) {
|
| @@ -312,25 +321,49 @@ documentation page including demos (if available).
|
| if (!this._hydroLoading) this.$.analyzer.analyze();
|
| },
|
|
|
| - _frameSrc: function(view) {
|
| + _updateFrameSrc: function(view) {
|
| if (!view || view.indexOf("demo:") !== 0) return "about:blank";
|
| +
|
| var src = view.split(':')[1];
|
| - return new URL(src, this.base).toString();
|
| - },
|
| + var demoSrc = new URL(src, this.base).toString();
|
|
|
| - _descriptorsChanged: function() {
|
| - if (this._findDescriptor(this.active)) {
|
| - this._activeChanged();
|
| - return;
|
| + // If you use history.pushState with iframe.src = url, you will create 2 history entries,
|
| + // but setting the `src` attribute imperatively will not.
|
| +
|
| + if (this._iframe) {
|
| + Polymer.dom(this.$.demo).removeChild(this._iframe);
|
| }
|
|
|
| - if (this.docElements && this.docElements[0]) {
|
| - this.active = this.docElements[0].is;
|
| - } else if (this.docBehaviors && this.docBehaviors[0]) {
|
| - this.active = this.docBehaviors[0].is;
|
| - } else {
|
| - this.active = null;
|
| + this._iframe = document.createElement('iframe');
|
| + this._iframe.src = demoSrc;
|
| + Polymer.dom(this.$.demo).appendChild(this._iframe);
|
| + },
|
| +
|
| + _getDefaultActive: function() {
|
| + var matchedPage;
|
| + var url = this._srcUrl || this.base;
|
| + var mainFile = url.replace(_baseUrl(this.base), '');
|
| +
|
| + function findMatch(list) {
|
| + for (var item, i = 0; i < list.length; i++) {
|
| + item = list[i];
|
| + if (item && item.contentHref && item.contentHref.indexOf(mainFile) > 0) {
|
| + return item;
|
| + }
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + matchedPage = findMatch(this.docElements) || findMatch(this.docBehaviors);
|
| +
|
| + if (matchedPage) {
|
| + return matchedPage.is;
|
| + } else if (this.docElements.length > 0) {
|
| + return this.docElements[0].is;
|
| + } else if (this.docBehaviors.length > 0) {
|
| + return this.docBehaviors[0].is;
|
| }
|
| + return null;
|
| },
|
|
|
| _findDescriptor: function(name) {
|
| @@ -347,11 +380,15 @@ documentation page including demos (if available).
|
| return null;
|
| },
|
|
|
| - _activeChanged: function() {
|
| - this.async(function() { this.$.active.value = this.active; });
|
| - if (this._analyzer && this._analyzer.elementsByTagName) {
|
| + _activeChanged: function(active, analyzer) {
|
| + if (active === '') {
|
| + this.active = this._getDefaultActive();
|
| + return;
|
| + }
|
| + this.async(function() { this.$.active.value = active; });
|
| + if (analyzer && analyzer.elementsByTagName) {
|
| this.$.headerPanel.scroller.scrollTop = 0;
|
| - this._activeDescriptor = this._findDescriptor(this.active);
|
| + this._activeDescriptor = this._findDescriptor(active);
|
| if (this._activeDescriptor) {
|
| var hasDemo;
|
| var demos = this._activeDescriptor.demos;
|
| @@ -385,13 +422,19 @@ documentation page including demos (if available).
|
| _loadingChanged: function() {
|
| this.toggleClass('loaded', !this._loading);
|
| },
|
| +
|
| _detectLoading: function() {
|
| this._loading = this.docSrc ? this._ajaxLoading : this._hydroLoading;
|
| },
|
|
|
| _analyzerChanged: function() {
|
| - this._setDocElements(this._analyzer ? this._analyzer.elements : []);
|
| - this._setDocBehaviors(this._analyzer ? this._analyzer.behaviors : []);
|
| + var analyzer = this._analyzer;
|
| + this._setDocElements(analyzer && analyzer.elements ? analyzer.elements : []);
|
| + this._setDocBehaviors(analyzer && analyzer.behaviors ? analyzer.behaviors : []);
|
| +
|
| + if (!this._findDescriptor(this.active)) {
|
| + this.active = this._getDefaultActive();
|
| + }
|
| },
|
| _detectAnalyzer: function() {
|
| this._analyzer = this.docSrc ? this._ajaxDesc : this._hydroDesc;
|
|
|