polymer-platinum-rails 1.0.0.pre.rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +39 -0
  3. data/Rakefile +1 -0
  4. data/app/assets/components/platinum-elements/LICENSE +202 -0
  5. data/app/assets/components/platinum-elements/README.md +2 -0
  6. data/app/assets/components/platinum-elements/bower.json +19 -0
  7. data/app/assets/components/platinum-push-messaging/README.md +4 -0
  8. data/app/assets/components/platinum-push-messaging/bower.json +37 -0
  9. data/app/assets/components/platinum-push-messaging/demo/index.html +130 -0
  10. data/app/assets/components/platinum-push-messaging/demo/manifest.json +4 -0
  11. data/app/assets/components/platinum-push-messaging/index.html +22 -0
  12. data/app/assets/components/platinum-push-messaging/platinum-push-messaging.html +427 -0
  13. data/app/assets/components/platinum-push-messaging/service-worker.js +151 -0
  14. data/app/assets/components/platinum-sw/README.md +43 -0
  15. data/app/assets/components/platinum-sw/bootstrap/sw-toolbox-setup.js +38 -0
  16. data/app/assets/components/platinum-sw/bower.json +37 -0
  17. data/app/assets/components/platinum-sw/demo/index.html +91 -0
  18. data/app/assets/components/platinum-sw/demo/sw-import.js +1 -0
  19. data/app/assets/components/platinum-sw/index.html +22 -0
  20. data/app/assets/components/platinum-sw/platinum-sw-cache.html +116 -0
  21. data/app/assets/components/platinum-sw/platinum-sw-elements.html +14 -0
  22. data/app/assets/components/platinum-sw/platinum-sw-fetch.html +130 -0
  23. data/app/assets/components/platinum-sw/platinum-sw-import-script.html +57 -0
  24. data/app/assets/components/platinum-sw/platinum-sw-register.html +342 -0
  25. data/app/assets/components/platinum-sw/service-worker.js +52 -0
  26. data/app/assets/components/polymer/LICENSE.txt +27 -0
  27. data/app/assets/components/polymer/bower.json +26 -0
  28. data/app/assets/components/polymer/build.log +27 -0
  29. data/app/assets/components/polymer/polymer-micro.html +523 -0
  30. data/app/assets/components/polymer/polymer-mini.html +1368 -0
  31. data/app/assets/components/polymer/polymer.html +3768 -0
  32. data/app/assets/components/sw-toolbox/CONTRIBUTING.md +30 -0
  33. data/app/assets/components/sw-toolbox/LICENSE +201 -0
  34. data/app/assets/components/sw-toolbox/README.md +156 -0
  35. data/app/assets/components/sw-toolbox/bower.json +14 -0
  36. data/app/assets/components/sw-toolbox/companion.js +23 -0
  37. data/app/assets/components/sw-toolbox/package.json +21 -0
  38. data/app/assets/components/sw-toolbox/sw-toolbox.js +148 -0
  39. data/app/assets/components/sw-toolbox/sw-toolbox.map.json +1 -0
  40. data/app/assets/components/webcomponentsjs/CustomElements.js +956 -0
  41. data/app/assets/components/webcomponentsjs/CustomElements.min.js +11 -0
  42. data/app/assets/components/webcomponentsjs/HTMLImports.js +1078 -0
  43. data/app/assets/components/webcomponentsjs/HTMLImports.min.js +11 -0
  44. data/app/assets/components/webcomponentsjs/MutationObserver.js +344 -0
  45. data/app/assets/components/webcomponentsjs/MutationObserver.min.js +11 -0
  46. data/app/assets/components/webcomponentsjs/README.md +125 -0
  47. data/app/assets/components/webcomponentsjs/ShadowDOM.js +4414 -0
  48. data/app/assets/components/webcomponentsjs/ShadowDOM.min.js +15 -0
  49. data/app/assets/components/webcomponentsjs/bower.json +14 -0
  50. data/app/assets/components/webcomponentsjs/build.log +33 -0
  51. data/app/assets/components/webcomponentsjs/package.json +31 -0
  52. data/app/assets/components/webcomponentsjs/webcomponents-lite.js +2300 -0
  53. data/app/assets/components/webcomponentsjs/webcomponents-lite.min.js +13 -0
  54. data/app/assets/components/webcomponentsjs/webcomponents.js +7112 -0
  55. data/app/assets/components/webcomponentsjs/webcomponents.min.js +15 -0
  56. data/lib/polymer-platinum-rails.rb +2 -0
  57. data/lib/polymer-platinum-rails/engine.rb +4 -0
  58. data/lib/polymer-platinum-rails/version.rb +3 -0
  59. metadata +149 -0
