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,4 @@
1
+ {
2
+ "gcm_sender_id": "679960499087",
3
+ "gcm_user_visible_only": true
4
+ }
@@ -0,0 +1,22 @@
1
+ <!doctype html>
2
+ <!--
3
+ Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
4
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE
5
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS
6
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS
7
+ Code distributed by Google as part of the polymer project is also
8
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS
9
+ -->
10
+ <html>
11
+ <head>
12
+ <meta charset="utf-8">
13
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
14
+
15
+ <script src="../webcomponentsjs/webcomponents-lite.js"></script>
16
+ <link rel="import" href="../iron-component-page/iron-component-page.html">
17
+ </head>
18
+
19
+ <body>
20
+ <iron-component-page></iron-component-page>
21
+ </body>
22
+ </html>
@@ -0,0 +1,427 @@
1
+ <!--
2
+ @license
3
+ Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
4
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7
+ Code distributed by Google as part of the polymer project is also
8
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9
+ -->
10
+ <link rel="import" href="../polymer/polymer.html">
11
+
12
+ <script>
13
+ (function() {
14
+ 'use strict';
15
+ // TODO: Doesn't work for IE or Safari, and the usual
16
+ // document.getElementsByTagName('script') workaround seems to be broken by
17
+ // HTML imports. Not important for now as neither of those browsers support
18
+ // service worker yet.
19
+ var currentScript = document.currentScript.baseURI;
20
+
21
+ var SCOPE = new URL('./$$platinum-push-messaging$$/', currentScript).href;
22
+ var WORKER_URL = new URL('./service-worker.js', currentScript).href;
23
+
24
+ var BASE_URL = new URL('./', document.location.href).href;
25
+
26
+ var SUPPORTED = 'serviceWorker' in navigator &&
27
+ 'PushManager' in window &&
28
+ 'Notification' in window;
29
+
30
+ /**
31
+ * @const {Number} The desired version of the service worker to use. This is
32
+ * not strictly tied to anything except that it should be changed whenever
33
+ * a breaking change is made to the service worker code.
34
+ */
35
+ var VERSION = 1;
36
+
37
+ // This allows us to use the PushSubscription attribute type in browsers
38
+ // where it is not defined.
39
+ if (!('PushSubscription' in window)) {
40
+ window.PushSubscription = {};
41
+ }
42
+
43
+ /**
44
+ * `<platinum-push-messaging>` sets up a [push messaging][1] subscription
45
+ * and allows you to define what happens when a push message is received.
46
+ *
47
+ * The element can be placed anywhere, but should only be used once in a
48
+ * page. If there are multiple occurrences, only one will be active.
49
+ *
50
+ * # Requirements
51
+ * Push messaging is currently only available in Google Chrome, which
52
+ * requires you to configure Google Cloud Messaging. Chrome will check that
53
+ * your page links to a manifest file that contains a `gcm_sender_id` field.
54
+ * You can find full details of how to set all of this up in the [HTML5
55
+ * Rocks guide to push notifications][1].
56
+ *
57
+ * # Notifcation details
58
+ * The data for how a notification should be displayed can come from one of
59
+ * three places.
60
+ *
61
+ * Firstly, you can specify a URL from which to fetch the message data.
62
+ * ```
63
+ * <platinum-push-messaging
64
+ * message-url="notification-data.json">
65
+ * </platinum-push-messaging>
66
+ * ```
67
+ *
68
+ * The second way is to send the message data in the body of
69
+ * the push message from your server. In this case you do not need to
70
+ * configure anything in your page:
71
+ * ```
72
+ * <platinum-push-messaging></platinum-push-messaging>
73
+ * ```
74
+ * **Note that this method is not currently supported by any browser**. It
75
+ * is, however, defined in the
76
+ * [draft W3C specification](http://w3c.github.io/push-api/#the-push-event)
77
+ * and this element should use that data when it is implemented in the
78
+ * future.
79
+ *
80
+ * If a message-url is provided then the message body will be ignored in
81
+ * favor of the first method.
82
+ *
83
+ * Thirdly, you can manually define the attributes on the element:
84
+ * ```
85
+ * <platinum-push-messaging
86
+ * title="Application updated"
87
+ * message="The application was updated in the background"
88
+ * icon-url="icon.png"
89
+ * click-url="notification.html">
90
+ * </platinum-push-messaging>
91
+ * ```
92
+ * These values will also be used as defaults if one of the other methods
93
+ * does not provide a value for that property.
94
+ *
95
+ * # Testing
96
+ * If you have set up Google Cloud Messaging then you can send push messages
97
+ * to your browser by following the guide in the [GCM documentation][2].
98
+ *
99
+ * However, for quick client testing there are two options. You can use the
100
+ * `testPush` method, which allows you to simulate a push message that
101
+ * includes a payload.
102
+ *
103
+ * Or, at a lower level, you can open up chrome://serviceworker-internals in
104
+ * Chrome and use the 'Push' button for the service worker corresponding to
105
+ * your app.
106
+ *
107
+ * [1]: http://updates.html5rocks.com/2015/03/push-notificatons-on-the-open-web
108
+ * [2]: https://developer.android.com/google/gcm/http.html
109
+ *
110
+ * @demo demo/
111
+ */
112
+ Polymer({
113
+ is: 'platinum-push-messaging',
114
+
115
+ properties: {
116
+
117
+ /**
118
+ * Indicates whether the Push and Notification APIs are supported by
119
+ * this browser.
120
+ */
121
+ supported: {
122
+ readOnly: true,
123
+ type: Boolean,
124
+ value: SUPPORTED
125
+ },
126
+
127
+ /**
128
+ * The details of the current push subscription, if any.
129
+ */
130
+ subscription: {
131
+ readOnly: true,
132
+ type: PushSubscription,
133
+ notify: true,
134
+ },
135
+
136
+ /**
137
+ * Indicates the status of the element. If true, push messages will be
138
+ * received.
139
+ */
140
+ enabled: {
141
+ readOnly: true,
142
+ type: Boolean,
143
+ notify: true,
144
+ value: false
145
+ },
146
+
147
+
148
+ /**
149
+ * A URL from which message information can be retrieved.
150
+ *
151
+ * When a push event happens that does not contain a message body this
152
+ * URL will be fetched. The URL is expected to be for a JSON document in
153
+ * the format:
154
+ * ```
155
+ * {
156
+ * "title": "The title for the notification",
157
+ * "body": "The message to display in the notification",
158
+ * "url": "The URL to display when the notification is clicked",
159
+ * "icon": "The URL of an icon to display with the notification",
160
+ * "tag": "An identifier that determines which notifications can be displayed at the same time"
161
+ * }
162
+ * ```
163
+ */
164
+ messageUrl: String,
165
+
166
+ /**
167
+ * A default notification title.
168
+ */
169
+ title: String,
170
+
171
+ /**
172
+ * A default notification message.
173
+ */
174
+ message: String,
175
+
176
+ /**
177
+ * A default icon for notifications.
178
+ */
179
+ iconUrl: String,
180
+
181
+ /**
182
+ * A default URL to display when a notification is clicked.
183
+ */
184
+ clickUrl: {
185
+ type: String,
186
+ value: document.location.href
187
+ },
188
+
189
+ /**
190
+ * A default tag for the notifications that will be generated by
191
+ * this element. Notifications with the same tag will overwrite one
192
+ * another, so that only one will be shown at once.
193
+ */
194
+ tag: String
195
+ },
196
+
197
+ /**
198
+ * Fired when a notification is clicked that had the current page as the
199
+ * click URL.
200
+ *
201
+ * @event platinum-push-messaging-click
202
+ * @param {Object} The push message data used to create the notification
203
+ */
204
+
205
+ /**
206
+ * Fired when a push message is received but no notification is shown.
207
+ * This happens when the click URL is for this page and the page is
208
+ * visible to the user on the screen.
209
+ *
210
+ * @event platinum-push-messaging-push
211
+ * @param {Object} The push message data that was received
212
+ */
213
+
214
+ /**
215
+ * Fired when an error occurs while enabling or disabling notifications
216
+ *
217
+ * @event platinum-push-messaging-error
218
+ * @param {String} The error message
219
+ */
220
+
221
+ /**
222
+ * Returns a promise which will resolve to the registration object
223
+ * associated with our current service worker.
224
+ *
225
+ * @return {Promise<ServiceWorkerRegistration>}
226
+ */
227
+ _getRegistration: function() {
228
+ return navigator.serviceWorker.getRegistration(SCOPE);
229
+ },
230
+
231
+ /**
232
+ * Returns a promise that will resolve when the given registration becomes
233
+ * active.
234
+ *
235
+ * @param registration {ServiceWorkerRegistration}
236
+ * @return {Promise<undefined>}
237
+ */
238
+ _registrationReady: function(registration) {
239
+ if (registration.active) {
240
+ return Promise.resolve();
241
+ }
242
+
243
+ var serviceWorker = registration.installing || registration.waiting;
244
+
245
+ return new Promise(function(resolve, reject) {
246
+ // Because the Promise function is called on next tick there is a
247
+ // small chance that the worker became active already.
248
+ if (serviceWorker.state === 'activated') {
249
+ resolve();
250
+ }
251
+ var listener = function(event) {
252
+ if (serviceWorker.state === 'activated') {
253
+ resolve();
254
+ } else if (serviceWorker.state === 'redundant') {
255
+ reject(new Error('Worker became redundant'));
256
+ } else {
257
+ return;
258
+ }
259
+ serviceWorker.removeEventListener('statechange', listener);
260
+ };
261
+ serviceWorker.addEventListener('statechange', listener);
262
+ });
263
+ },
264
+
265
+ /**
266
+ * Event handler for the `message` event.
267
+ *
268
+ * @param event {MessageEvent}
269
+ */
270
+ _messageHandler: function(event) {
271
+ if (event.data && event.data.source === SCOPE) {
272
+ switch(event.data.type) {
273
+ case 'push':
274
+ this.fire('platinum-push-messaging-push', event.data);
275
+ break;
276
+ case 'click':
277
+ this.fire('platinum-push-messaging-click', event.data);
278
+ break;
279
+ }
280
+ }
281
+ },
282
+
283
+ /**
284
+ * Takes an options object and creates a stable JSON serialization of it.
285
+ * This naive algorithm will only work if the object contains only
286
+ * non-nested properties.
287
+ *
288
+ * @param options {Object.<String, ?(String|Number|Boolean)>}
289
+ * @return String
290
+ */
291
+ _serializeOptions: function(options) {
292
+ var props = Object.keys(options);
293
+ props.sort();
294
+ var parts = props.filter(function(propName) {
295
+ return !!options[propName];
296
+ }).map(function(propName) {
297
+ return JSON.stringify(propName) + ':' + JSON.stringify(options[propName]);
298
+ });
299
+ return '{' + parts.join(',') + '}';
300
+ },
301
+
302
+ /**
303
+ * Determine the URL of the worker based on the currently set parameters
304
+ *
305
+ * @return String the URL
306
+ */
307
+ _getWorkerURL: function() {
308
+ var options = this._serializeOptions({
309
+ tag: this.tag,
310
+ messageUrl: this.messageUrl,
311
+ title: this.title,
312
+ message: this.message,
313
+ iconUrl: this.iconUrl,
314
+ clickUrl: this.clickUrl,
315
+ version: VERSION,
316
+ baseUrl: BASE_URL
317
+ });
318
+
319
+ return WORKER_URL + '?' + options;
320
+ },
321
+
322
+ /**
323
+ * Update the subscription property, but only if the value has changed.
324
+ * This prevents triggering the subscription-changed event twice on page
325
+ * load.
326
+ */
327
+ _updateSubscription: function(subscription) {
328
+ if (JSON.stringify(subscription) !== JSON.stringify(this.subscription)) {
329
+ this._setSubscription(subscription);
330
+ }
331
+ },
332
+
333
+ /**
334
+ * Programmatically trigger a push message
335
+ *
336
+ * @param message {Object} the message payload
337
+ */
338
+ testPush: function(message) {
339
+ this._getRegistration().then(function(registration) {
340
+ registration.active.postMessage({
341
+ type: 'test-push',
342
+ message: message
343
+ });
344
+ });
345
+ },
346
+
347
+ /**
348
+ * Request push messaging to be enabled.
349
+ *
350
+ * @return {Promise<undefined>}
351
+ */
352
+ enable: function() {
353
+ if (!this.supported) {
354
+ this.fire('platinum-push-messaging-error', 'Your browser does not support push notifications');
355
+ return Promise.resolve();
356
+ }
357
+
358
+ return navigator.serviceWorker.register(this._getWorkerURL(), {scope: SCOPE}).then(function(registration) {
359
+ return this._registrationReady(registration).then(function() {
360
+ return registration.pushManager.subscribe({userVisibleOnly: true});
361
+ });
362
+ }.bind(this)).then(function(subscription) {
363
+ this._updateSubscription(subscription);
364
+ this._setEnabled(true);
365
+ }.bind(this)).catch(function(error) {
366
+ this.fire('platinum-push-messaging-error', error.message || error);
367
+ }.bind(this));
368
+ },
369
+
370
+ /**
371
+ * Request push messaging to be disabled.
372
+ *
373
+ * @return {Promise<undefined>}
374
+ */
375
+ disable: function() {
376
+ if (!this.supported) {
377
+ return Promise.resolve();
378
+ }
379
+
380
+ return this._getRegistration().then(function(registration) {
381
+ if (!registration) {
382
+ return;
383
+ }
384
+ return registration.pushManager.getSubscription().then(function(subscription) {
385
+ if (subscription) {
386
+ return subscription.unsubscribe();
387
+ }
388
+ }).then(function() {
389
+ return registration.unregister();
390
+ }).then(function() {
391
+ this._updateSubscription();
392
+ this._setEnabled(false);
393
+ }.bind(this)).catch(function(error) {
394
+ this.fire('platinum-push-messaging-error', error.message || error);
395
+ }.bind(this));
396
+ }.bind(this));
397
+ },
398
+
399
+ ready: function() {
400
+ if (this.supported) {
401
+ var handler = this._messageHandler.bind(this);
402
+ // NOTE: We add the event listener twice because the specced and
403
+ // implemented behaviors do not match. In Chrome 42, messages are
404
+ // received on window. In the current spec they are supposed to be
405
+ // received on navigator.serviceWorker.
406
+ // TODO: Remove the non-spec code in the future.
407
+ window.addEventListener('message', handler);
408
+ navigator.serviceWorker.addEventListener('message', handler);
409
+
410
+ this._getRegistration().then(function(registration) {
411
+ if (!registration) {
412
+ return;
413
+ }
414
+ if (registration.active && registration.active.scriptURL !== this._getWorkerURL()) {
415
+ // We have an existing worker in this scope, but it is out of date
416
+ return this.enable();
417
+ }
418
+ return registration.pushManager.getSubscription().then(function(subscription) {
419
+ this._updateSubscription(subscription);
420
+ this._setEnabled(true);
421
+ }.bind(this));
422
+ }.bind(this));
423
+ }
424
+ }
425
+ });
426
+ })();
427
+ </script>