Index: polymer_1.2.3/bower_components/iron-page-url/iron-page-url.html |
diff --git a/polymer_1.2.3/bower_components/iron-page-url/iron-page-url.html b/polymer_1.2.3/bower_components/iron-page-url/iron-page-url.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..02dc50734f9270344a35379e88bbdad90c62831f |
--- /dev/null |
+++ b/polymer_1.2.3/bower_components/iron-page-url/iron-page-url.html |
@@ -0,0 +1,284 @@ |
+<link rel="import" href="../polymer/polymer.html"> |
+ |
+<!-- |
+ |
+The `iron-page-url` element manages binding to and from the current URL. |
+ |
+iron-page-url is the first, and lowest level element in the Polymer team's |
+routing system. This is a beta release of iron-page-url as we continue work |
+on higher level elements, and as such iron-page-url may undergo breaking |
+changes. |
+ |
+#### Properties |
+ |
+When the URL is: `/search?query=583#details` iron-page-url's properties will be: |
+ |
+ - path: `'/search'` |
+ - query: `'query=583'` |
+ - hash: `'details'` |
+ |
+These bindings are bidirectional. Modifying them will in turn modify the URL. |
+ |
+iron-page-url is only active while it is attached to the document. |
+ |
+#### Links |
+ |
+While iron-page-url is active in the document it will intercept clicks on links |
+within your site, updating the URL pushing the updated URL out through the |
+databinding system. iron-page-url only intercepts clicks with the intent to |
+open in the same window, so middle mouse clicks and ctrl/cmd clicks work fine. |
+ |
+You can customize this behavior with the `urlSpaceRegex`. |
+ |
+#### Dwell Time |
+ |
+iron-page-url protects against accidental history spamming by only adding |
+entries to the user's history if the URL stays unchanged for `dwellTime` |
+milliseconds. |
+ |
+@demo demo/index.html |
+ |
+ --> |
+<script> |
+ 'use strict'; |
+ |
+ Polymer({ |
+ is: 'iron-page-url', |
+ properties: { |
+ /** |
+ * The pathname component of the URL. |
+ */ |
+ path: { |
+ type: String, |
+ notify: true, |
+ value: function() { |
+ return window.location.pathname; |
+ } |
+ }, |
+ /** |
+ * The query string portion of the URL. |
+ */ |
+ query: { |
+ type: String, |
+ notify: true, |
+ value: function() { |
+ return window.location.search.slice(1); |
+ } |
+ }, |
+ /** |
+ * The hash component of the URL. |
+ */ |
+ hash: { |
+ type: String, |
+ notify: true, |
+ value: function() { |
+ return window.location.hash.slice(1); |
+ } |
+ }, |
+ /** |
+ * If the user was on a URL for less than `dwellTime` milliseconds, it |
+ * won't be added to the browser's history, but instead will be replaced |
+ * by the next entry. |
+ * |
+ * This is to prevent large numbers of entries from clogging up the user's |
+ * browser history. Disable by setting to a negative number. |
+ */ |
+ dwellTime: { |
+ type: Number, |
+ value: 2000 |
+ }, |
+ |
+ /** |
+ * A regexp that defines the set of URLs that should be considered part |
+ * of this web app. |
+ * |
+ * Clicking on a link that matches this regex won't result in a full page |
+ * navigation, but will instead just update the URL state in place. |
+ * |
+ * This regexp is given everything after the origin in an absolute |
+ * URL. So to match just URLs that start with /search/ do: |
+ * url-space-regex="^/search/" |
+ * |
+ * @type {string|RegExp} |
+ */ |
+ urlSpaceRegex: { |
+ type: String, |
+ value: '' |
+ }, |
+ |
+ /** |
+ * urlSpaceRegex, but coerced into a regexp. |
+ * |
+ * @type {RegExp} |
+ */ |
+ _urlFilterRegExp: { |
+ compute: '_makeRegExp(urlFilterExp)' |
+ }, |
+ |
+ _lastChangedAtAt: { |
+ type: Number, |
+ value: -Infinity |
+ }, |
+ |
+ _initialized: { |
+ type: Boolean, |
+ value: false |
+ } |
+ }, |
+ hostAttributes: { |
+ hidden: true |
+ }, |
+ observers: [ |
+ '_updateUrl(path, query, hash)' |
+ ], |
+ attached: function() { |
+ this.listen(window, 'hashchange', '_hashChanged'); |
+ this.listen(window, 'location-changed', '_urlChanged'); |
+ this.listen(window, 'popstate', '_urlChanged'); |
+ this.listen(document.body, 'click', '_globalOnClick'); |
+ |
+ this._urlChanged(); |
+ this._initialized = true; |
+ }, |
+ detached: function() { |
+ this.unlisten(window, 'hashchange', '_hashChanged'); |
+ this.unlisten(window, 'location-changed', '_urlChanged'); |
+ this.unlisten(window, 'popstate', '_urlChanged'); |
+ this.unlisten(document.body, 'click', '_globalOnClick'); |
+ this._initialized = false; |
+ }, |
+ /** |
+ * @return {number} the number of milliseconds since some point in the |
+ * past. Only useful for comparing against other results from this |
+ * function. |
+ */ |
+ _now: function() { |
+ if (window.performance && window.performance.now) { |
+ return window.performance.now(); |
+ } |
+ return +new Date(); |
+ }, |
+ _hashChanged: function() { |
+ this.hash = window.location.hash.substring(1); |
+ }, |
+ _urlChanged: function() { |
+ // We want to extract all info out of the updated URL before we |
+ // try to write anything back into it. |
+ // |
+ // i.e. without _dontUpdateUrl we'd overwrite the new path with the old |
+ // one when we set this.hash. Likewise for query. |
+ this._dontUpdateUrl = true; |
+ this._hashChanged(); |
+ this.path = window.location.pathname; |
+ this.query = window.location.search.substring(1); |
+ this._dontUpdateUrl = false; |
+ this._updateUrl(); |
+ }, |
+ _getUrl: function() { |
+ var url = this.path; |
+ var query = this.query; |
+ if (query) { |
+ url += '?' + query; |
+ } |
+ if (this.hash) { |
+ url += '#' + this.hash; |
+ } |
+ return url; |
+ }, |
+ _updateUrl: function() { |
+ if (this._dontUpdateUrl || !this._initialized) { |
+ return; |
+ } |
+ var newUrl = this._getUrl(); |
+ var currentUrl = ( |
+ window.location.pathname + |
+ window.location.search + |
+ window.location.hash |
+ ); |
+ if (newUrl == currentUrl) { |
+ // nothing to do, the URL didn't change |
+ return; |
+ } |
+ |
+ var shouldReplace = |
+ this._lastChangedAt + this.dwellTime > this._now(); |
+ this._lastChangedAt = this._now(); |
+ if (shouldReplace) { |
+ window.history.replaceState({}, '', newUrl); |
+ } else { |
+ window.history.pushState({}, '', newUrl); |
+ } |
+ }, |
+ /** |
+ * A necessary evil so that links work as expected. Does its best to |
+ * bail out early if possible. |
+ * |
+ * @param {MouseEvent} event . |
+ */ |
+ _globalOnClick: function(event) { |
+ var href = this._getSameOriginLinkHref(event); |
+ if (!href) { |
+ return; |
+ } |
+ |
+ window.history.pushState({}, '', href); |
+ this.fire('location-changed', {}, {node: window}); |
+ event.preventDefault(); |
+ }, |
+ /** |
+ * Returns the absolute URL of the link (if any) that this click event |
+ * is clicking on, if we can and should override the resulting full |
+ * page navigation. Returns null otherwise. |
+ * |
+ * This method is separated away from _globalOnClick for testability, |
+ * as we can't test that a clicked link should have resulted in navigating |
+ * away from the test page. |
+ * |
+ * @param {MouseEvent} event . |
+ * @return {string?} . |
+ */ |
+ _getSameOriginLinkHref: function(event) { |
+ // We only care about left-clicks. |
+ if (event.button !== 0) { |
+ return null; |
+ } |
+ // We don't want modified clicks, where the intent is to open the page |
+ // in a new tab. |
+ if (event.metaKey || event.ctrlKey) { |
+ return null; |
+ } |
+ var eventPath = Polymer.dom(event).path; |
+ var href = null; |
+ for (var i = 0; i < eventPath.length; i++) { |
+ var element = eventPath[i]; |
+ if (element.tagName === 'A' && element.href) { |
+ href = element.href; |
+ break; |
+ } |
+ } |
+ // If there's no link there's nothing to do. |
+ if (!href) { |
+ return null; |
+ } |
+ |
+ // It only makes sense for us to intercept same-origin navigations. |
+ // pushState/replaceState don't work with cross-origin links. |
+ var url = new URL(href, document.baseURI); |
+ if (url.origin !== window.location.origin) { |
+ return null; |
+ } |
+ var normalizedHref = url.pathname + url.search + url.hash; |
+ |
+ // If we've been configured not to handle this url... don't handle it! |
+ if (this._urlFilterRegExp && |
+ !this._urlFilterRegExp.test(normalizedHref)) { |
+ return null; |
+ } |
+ |
+ return normalizedHref; |
+ }, |
+ _makeRegExp: function(urlFilterExp) { |
+ return RegExp(urlFilterExp); |
+ } |
+ }); |
+</script> |