Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2979)

Unified Diff: chrome/renderer/resources/extensions/experimental.system_info_storage_custom_bindings.js

Issue 11419279: Implement systemInfo.storage.onChanged event (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: refine browser test and code comments Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/resources/extensions/experimental.system_info_storage_custom_bindings.js
diff --git a/chrome/renderer/resources/extensions/experimental.system_info_storage_custom_bindings.js b/chrome/renderer/resources/extensions/experimental.system_info_storage_custom_bindings.js
new file mode 100644
index 0000000000000000000000000000000000000000..0db72cd171bbc7bd6e828f74bbf5ef1bb0f076f7
--- /dev/null
+++ b/chrome/renderer/resources/extensions/experimental.system_info_storage_custom_bindings.js
@@ -0,0 +1,101 @@
+// Copyright (c) 2012 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.
+
+// Custom bindings for the systemInfo.storage API.
+
+var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
+var validate = require('schemaUtils').validate;
+
+// The JSON schemas for extra parameters of addListener. Currently the IDL
+// parser doesn't support extra parameter for event definitions, see
+// http://crbug.com/163822. This is just a workaround to make the schemas
+// validation works for extra parameter event even if no defintion is given
+// in IDL file.
+var extraArgJSONSchemas =
+'{ ' +
+' "type":"object", ' +
+' "id":"experimental.systemInfo.storage.EventOption", ' +
+' "properties": { ' +
+' "id": {"type": "string", "optional": false, "name":"id"}, ' +
+' "changeThreshold": { ' +
+' "type": "integer", "optional": true, "name":"changeThreshold" ' +
+' } ' +
+' } ' +
+'}';
+
+var EVENT_DELIMITER = '#';
+
+// StorageChangeEvent object. This is used for systemInfo.storage.onChanged
+// event with extra parameter supporting. Each invocation of addListener
+// creates a new named sub-event for the storage being watched.
+//
+// Example:
+// chrome.experimental.systemInfo.storage.onChanged.addListener(
+// callback, {id: <storage_id>, changeThreshold: <number>});
+// ^ callback will only be called for the changes happening on the specified
+// storage and the change of free space is greater than the changeThreshold.
+//
+function StorageChangeEvent(eventName, argSchemas, extraArgSchemas,
+ opt_eventOptions) {
+ // StorageChangeEvent inherits from chrome.Event object.
+ chrome.Event.call(this, eventName, argSchemas, opt_eventOptions);
+ if (!extraArgSchemas) {
+ this.extraArgSchemas_ = [];
+ this.extraArgSchemas_.push(JSON.parse(extraArgJSONSchemas));
+ }
+ else
+ this.extraArgSchemas_ = extraArgSchemas;
+ this.subEvents_ = {};
+}
+
+StorageChangeEvent.prototype = new chrome.Event();
+
+StorageChangeEvent.prototype.addListener = function(cb, eventOption) {
+ if (!this.eventOptions_.supportsListeners)
+ throw new Error('This event does not support listeners');
+ validate(Array.prototype.slice.call(arguments, 1), this.extraArgSchemas_);
+
+ // The format of sub-event name is "this.eventName_#<id>#changeThreshold".
+ var subEventName = this.eventName_ + EVENT_DELIMITER + eventOption.id;
+ // Default changeBytes is 4096 bytes.
+ if (!eventOption.changeThreshold || eventOption.changeThreshold <= 0)
+ eventOption.changeThreshold = 4096;
+ subEventName += EVENT_DELIMITER + eventOption.changeThreshold;
+
+ this.listeners_.push({callback: cb});
+
+ // If the event is already being listened.
+ if (this.subEvents_[subEventName]) {
+ var subEvent = this.subEvents_[subEventName].event;
+ subEvent.addListener(cb);
+ return;
+ }
+
+ // Create a new event.
+ var subEvent = new chrome.Event(subEventName, this.argSchemas_);
+ this.subEvents_[subEventName] = {event: subEvent, id: eventOption.id};
+ subEvent.addListener(cb);
+}
+
+StorageChangeEvent.prototype.removeListener = function(cb) {
+ if (!this.eventOptions_.supportsListeners)
+ throw new Error('This event does not support listeners');
+ var idx;
+ while ((idx = this.findListener_(cb)) >= 0) {
+ this.listeners_.splice(idx, 1);
+ }
+
+ for (var eventName in this.subEvents_) {
+ var subEvent = this.subEvents_[eventName].event;
+ if (subEvent.hasListener(cb)) {
+ subEvent.removeListener(cb);
+ if (!subEvent.hasListeners()) {
+ delete this.subEvents_[eventName];
+ }
+ }
+ }
+}
+
+chromeHidden.registerCustomEvent('experimental.systemInfo.storage',
+ StorageChangeEvent);

Powered by Google App Engine
This is Rietveld 408576698