Index: polymer_1.0.4/bower_components/platinum-sw/platinum-sw-register.html |
diff --git a/polymer_1.0.4/bower_components/platinum-sw/platinum-sw-register.html b/polymer_1.0.4/bower_components/platinum-sw/platinum-sw-register.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1a93a2af80c7bab88543dcaeb65cb042864d0c99 |
--- /dev/null |
+++ b/polymer_1.0.4/bower_components/platinum-sw/platinum-sw-register.html |
@@ -0,0 +1,342 @@ |
+<!-- |
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved. |
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
+Code distributed by Google as part of the polymer project is also |
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
+--> |
+<link rel="import" href="../polymer/polymer.html"> |
+ |
+<script> |
+ (function() { |
+ // Grab the URI of this file to use as a base when resolving relative paths. |
+ // Fallback to './' as a default, though current browsers that don't support |
+ // document.currentScript also don't support service workers. |
+ var baseURI = document.currentScript ? document.currentScript.baseURI : './'; |
+ |
+ /** |
+ * The `<platinum-sw-register>` element handles |
+ * [service worker](http://www.html5rocks.com/en/tutorials/service-worker/introduction/) |
+ * registration, reflects the overall service worker state, and coordinates the configuration |
+ * provided by other Service Worker Elements. |
+ * `<platinum-sw-register>` is used as a parent element for child elements in the |
+ * `<platinum-sw-*>` group. |
+ * |
+ * <platinum-sw-register skip-waiting |
+ * clients-claim |
+ * auto-register |
+ * state="{{state}}" |
+ * on-service-worker-error="handleSWError" |
+ * on-service-worker-updated="handleSWUpdated" |
+ * on-service-worker-installed="handleSWInstalled"> |
+ * ...one or more <platinum-sw-*> children which share the service worker registration... |
+ * </platinum-sw-register> |
+ * |
+ * Please see https://github.com/PolymerElements/platinum-sw#top-level-sw-importjs for a |
+ * *crucial* prerequisite file you must create before `<platinum-sw-register>` can be used! |
+ * |
+ * @demo demo/index.html An offline-capable eReader demo. |
+ */ |
+ Polymer({ |
+ is: 'platinum-sw-register', |
+ |
+ // Used as an "emergency" switch if we make breaking changes in the way <platinum-sw-register> |
+ // talks to service-worker.js. Otherwise, it shouldn't need to change, and isn't meant to be |
+ // kept in sync with the element's release number. |
+ _version: '1.0', |
+ |
+ /** |
+ * Fired when the initial service worker installation completes successfully. |
+ * The service worker will normally only be installed once, the first time a page with a |
+ * `<platinum-sw-register>` element is visited in a given browser. If the same page is visited |
+ * again, the existing service worker will be reused, and there won't be another |
+ * `service-worker-installed` fired. |
+ * |
+ * @event service-worker-installed |
+ * @param {String} A message indicating that the installation succeeded. |
+ */ |
+ |
+ /** |
+ * Fired when the service worker update flow completes successfully. |
+ * If you make changes to your `<platinum-sw-register>` configuration (i.e. by adding in new |
+ * `<platinum-sw-*>` child elements, or changing their attributes), users who had the old |
+ * service worker installed will get the update installed when they see the modified elements. |
+ * |
+ * @event service-worker-updated |
+ * @param {String} A message indicating that the update succeeded. |
+ */ |
+ |
+ /** |
+ * Fired when an error prevents the service worker installation from completing. |
+ * |
+ * @event service-worker-error |
+ * @param {String} A message indicating what went wrong. |
+ */ |
+ |
+ properties: { |
+ /** |
+ * Whether this element should automatically register the corresponding service worker as |
+ * soon as its added to a page. |
+ * |
+ * If set to `false`, then the service worker won't be automatically registered, and you |
+ * must call this element's `register()` method if you want service worker functionality. |
+ * This is useful if, for example, the service worker needs to be configured using |
+ * information that isn't immediately available at the time the page loads. |
+ * |
+ * If set to `true`, the service worker will be automatically registered without having to |
+ * call any methods. |
+ */ |
+ autoRegister: { |
+ type: Boolean, |
+ value: false |
+ }, |
+ |
+ /** |
+ * Whether the activated service worker should [take immediate control](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#clients-claim-method) |
+ * of any pages under its scope. |
+ * |
+ * If this is `false`, the service worker won't have any effect until the next time the page |
+ * is visited/reloaded. |
+ * If this is `true`, it will take control and start handling events for the current page |
+ * (and any pages under the same scope open in other tabs/windows) as soon it's active. |
+ * @see {@link https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#clients-claim-method} |
+ */ |
+ clientsClaim: { |
+ type: Boolean, |
+ value: false |
+ }, |
+ |
+ /** |
+ * The service worker script that is [registered](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#navigator-service-worker-register). |
+ * The script *should* be located at the top level of your site, to ensure that it is able |
+ * to control all the pages on your site. |
+ * |
+ * It's *strongly* recommended that you create a top-level file named `sw-import.js` |
+ * containing only: |
+ * |
+ * `importScripts('bower_components/platinum-sw/service-worker.js');` |
+ * |
+ * (adjust to match the path where your `platinum-sw` element directory can be found). |
+ * |
+ * This will ensure that your service worker script contains everything needed to play |
+ * nicely with the Service Worker Elements group. |
+ * |
+ * @see {@link https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#navigator-service-worker-register} |
+ */ |
+ href: { |
+ type: String, |
+ value: 'sw-import.js' |
+ }, |
+ |
+ /** |
+ * Whether the page should be automatically reloaded (via `window.location.reload()`) when |
+ * the service worker is successfully installed. |
+ * |
+ * While it's perfectly valid to continue using a page with a freshly installed service |
+ * worker, it's a common pattern to want to reload it immediately following the install. |
+ * This ensures that, for example, if you're using a `<platinum-sw-cache>` with an on the |
+ * fly caching strategy, it will get a chance to intercept all the requests needed to render |
+ * your page and store them in the cache. |
+ * |
+ * If you don't immediately reload your page, then any resources that were loaded before the |
+ * service worker was installed (e.g. this `platinum-sw-register.html` file) won't be present |
+ * in the cache until the next time the page is loaded. |
+ * |
+ * Note that this reload will only happen when a service worker is installed for the first |
+ * time. If the service worker is subsequently updated, it won't trigger another reload. |
+ */ |
+ reloadOnInstall: { |
+ type: Boolean, |
+ value: false |
+ }, |
+ |
+ /** |
+ * The scope of the service worker, relative to the registered service worker script. |
+ * All pages that fall under this scope will be controlled by the registered service worker. |
+ * |
+ * Normally, this would not need to be changed, unless you want the service worker to only |
+ * apply to a subset of your site. |
+ * |
+ * @see {@link https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#navigator-service-worker-register} |
+ */ |
+ scope: { |
+ type: String, |
+ value: './' |
+ }, |
+ |
+ /** |
+ * Whether an updated service worker should [bypass the `waiting` state](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#service-worker-global-scope-skipwaiting) |
+ * and immediately become `active`. |
+ * |
+ * Normally, during an update, the new service worker stays in the |
+ * `waiting` state until the current page and any other tabs/windows that are using the old |
+ * service worker are unloaded. |
+ * |
+ * If this is `false`, an updated service worker won't be activated until all instances of |
+ * the old server worker have been unloaded. |
+ * |
+ * If this is `true`, an updated service worker will become `active` immediately. |
+ * @see {@link https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#service-worker-global-scope-skipwaiting} |
+ */ |
+ skipWaiting: { |
+ type: Boolean, |
+ value: false |
+ }, |
+ |
+ /** |
+ * The current state of the service worker registered by this element. |
+ * |
+ * One of: |
+ * - 'installed' |
+ * - 'updated' |
+ * - 'error' |
+ * - 'unsupported' |
+ */ |
+ state: { |
+ notify: true, |
+ readOnly: true, |
+ type: String |
+ } |
+ }, |
+ |
+ /** |
+ * Registers the service worker based on the configuration options in this element and any |
+ * child elements. |
+ * |
+ * If you set the `autoRegister` property to `true`, then this method is called automatically |
+ * at page load. |
+ * It can be useful to set `autoRegister` to `false` and then explicitly call this method if |
+ * there are options that are only configured after the page is loaded. |
+ */ |
+ register: function() { |
+ if ('serviceWorker' in navigator) { |
+ this._constructServiceWorkerUrl().then(function(serviceWorkerUrl) { |
+ this._registerServiceWorker(serviceWorkerUrl); |
+ }.bind(this)); |
+ } else { |
+ this._setState('unsupported'); |
+ this.fire('service-worker-error', 'Service workers are not available in the current browser.'); |
+ } |
+ }, |
+ |
+ _constructServiceWorkerUrl: function() { |
+ var paramsPromises = []; |
+ var children = Polymer.dom(this).childNodes; |
+ for (var i = 0; i < children.length; i++) { |
+ if (typeof children[i]._getParameters === 'function') { |
+ paramsPromises.push(children[i]._getParameters(baseURI)); |
+ } |
+ } |
+ |
+ return Promise.all(paramsPromises).then(function(paramsResolutions) { |
+ var params = { |
+ baseURI: baseURI, |
+ version: this._version |
+ }; |
+ |
+ paramsResolutions.forEach(function(childParams) { |
+ Object.keys(childParams).forEach(function(key) { |
+ if (Array.isArray(params[key])) { |
+ params[key].push(childParams[key]); |
+ } else { |
+ params[key] = [childParams[key]]; |
+ } |
+ }); |
+ }); |
+ |
+ return params; |
+ }.bind(this)).then(function(params) { |
+ if (params.importscriptLate) { |
+ if (params.importscript) { |
+ params.importscript = params.importscript.concat(params.importscriptLate); |
+ } else { |
+ params.importscript = params.importscriptLate; |
+ } |
+ } |
+ |
+ if (params.importscript) { |
+ params.importscript = this._unique(params.importscript); |
+ } |
+ |
+ params.clientsClaim = this.clientsClaim; |
+ params.skipWaiting = this.skipWaiting; |
+ |
+ var serviceWorkerUrl = new URL(this.href, window.location); |
+ // It's very important to ensure that the serialization is stable. |
+ // Serializing the same settings should always produce the same URL. |
+ // Serializing different settings should always produce a different URL. |
+ // This ensures that the service worker upgrade flow is triggered when settings change. |
+ serviceWorkerUrl.search = this._serializeUrlParams(params); |
+ |
+ return serviceWorkerUrl; |
+ }.bind(this)); |
+ }, |
+ |
+ _unique: function(arr) { |
+ return arr.filter(function(item, index) { |
+ return arr.indexOf(item) === index; |
+ }); |
+ }, |
+ |
+ _serializeUrlParams: function(params) { |
+ return Object.keys(params).sort().map(function(key) { |
+ // encodeURIComponent(['a', 'b']) => 'a%2Cb', |
+ // so this will still work when the values are Arrays. |
+ // TODO: It won't work if the values in the Arrays have ',' characters in them. |
+ return encodeURIComponent(key) + "=" + encodeURIComponent(params[key]); |
+ }).join('&'); |
+ }, |
+ |
+ _registerServiceWorker: function(serviceWorkerUrl) { |
+ navigator.serviceWorker.register(serviceWorkerUrl, {scope: this.scope}).then(function(registration) { |
+ if (registration.active) { |
+ this._setState('installed'); |
+ } |
+ |
+ registration.onupdatefound = function() { |
+ var installingWorker = registration.installing; |
+ installingWorker.onstatechange = function() { |
+ switch (installingWorker.state) { |
+ case 'installed': |
+ if (navigator.serviceWorker.controller) { |
+ this._setState('updated'); |
+ this.fire('service-worker-updated', |
+ 'A new service worker was installed, replacing the old service worker.'); |
+ } else { |
+ if (this.reloadOnInstall) { |
+ window.location.reload(); |
+ } else { |
+ this._setState('installed'); |
+ this.fire('service-worker-installed', 'A new service worker was installed.'); |
+ } |
+ } |
+ break; |
+ |
+ case 'redundant': |
+ this._setState('error'); |
+ this.fire('service-worker-error', 'The installing service worker became redundant.'); |
+ break; |
+ } |
+ }.bind(this); |
+ }.bind(this); |
+ }.bind(this)).catch(function(error) { |
+ this._setState('error'); |
+ this.fire('service-worker-error', error.toString()); |
+ if (error.name === 'NetworkError') { |
+ var location = serviceWorkerUrl.origin + serviceWorkerUrl.pathname; |
+ console.error('A valid service worker script was not found at ' + location + '\n' + |
+ 'To learn how to fix this, please see\n' + |
+ 'https://github.com/PolymerElements/platinum-sw#top-level-sw-importjs'); |
+ } |
+ }.bind(this)); |
+ }, |
+ |
+ attached: function() { |
+ if (this.autoRegister) { |
+ this.async(this.register); |
+ } |
+ } |
+ }); |
+ })(); |
+</script> |