Chromium Code Reviews| Index: chrome/common/extensions/docs/examples/extensions/plugin_settings/js/plugin_settings.js |
| diff --git a/chrome/common/extensions/docs/examples/extensions/plugin_settings/js/plugin_settings.js b/chrome/common/extensions/docs/examples/extensions/plugin_settings/js/plugin_settings.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c089d71cafa33eb03fd55e9e9f0402b10057d0b6 |
| --- /dev/null |
| +++ b/chrome/common/extensions/docs/examples/extensions/plugin_settings/js/plugin_settings.js |
| @@ -0,0 +1,217 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +cr.define('pluginSettings', function() { |
| + const EventTarget = cr.EventTarget; |
| + const Event = cr.Event; |
| + |
| + /** |
| + * Creates a new content settings model. |
| + * @param {string} plugin Identifies the plug-in for which this object stores |
| + * settings. |
| + * @constructor |
| + * @extends {cr.EventTarget} |
| + */ |
| + function Settings(plugin) { |
| + this.plugin_ = plugin; |
| + } |
| + |
| + Settings.prototype = { |
| + __proto__: cr.EventTarget.prototype, |
| + |
| + /** |
| + * Identifies the plug-in for which this object stores settings. |
| + * @type {string} |
|
Mike West
2011/10/25 19:52:06
`@type {?string}` since it's apparently nullable.
Bernhard Bauer
2011/10/26 13:55:18
Hm, once it's been initialized, it's not nullable
|
| + * @private |
| + */ |
| + plugin_: null, |
| + |
| + /** |
| + * Called when a transaction is finished. |
| + * @param {?string} error The error message, if an error occurred. |
| + * Otherwise, this is null. |
| + * @private |
| + */ |
| + transactionFinished_: function(error) { |
| + if (error) |
| + $('error').textContent = 'Error: ' + error; |
| + else |
| + $('error').textContent = ''; |
| + cr.dispatchSimpleEvent(this, 'change'); |
| + }, |
| + |
| + /** |
| + * Clears all content settings, and recreates them from local storage. |
| + * @param {function()} callback Called when the content settings have been |
|
Mike West
2011/10/25 19:52:06
`@param {function}`
Bernhard Bauer
2011/10/26 13:55:18
Is there another way to document that the callback
|
| + * recreated. |
|
Mike West
2011/10/25 19:52:06
(or upon error)
Bernhard Bauer
2011/10/26 13:55:18
Done.
|
| + * @private |
| + */ |
| + recreateRules_: function(callback) { |
| + chrome.contentSettings.plugins.clear({}, function() { |
| + if (chrome.extension.lastError) { |
| + console.error("Error clearing rules"); |
| + callback(); |
| + return; |
| + } |
| + var count = window.localStorage.length; |
| + if (count == 0) { |
| + callback(); |
| + return; |
| + } |
| + var errors = []; |
| + for (var i = 0; i < length; i++) { |
|
Mike West
2011/10/25 19:52:06
Where is `length` defined? Maybe copy/paste from #
Bernhard Bauer
2011/10/26 13:55:18
Oops. Fixed.
|
| + var key = window.localStorage.key(i); |
| + var keyArray = JSON.parse(key); |
| + var plugin = keyArray[0]; |
| + var pattern = keyArray[1]; |
| + var setting = window.localStorage.getItem(key); |
| + chrome.contentSettings.plugins.set({ |
|
Mike West
2011/10/25 19:52:06
I think you might be able to replace this block wi
Bernhard Bauer
2011/10/26 13:55:18
Hm, but setInternal also updates local storage, wh
|
| + 'primaryPattern': pattern, |
| + 'resourceIdentifier': { 'id': plugin }, |
| + 'setting': setting, |
| + }, function() { |
| + if (chrome.extension.lastError) { |
| + console.error('Error restoring [' + plugin_ + ', ' + |
| + pattern + setting + ']: ' + |
| + chrome.extension.lastError.message); |
| + window.localStorage.removeItem(key); |
|
Mike West
2011/10/25 19:52:06
Might be worth noting in the function's docblock t
Bernhard Bauer
2011/10/26 13:55:18
Done.
|
| + } |
| + count--; |
| + if (count == 0) |
| + callback(); |
| + }); |
| + } |
| + }); |
| + }, |
| + |
| + /** |
| + * Creates a content setting rule and calls the passed in callback with the |
| + * result. |
| + * @param {string} pattern The content setting pattern for the rule. |
| + * @param {string} setting The setting for the rule. |
| + * @param {function(?string)} callback Called when the content settings have |
| + * been updated. |
| + * @private |
| + */ |
| + setInternal_: function(pattern, setting, callback) { |
| + var plugin = this.plugin_; |
| + chrome.contentSettings.plugins.set({ |
| + 'primaryPattern': pattern, |
| + 'resourceIdentifier': { 'id': plugin }, |
| + 'setting': setting, |
| + }, function() { |
| + if (chrome.extension.lastError) { |
| + callback(chrome.extension.lastError.message); |
| + } else { |
| + window.localStorage.setItem(JSON.stringify([plugin, pattern]), |
| + setting); |
| + callback(null); |
| + } |
| + }); |
| + }, |
| + |
| + /** |
| + * Creates a content setting rule. |
| + * @param {string} pattern The content setting pattern for the rule. |
| + * @param {string} setting The setting for the rule. |
| + */ |
| + set: function(pattern, setting) { |
| + var settings = this; |
| + this.setInternal_(pattern, setting, this.transactionFinished_.bind(this)); |
| + }, |
| + |
| + /** |
| + * Removes the content setting rule with a given pattern, and calls the |
| + * passed in callback afterwards. |
| + * @param {string} pattern The content setting pattern for the rule. |
| + * @param {function(?string)} callback Called when the content settings have |
| + * been updated. |
| + * @private |
| + */ |
| + clearInternal_: function(pattern, callback) { |
| + window.localStorage.removeItem( |
| + JSON.stringify([this.plugin_, pattern])); |
| + this.recreateRules_(callback); |
| + }, |
| + |
| + /** |
| + * Removes the content setting rule with a given pattern. |
| + * @param {string} pattern The content setting pattern for the rule. |
| + */ |
| + clear: function(pattern) { |
| + var settings = this; |
| + this.clearInternal_(pattern, this.transactionFinished_.bind(this)); |
| + }, |
| + |
| + /** |
| + * Updates the content setting rule with a given pattern to a new pattern |
| + * and setting. |
| + * @param {string} oldPattern The old content setting pattern for the rule. |
| + * @param {string} newPattern The new content setting pattern for the rule. |
| + * @param {string} setting The setting for the rule. |
| + */ |
| + update: function(oldPattern, newPattern, setting) { |
| + if (oldPattern == newPattern) { |
| + // Avoid recreating all rules if only the setting changed. |
| + this.set(newPattern, setting); |
| + return; |
| + } |
| + var oldSetting = this.get(oldPattern); |
| + var settings = this; |
| + // Remove the old rule. |
| + this.clearInternal_(oldPattern, function() { |
| + // Try to set the new rule. |
| + settings.setInternal_(newPattern, setting, function(error) { |
| + if (error) { |
| + // If setting the new rule failed, restore the old rule. |
|
Mike West
2011/10/25 19:52:06
I like this. Nice thought.
|
| + settings.setInternal_(oldPattern, oldSetting, |
| + function(restoreError) { |
| + if (restoreError) { |
| + console.error('Error restoring [' + settings.plugin_ + ', ' + |
| + oldPattern + oldSetting + ']: ' + restoreError); |
| + } |
| + settings.transactionFinished_(error); |
| + }); |
| + } else { |
| + settings.transactionFinished_(); |
| + } |
| + }); |
| + }); |
| + }, |
| + |
| + /** |
| + * Returns the content setting for a given pattern. |
| + * @param {string} pattern The content setting pattern for the rule. |
| + * @return {string} The setting for the rule. |
| + */ |
| + get: function(primaryPattern) { |
| + return window.localStorage.getItem( |
| + JSON.stringify([this.plugin_, primaryPattern])); |
| + }, |
| + |
| + /** |
| + * @return {array} A list of all content setting rules for this plug-in. |
| + */ |
| + getAll: function() { |
| + var length = window.localStorage.length; |
| + var rules = []; |
| + for (var i = 0; i < length; i++) { |
| + var key = window.localStorage.key(i); |
| + var keyArray = JSON.parse(key); |
| + if (keyArray[0] == this.plugin_) { |
| + rules.push({ |
| + 'primaryPattern': keyArray[1], |
| + 'setting': window.localStorage.getItem(key), |
| + }); |
| + } |
| + } |
| + return rules; |
| + } |
| + }; |
| + |
| + return { |
| + Settings: Settings, |
| + } |
| +}); |
| + |