Index: third_party/polymer/v0_8/components/iron-localstorage/iron-localstorage.html |
diff --git a/third_party/polymer/v0_8/components/iron-localstorage/iron-localstorage.html b/third_party/polymer/v0_8/components/iron-localstorage/iron-localstorage.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..986cbcd6d73342c2f4958b3afc1ddfa947ed2751 |
--- /dev/null |
+++ b/third_party/polymer/v0_8/components/iron-localstorage/iron-localstorage.html |
@@ -0,0 +1,196 @@ |
+<!-- |
+@license |
+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"> |
+ |
+<!-- |
+Element access to Web Storage API (window.localStorage). |
+ |
+Keeps `value` is sync with a localStorage key. |
+ |
+Direct assignments to `value` are automatically detected and saved. |
+Subproperty assignments are not (ex: `value.bar='foo'`). |
+Call `save()` manually to commit your changes after modifying subproperties. |
+ |
+Value is saved in localStorage as JSON by default. |
+ |
+If you set the value to null, storage key will be deleted. |
+ |
+ <iron-localstorage name="my-app-storage" value="{{value}}"> |
+ </iron-localstorage> |
+ |
+ |
+<b>Warning</b>: do not pass subproperty bindings to iron-localstorage until Polymer |
+[bug 1550](https://github.com/Polymer/polymer/issues/1550) |
+is resolved. Local storage will be blown away. |
+No `<iron-localstorage value="{{foo.bar}}"`. |
+ |
+@group Iron Elements |
+@demo demo/index.html |
+@hero hero.svg |
+@element iron-localstorage |
+--> |
+<dom-module id="iron-localstorage"></dom-module> |
+<script> |
+ |
+ Polymer({ |
+ is: 'iron-localstorage', |
+ |
+ /** |
+ * Fired when value loads from localStorage. |
+ * |
+ * @param {Object} detail |
+ * @param {Boolean} detail.externalChange true if change occured in different window |
+ * @event iron-localstorage-load |
+ */ |
+ |
+ /** |
+ * Fired when loaded value is null. |
+ * You can use event handler to initialize default value. |
+ * |
+ * @event iron-localstorage-load-empty |
+ */ |
+ properties: { |
+ /** |
+ * The key to the data stored in localStorage. |
+ */ |
+ name: { |
+ type: String, |
+ value: '' |
+ }, |
+ /** |
+ * The data associated with this storage. |
+ * If value is set to null, and storage is in useRaw mode, item will be deleted |
+ */ |
+ value: { |
+ type: Object, |
+ notify: true |
+ }, |
+ |
+ /** |
+ * Value is stored and retrieved without JSON parse if true |
+ */ |
+ useRaw: { |
+ type: Boolean, |
+ value: false |
+ }, |
+ |
+ /** |
+ * Auto save is disabled if true. Default to false. |
+ */ |
+ autoSaveDisabled: { |
+ type: Boolean, |
+ value: false |
+ }, |
+ /** |
+ * Last error encountered while saving/loading items. Null otherwise |
+ */ |
+ errorMessage: { |
+ type: String, |
+ notify: true |
+ }, |
+ /* |
+ * True if value was loaded |
+ */ |
+ _loaded: { |
+ type: Boolean, |
+ value: false |
+ } |
+ }, |
+ |
+ observers: [ |
+ 'reload(name,useRaw)', |
+ '_trySaveValue(value, _loaded, autoSaveDisabled)' |
+ ], |
+ |
+ ready: function() { |
+ this._boundHandleStorage = this._handleStorage.bind(this); |
+ }, |
+ |
+ attached: function() { |
+ window.addEventListener('storage', this._boundHandleStorage); |
+ }, |
+ |
+ detached: function() { |
+ window.removeEventListener('storage', this._boundHandleStorage); |
+ }, |
+ |
+ _handleStorage: function(ev) { |
+ if (ev.key == this.name) { |
+ this._load(true); |
+ } |
+ }, |
+ |
+ _trySaveValue: function(value, _loaded, autoSaveDisabled) { |
+ if (this._justLoaded) { // guard against saving after _load() |
+ this._justLoaded = false; |
+ return; |
+ } |
+ if (_loaded && !autoSaveDisabled) { |
+ this.save(); |
+ } |
+ }, |
+ |
+ /** |
+ * Loads the value again. Use if you modify |
+ * localStorage using DOM calls, and want to |
+ * keep this element in sync. |
+ */ |
+ reload: function() { |
+ this._load(); |
+ }, |
+ |
+ /** |
+ * loads value from local storage |
+ * @param {Boolean} externalChange true if loading changes from a different window |
+ */ |
+ _load: function(externalChange) { |
+ var v = localStorage.getItem(this.name); |
+ |
+ if (v === null) { |
+ this.fire('iron-localstorage-load-empty'); |
+ } else if (!this.useRaw) { |
+ try { |
+ v = JSON.parse(v); |
+ } catch(x) { |
+ this.errorMessage = "Could not parse local storage value"; |
+ console.error("could not parse local storage value", v); |
+ } |
+ } |
+ |
+ this._justLoaded = true; |
+ this._loaded = true; |
+ this.value = v; |
+ this.fire('iron-localstorage-load', { externalChange: externalChange}); |
+ }, |
+ |
+ /** |
+ * Saves the value to localStorage. Call to save if autoSaveDisabled is set. |
+ * If `value` is null, deletes localStorage. |
+ */ |
+ save: function() { |
+ var v = this.useRaw ? this.value : JSON.stringify(this.value); |
+ try { |
+ if (this.value === null) { |
+ localStorage.removeItem(this.name); |
+ } else { |
+ localStorage.setItem(this.name, v); |
+ } |
+ } |
+ catch(ex) { |
+ // Happens in Safari incognito mode, |
+ this.errorMessage = ex.message; |
+ console.error("localStorage could not be saved. Safari incoginito mode?", ex); |
+ } |
+ } |
+ |
+ }); |
+ |
+</script> |