@@ -0,0 +1,14 @@
1
+ <!--
2
+ Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
3
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
4
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
5
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
6
+ Code distributed by Google as part of the polymer project is also
7
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
8
+ -->
9
+
10
+ <!-- Facilitates importing the full collection of platinum-sw elements. -->
11
+ <link rel="import" href="platinum-sw-cache.html">
12
+ <link rel="import" href="platinum-sw-fetch.html">
13
+ <link rel="import" href="platinum-sw-import-script.html">
14
+ <link rel="import" href="platinum-sw-register.html">
@@ -0,0 +1,130 @@
1
+ <!--
2
+ Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
3
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
4
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
5
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
6
+ Code distributed by Google as part of the polymer project is also
7
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
8
+ -->
9
+ <link rel="import" href="../polymer/polymer.html">
10
+
11
+ <script>
12
+ /**
13
+ * The `<platinum-sw-fetch>` element creates custom [`fetch` event](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#fetch-event-section)
14
+ * handlers for given URL patterns. Possible use cases include:
15
+ *
16
+ * - Using a special caching strategy for specific URLs.
17
+ * - Returning static "fallback" responses instead of network errors when a remote API
18
+ * is unavailable.
19
+ *
20
+ * In short, any scenario in which you'd like a service worker to intercept network
21
+ * requests and provide custom response handling.
22
+ *
23
+ * If you'd like a single caching policy applied to all same-origin requests, then an alternative
24
+ * to using `<platinum-sw-fetch>` is to use `<platinum-sw-cache>` with the `defaultCacheStategy`
25
+ * property set.
26
+ *
27
+ * Under the hood, the [sw-toolbox](https://github.com/googlechrome/sw-toolbox) library is used
28
+ * for all the request handling logic.
29
+ *
30
+ * `<platinum-sw-fetch>` needs to be a child element of `<platinum-sw-register>`.
31
+ *
32
+ * An example configuration is:
33
+ *
34
+ * <platinum-sw-register>
35
+ * <platinum-sw-import-script href="custom-fetch-handler.js"></platinum-sw-import-script>
36
+ * <platinum-sw-fetch handler="customFetchHandler"
37
+ * path="/(.*)/customFetch"></platinum-sw-fetch>
38
+ * </platinum-sw-register>
39
+ *
40
+ * This implies that there's a `custom-fetch-handler.js` file in the same directory as the current
41
+ * page, which defines a `sw-toolbox` compliant
42
+ * [request handler](https://github.com/googlechrome/sw-toolbox#request-handlers) named
43
+ * `customFetchHandler`. This definition is imported using `<platinum-sw-import-script>`. The
44
+ * `<platinum-sw-fetch>` element takes care of mapping which request paths are handled by
45
+ * `customFetchHandler`.
46
+ *
47
+ * Anything not matching the `path` pattern is ignored by `<platinum-sw-fetch>`,
48
+ * and it's possible to have multiple `<platinum-sw-fetch>` elements that each define different
49
+ * paths and different handlers. The path matching is performed top-down, starting with the first
50
+ * `<platinum-sw-fetch>` element.
51
+ */
52
+ Polymer({
53
+ is: 'platinum-sw-fetch',
54
+
55
+ properties: {
56
+ /**
57
+ * The name of the request handler to use. This should be a `sw-toolbox`-style
58
+ * [request handler](https://github.com/googlechrome/sw-toolbox#request-handlers).
59
+ *
60
+ * `handler` is a `String`, not a `function`, so you're providing the name of a function, not
61
+ * the function itself. It can be a function defined in the
62
+ * [`toolbox` scope](https://github.com/googlechrome/sw-toolbox#built-in-handlers)
63
+ * (e.g. 'networkFirst', 'fastest', 'networkOnly', etc.) or a function defined in the
64
+ * [`ServiceWorkerGlobalScope`](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#service-worker-global-scope),
65
+ * like a function that is defined in a file that's imported via `platinum-sw-import-script`.
66
+ **
67
+ * @see {@link https://github.com/GoogleChrome/sw-toolbox#built-in-handlers}
68
+ */
69
+ handler: String,
70
+
71
+ /**
72
+ * By default, `path` will only match URLs under the current host (i.e. same-origin requests).
73
+ * If you'd like to apply `handler` to cross-origin requests, then use `origin` to specify
74
+ * which hosts will match. Setting `origin` is optional.
75
+ *
76
+ * `origin` is a `String`, but it is used internally to construct a
77
+ * [`RegExp` object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions),
78
+ * which is used for the matching. To properly escape RegExp sequences like `\.`, it's
79
+ * necessary to add in an extra level of string-escaping first ('\\.').
80
+ *
81
+ * Note that the `origin` value will be matched against the full domain name and the protocol.
82
+ * If you want to match 'http' and 'https', then use 'https?://' at the start of your string.
83
+ *
84
+ * Some examples:
85
+ * - `origin="https?://.+\\.google\\.com"` → a RegExp that matches `http` or `https` requests
86
+ * made to any domain, as long as it ends in `.google.com`.
87
+ * - `origin="https://www\\.example\\.com" → a RegExp that will only match `https` requests to
88
+ * one domain, `www.example.com`.
89
+ *
90
+ * @see {@link https://github.com/googlechrome/sw-toolbox#toolboxrouterheadurlpattern-handler-options}
91
+ */
92
+ origin: String,
93
+
94
+ /**
95
+ * URLs with paths matching `path` will have `handler` applied to them.
96
+ *
97
+ * By default, `path` will only match same-origin URLs. If you'd like it to match
98
+ * cross-origin URLs, use `path` in conjunction with `origin`.
99
+ *
100
+ * As explained in the
101
+ * [`sw-toolbox` docs](https://github.com/googlechrome/sw-toolbox#toolboxrouterheadurlpattern-handler-options),
102
+ * the URL path matching is done using the [`path-to-regexp`](https://github.com/pillarjs/path-to-regexp)
103
+ * module, which is the same logic used in [Express-style routing](http://expressjs.com/guide/routing.html).
104
+ *
105
+ * In practice, you need to always use '/' as the first character of your `path`, and then
106
+ * can use '(.*)' as a wildcard.
107
+ *
108
+ * Some examples:
109
+ * - `path="/(.*)/customFetch"` → matches any path that ends with '/customFetch'.
110
+ * - `path="/customFetch(.*)"` → matches any path that starts with '/customFetch', optionally
111
+ * followed by other characters.
112
+ *
113
+ * @see {@link https://github.com/pillarjs/path-to-regexp}
114
+ */
115
+ path: String
116
+ },
117
+
118
+ _getParameters: function(baseURI) {
119
+ return new Promise(function(resolve) {
120
+ var params = {
121
+ importscriptLate: new URL('bootstrap/sw-toolbox-setup.js', baseURI).href
122
+ };
123
+ if (this.path && this.handler) {
124
+ params.route = [this.path, this.handler, this.origin];
125
+ }
126
+ resolve(params);
127
+ }.bind(this));
128
+ }
129
+ });
130
+ </script>
@@ -0,0 +1,57 @@
1
+ <!--
2
+ Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
3
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
4
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
5
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
6
+ Code distributed by Google as part of the polymer project is also
7
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
8
+ -->
9
+ <link rel="import" href="../polymer/polymer.html">
10
+
11
+ <script>
12
+ /**
13
+ * The `<platinum-sw-import-script>` element is used to import a JavaScript file that is executed
14
+ * each time the service worker starts up.
15
+ *
16
+ * `<platinum-sw-import-script>` needs to be a child element of `<platinum-sw-register>`.
17
+ *
18
+ * A common use case is to define a custom request handler for a `fetch` event, but it can be used
19
+ * for any type of code that you want to be executed by the service worker.
20
+ *
21
+ * <platinum-sw-register>
22
+ * <platinum-sw-import-script href="custom-fetch-handler.js"></platinum-sw-import-script>
23
+ * <platinum-sw-fetch handler="customFetchHandler"
24
+ * path="/(.*)/customFetch"></platinum-sw-fetch>
25
+ * </platinum-sw-register>
26
+ *
27
+ * You can specify multiple `<platinum-sw-import-script>` elements, each one corresponding to a
28
+ * different JavaScript file. The JavaScript files will be loaded in the order in which the
29
+ * `<platinum-sw-import-script>` elements appear. Under the hood, this results in an
30
+ * [`importScripts()`](https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/importScripts)
31
+ * call made from the context of the service worker.
32
+ */
33
+ Polymer({
34
+ is: 'platinum-sw-import-script',
35
+
36
+ properties: {
37
+ /**
38
+ * The URL of the JavaScript file that you want imported.
39
+ *
40
+ * Relative URLs are assumed to be
41
+ * relative to the service worker's script location, which will almost always be the same
42
+ * location as the page which includes this element.
43
+ */
44
+ href: String
45
+ },
46
+
47
+ _getParameters: function() {
48
+ return new Promise(function(resolve) {
49
+ var params = {};
50
+ if (this.href) {
51
+ params.importscript = this.href;
52
+ }
53
+ resolve(params);
54
+ }.bind(this));
55
+ }
56
+ });
57
+ </script>
@@ -0,0 +1,342 @@
1
+ <!--
2
+ Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
3
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
4
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
5
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
6
+ Code distributed by Google as part of the polymer project is also
7
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
8
+ -->
9
+ <link rel="import" href="../polymer/polymer.html">
10
+
11
+ <script>
12
+ (function() {
13
+ // Grab the URI of this file to use as a base when resolving relative paths.
14
+ // Fallback to './' as a default, though current browsers that don't support
15
+ // document.currentScript also don't support service workers.
16
+ var baseURI = document.currentScript ? document.currentScript.baseURI : './';
17
+
18
+ /**
19
+ * The `<platinum-sw-register>` element handles
20
+ * [service worker](http://www.html5rocks.com/en/tutorials/service-worker/introduction/)
21
+ * registration, reflects the overall service worker state, and coordinates the configuration
22
+ * provided by other Service Worker Elements.
23
+ * `<platinum-sw-register>` is used as a parent element for child elements in the
24
+ * `<platinum-sw-*>` group.
25
+ *
26
+ * <platinum-sw-register skip-waiting
27
+ * clients-claim
28
+ * auto-register
29
+ * state="{{state}}"
30
+ * on-service-worker-error="handleSWError"
31
+ * on-service-worker-updated="handleSWUpdated"
32
+ * on-service-worker-installed="handleSWInstalled">
33
+ * ...one or more <platinum-sw-*> children which share the service worker registration...
34
+ * </platinum-sw-register>
35
+ *
36
+ * Please see https://github.com/PolymerElements/platinum-sw#top-level-sw-importjs for a
37
+ * *crucial* prerequisite file you must create before `<platinum-sw-register>` can be used!
38
+ *
39
+ * @demo demo/index.html An offline-capable eReader demo.
40
+ */
41
+ Polymer({
42
+ is: 'platinum-sw-register',
43
+
44
+ // Used as an "emergency" switch if we make breaking changes in the way <platinum-sw-register>
45
+ // talks to service-worker.js. Otherwise, it shouldn't need to change, and isn't meant to be
46
+ // kept in sync with the element's release number.
47
+ _version: '1.0',
48
+
49
+ /**
50
+ * Fired when the initial service worker installation completes successfully.
51
+ * The service worker will normally only be installed once, the first time a page with a
52
+ * `<platinum-sw-register>` element is visited in a given browser. If the same page is visited
53
+ * again, the existing service worker will be reused, and there won't be another
54
+ * `service-worker-installed` fired.
55
+ *
56
+ * @event service-worker-installed
57
+ * @param {String} A message indicating that the installation succeeded.
58
+ */
59
+
60
+ /**
61
+ * Fired when the service worker update flow completes successfully.
62
+ * If you make changes to your `<platinum-sw-register>` configuration (i.e. by adding in new
63
+ * `<platinum-sw-*>` child elements, or changing their attributes), users who had the old
64
+ * service worker installed will get the update installed when they see the modified elements.
65
+ *
66
+ * @event service-worker-updated
67
+ * @param {String} A message indicating that the update succeeded.
68
+ */
69
+
70
+ /**
71
+ * Fired when an error prevents the service worker installation from completing.
72
+ *
73
+ * @event service-worker-error
74
+ * @param {String} A message indicating what went wrong.
75
+ */
76
+
77
+ properties: {
78
+ /**
79
+ * Whether this element should automatically register the corresponding service worker as
80
+ * soon as its added to a page.
81
+ *
82
+ * If set to `false`, then the service worker won't be automatically registered, and you
83
+ * must call this element's `register()` method if you want service worker functionality.
84
+ * This is useful if, for example, the service worker needs to be configured using
85
+ * information that isn't immediately available at the time the page loads.
86
+ *
87
+ * If set to `true`, the service worker will be automatically registered without having to
88
+ * call any methods.
89
+ */
90
+ autoRegister: {
91
+ type: Boolean,
92
+ value: false
93
+ },
94
+
95
+ /**
96
+ * Whether the activated service worker should [take immediate control](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#clients-claim-method)
97
+ * of any pages under its scope.
98
+ *
99
+ * If this is `false`, the service worker won't have any effect until the next time the page
100
+ * is visited/reloaded.
101
+ * If this is `true`, it will take control and start handling events for the current page
102
+ * (and any pages under the same scope open in other tabs/windows) as soon it's active.
103
+ * @see {@link https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#clients-claim-method}
104
+ */
105
+ clientsClaim: {
106
+ type: Boolean,
107
+ value: false
108
+ },
109
+
110
+ /**
111
+ * The service worker script that is [registered](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#navigator-service-worker-register).
112
+ * The script *should* be located at the top level of your site, to ensure that it is able
113
+ * to control all the pages on your site.
114
+ *
115
+ * It's *strongly* recommended that you create a top-level file named `sw-import.js`
116
+ * containing only:
117
+ *
118
+ * `importScripts('bower_components/platinum-sw/service-worker.js');`
119
+ *
120
+ * (adjust to match the path where your `platinum-sw` element directory can be found).
121
+ *
122
+ * This will ensure that your service worker script contains everything needed to play
123
+ * nicely with the Service Worker Elements group.
124
+ *
125
+ * @see {@link https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#navigator-service-worker-register}
126
+ */
127
+ href: {
128
+ type: String,
129
+ value: 'sw-import.js'
130
+ },
131
+
132
+ /**
133
+ * Whether the page should be automatically reloaded (via `window.location.reload()`) when
134
+ * the service worker is successfully installed.
135
+ *
136
+ * While it's perfectly valid to continue using a page with a freshly installed service
137
+ * worker, it's a common pattern to want to reload it immediately following the install.
138
+ * This ensures that, for example, if you're using a `<platinum-sw-cache>` with an on the
139
+ * fly caching strategy, it will get a chance to intercept all the requests needed to render
140
+ * your page and store them in the cache.
141
+ *
142
+ * If you don't immediately reload your page, then any resources that were loaded before the
143
+ * service worker was installed (e.g. this `platinum-sw-register.html` file) won't be present
144
+ * in the cache until the next time the page is loaded.
145
+ *
146
+ * Note that this reload will only happen when a service worker is installed for the first
147
+ * time. If the service worker is subsequently updated, it won't trigger another reload.
148
+ */
149
+ reloadOnInstall: {
150
+ type: Boolean,
151
+ value: false
152
+ },
153
+
154
+ /**
155
+ * The scope of the service worker, relative to the registered service worker script.
156
+ * All pages that fall under this scope will be controlled by the registered service worker.
157
+ *
158
+ * Normally, this would not need to be changed, unless you want the service worker to only
159
+ * apply to a subset of your site.
160
+ *
161
+ * @see {@link https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#navigator-service-worker-register}
162
+ */
163
+ scope: {
164
+ type: String,
165
+ value: './'
166
+ },
167
+
168
+ /**
169
+ * Whether an updated service worker should [bypass the `waiting` state](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#service-worker-global-scope-skipwaiting)
170
+ * and immediately become `active`.
171
+ *
172
+ * Normally, during an update, the new service worker stays in the
173
+ * `waiting` state until the current page and any other tabs/windows that are using the old
174
+ * service worker are unloaded.
175
+ *
176
+ * If this is `false`, an updated service worker won't be activated until all instances of
177
+ * the old server worker have been unloaded.
178
+ *
179
+ * If this is `true`, an updated service worker will become `active` immediately.
180
+ * @see {@link https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#service-worker-global-scope-skipwaiting}
181
+ */
182
+ skipWaiting: {
183
+ type: Boolean,
184
+ value: false
185
+ },
186
+
187
+ /**
188
+ * The current state of the service worker registered by this element.
189
+ *
190
+ * One of:
191
+ * - 'installed'
192
+ * - 'updated'
193
+ * - 'error'
194
+ * - 'unsupported'
195
+ */
196
+ state: {
197
+ notify: true,
198
+ readOnly: true,
199
+ type: String
200
+ }
201
+ },
202
+
203
+ /**
204
+ * Registers the service worker based on the configuration options in this element and any
205
+ * child elements.
206
+ *
207
+ * If you set the `autoRegister` property to `true`, then this method is called automatically
208
+ * at page load.
209
+ * It can be useful to set `autoRegister` to `false` and then explicitly call this method if
210
+ * there are options that are only configured after the page is loaded.
211
+ */
212
+ register: function() {
213
+ if ('serviceWorker' in navigator) {
214
+ this._constructServiceWorkerUrl().then(function(serviceWorkerUrl) {
215
+ this._registerServiceWorker(serviceWorkerUrl);
216
+ }.bind(this));
217
+ } else {
218
+ this._setState('unsupported');
219
+ this.fire('service-worker-error', 'Service workers are not available in the current browser.');
220
+ }
221
+ },
222
+
223
+ _constructServiceWorkerUrl: function() {
224
+ var paramsPromises = [];
225
+ var children = Polymer.dom(this).childNodes;
226
+ for (var i = 0; i < children.length; i++) {
227
+ if (typeof children[i]._getParameters === 'function') {
228
+ paramsPromises.push(children[i]._getParameters(baseURI));
229
+ }
230
+ }
231
+
232
+ return Promise.all(paramsPromises).then(function(paramsResolutions) {
233
+ var params = {
234
+ baseURI: baseURI,
235
+ version: this._version
236
+ };
237
+
238
+ paramsResolutions.forEach(function(childParams) {
239
+ Object.keys(childParams).forEach(function(key) {
240
+ if (Array.isArray(params[key])) {
241
+ params[key].push(childParams[key]);
242
+ } else {
243
+ params[key] = [childParams[key]];
244
+ }
245
+ });
246
+ });
247
+
248
+ return params;
249
+ }.bind(this)).then(function(params) {
250
+ if (params.importscriptLate) {
251
+ if (params.importscript) {
252
+ params.importscript = params.importscript.concat(params.importscriptLate);
253
+ } else {
254
+ params.importscript = params.importscriptLate;
255
+ }
256
+ }
257
+
258
+ if (params.importscript) {
259
+ params.importscript = this._unique(params.importscript);
260
+ }
261
+
262
+ params.clientsClaim = this.clientsClaim;
263
+ params.skipWaiting = this.skipWaiting;
264
+
265
+ var serviceWorkerUrl = new URL(this.href, window.location);
266
+ // It's very important to ensure that the serialization is stable.
267
+ // Serializing the same settings should always produce the same URL.
268
+ // Serializing different settings should always produce a different URL.
269
+ // This ensures that the service worker upgrade flow is triggered when settings change.
270
+ serviceWorkerUrl.search = this._serializeUrlParams(params);
271
+
272
+ return serviceWorkerUrl;
273
+ }.bind(this));
274
+ },
275
+
276
+ _unique: function(arr) {
277
+ return arr.filter(function(item, index) {
278
+ return arr.indexOf(item) === index;
279
+ });
280
+ },
281
+
282
+ _serializeUrlParams: function(params) {
283
+ return Object.keys(params).sort().map(function(key) {
284
+ // encodeURIComponent(['a', 'b']) => 'a%2Cb',
285
+ // so this will still work when the values are Arrays.
286
+ // TODO: It won't work if the values in the Arrays have ',' characters in them.
287
+ return encodeURIComponent(key) + "=" + encodeURIComponent(params[key]);
288
+ }).join('&');
289
+ },
290
+
291
+ _registerServiceWorker: function(serviceWorkerUrl) {
292
+ navigator.serviceWorker.register(serviceWorkerUrl, {scope: this.scope}).then(function(registration) {
293
+ if (registration.active) {
294
+ this._setState('installed');
295
+ }
296
+
297
+ registration.onupdatefound = function() {
298
+ var installingWorker = registration.installing;
299
+ installingWorker.onstatechange = function() {
300
+ switch (installingWorker.state) {
301
+ case 'installed':
302
+ if (navigator.serviceWorker.controller) {
303
+ this._setState('updated');
304
+ this.fire('service-worker-updated',
305
+ 'A new service worker was installed, replacing the old service worker.');
306
+ } else {
307
+ if (this.reloadOnInstall) {
308
+ window.location.reload();
309
+ } else {
310
+ this._setState('installed');
311
+ this.fire('service-worker-installed', 'A new service worker was installed.');
312
+ }
313
+ }
314
+ break;
315
+
316
+ case 'redundant':
317
+ this._setState('error');
318
+ this.fire('service-worker-error', 'The installing service worker became redundant.');
319
+ break;
320
+ }
321
+ }.bind(this);
322
+ }.bind(this);
323
+ }.bind(this)).catch(function(error) {
324
+ this._setState('error');
325
+ this.fire('service-worker-error', error.toString());
326
+ if (error.name === 'NetworkError') {
327
+ var location = serviceWorkerUrl.origin + serviceWorkerUrl.pathname;
328
+ console.error('A valid service worker script was not found at ' + location + '\n' +
329
+ 'To learn how to fix this, please see\n' +
330
+ 'https://github.com/PolymerElements/platinum-sw#top-level-sw-importjs');
331
+ }
332
+ }.bind(this));
333
+ },
334
+
335
+ attached: function() {
336
+ if (this.autoRegister) {
337
+ this.async(this.register);
338
+ }
339
+ }
340
+ });
341
+ })();
342
+ </script>