Index: chrome/browser/resources/quota_internals/event_handler.js |
diff --git a/chrome/browser/resources/quota_internals/event_handler.js b/chrome/browser/resources/quota_internals/event_handler.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0c98d234b4ec914b62437e158f65304c15378fd5 |
--- /dev/null |
+++ b/chrome/browser/resources/quota_internals/event_handler.js |
@@ -0,0 +1,268 @@ |
+// 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. |
+ |
+// require cr.js |
+// require cr/event_target.js |
+// require cr/util.js |
+ |
+(function() { |
+'use strict'; |
+ |
+/** |
+ * Copy properties from src to dest. |
+ * @param {Object} src |
+ * @param {Object} dest |
+ */ |
+var overwrite_ = function(src, dest) { |
+ for (var i in src) |
+ dest[i] = src[i]; |
+ return dest; |
+}; |
+ |
+var normalizer_ = { |
+ avail_: function(v) { |
+ return v === undefined ? 'N/A' : ''; |
+ }, |
+ |
+ bool: function(v) { |
+ return normalizer_.avail_(v) || (v ? 'true' : 'false'); |
+ }, |
+ |
+ text: function(v) { |
+ return normalizer_.avail_(v) || v; |
+ }, |
+ |
+ numBytes: function(v) { |
+ return normalizer_.avail_(v) || (function() { |
+ var PREFIX = ['', 'K', 'M', 'G', 'T']; |
+ var len = Math.floor((v.length - 1) / 3); |
+ return v.substring(0, v.length - 3 * len) + |
+ PREFIX[len] + 'B'; |
+ })(); |
+ }, |
+ |
+ date: function(v) { |
+ return normalizer_.avail_(v) || (function() { |
+ // TODO(tzik): show relative time |
+ return new Date(v).toString(); |
+ })(); |
+ }, |
+ |
+ num: function(v) { |
+ return normalizer_.avail_(v) || v.toString(); |
+ } |
+}; |
+ |
+/** |
+ * @type {{ |
+ * available_space: {?string}, |
+ * global_data: Object.<string, Object>, |
+ * host_data: Object.<string, Object>, |
+ * origin_data: Object.<string, Object> |
+ * }} |
+ */ |
+var quota_data = { |
+ available_space: undefined, |
+ global_data: {}, |
+ host_data: {}, |
+ origin_data: {}, |
+ stats: {} |
+}; |
+ |
+/** |
+ * Event Handler for |cr.quota.onAvailableSpaceUpdated|. |
+ * |event.detail| contains |available_space| size. |
+ * |available_space| is a (toString'ed) 64bit integer, |
+ * that represents total available disk space. |
+ */ |
+function handleAvailableSpace(event) { |
+ /** |
+ * @type {string} |
+ */ |
+ var available_space = event.detail; |
+ |
+ quota_data.available_space = available_space; |
+ $('diskspace-entry').innerHTML = normalizer_.numBytes(available_space); |
+}; |
+ |
+/** |
+ * Event Handler for |cr.quota.onGlobalDataUpdated|. |
+ * |event.detail| contains a record which has: |
+ * |type|: |
+ * Storage type, that is either 'temporary' or 'persistent' |
+ * |usage|: |
+ * Total storage usage of all hosts, |
+ * toString'ed 64bit integer. |
+ * |unlimited_usage|: |
+ * Total storage usage of unlimited-quota origins, |
+ * toString'ed 64bit integer. |
+ * |quota|: |
+ * Total quota of the storage, toString'ed 64bit integer. |
+ * |
+ * |usage|, |unlimited_usage| and |quota| can be missing, |
+ * and some additional field can be included. |
+ */ |
+function handleGlobalData(event) { |
+ /** |
+ * @type {{ |
+ * type: {!string}, |
+ * usage: {?string}, |
+ * unlimited_usage: {?string} |
+ * quota: {?string} |
+ * }} |
+ */ |
+ var data = event.detail; |
+ |
+ var entry = quota_data.global_data[data.type] || |
+ (quota_data.global_data[data.type] = {}); |
+ overwrite_(data, entry); |
+ |
+ if (!entry.element) { |
+ entry.element = cr.doc.createElement('tr'); |
+ $('globaldata-entries').appendChild(entry.element); |
+ } |
+ |
+ entry.element.innerHTML = |
+ '<td>' + normalizer_.text(entry.type) + '</td>' + |
+ '<td>' + normalizer_.numBytes(entry.usage) + '</td>' + |
+ '<td>' + normalizer_.numBytes(entry.unlimited_usage) + '</td>' + |
+ '<td>' + normalizer_.numBytes(entry.quota) + '</td>'; |
+}; |
+ |
+/** |
+ * Event Handler for |cr.quota.onHostDataUpdated|. |
+ * |event.detail| contains records which have: |
+ * |host|: |
+ * Hostname of the entry. (e.g. 'example.com') |
+ * |type|: |
+ * Storage type. 'temporary' or 'persistent' |
+ * |usage|: |
+ * Total storage usage of the host, toString'ed 64bit integer. |
+ * |quota|: |
+ * Per-host quota, toString'ed 64bit integer. |
+ * |
+ * |usage| and |quota| can be missing, |
+ * and some additional field can be included. |
+ */ |
+function handleHostData(event) { |
+ /** |
+ * @type {Array<{ |
+ * host: {!string}, |
+ * type: {!string}, |
+ * usage: {?string}, |
+ * quota: {?string} |
+ * }} |
+ */ |
+ var data_array = event.detail; |
+ |
+ for (var i = 0; i < data_array.length; ++i) { |
+ var data = data_array[i]; |
+ |
+ var id = data.host + '/' + data.type; |
+ var entry = quota_data.host_data[id] || |
+ (quota_data.host_data[id] = {}); |
+ overwrite_(data, entry); |
+ |
+ if (!entry.element) { |
+ entry.element = cr.doc.createElement('tr'); |
+ $('host-entries').appendChild(entry.element); |
+ } |
+ |
+ entry.element.innerHTML = |
+ '<td>' + normalizer_.text(entry.host) + '</td>' + |
+ '<td>' + normalizer_.text(entry.type) + '</td>' + |
+ '<td>' + normalizer_.numBytes(entry.usage) + '</td>' + |
+ '<td>' + normalizer_.numBytes(entry.quota) + '</td>'; |
+ } |
+} |
+ |
+/** |
+ * Event Handler for |cr.quota.onOriginDataUpdated|. |
+ * |event.detail| contains records which have: |
+ * |origin|: |
+ * Origin URL of the entry. |
+ * |type|: |
+ * Storage type of the entry. 'temporary' or 'persistent'. |
+ * |host|: |
+ * Hostname of the entry. |
+ * |in_use|: |
+ * Whether the origin is in use or not. |
+ * |used_count|: |
+ * Used count of the storage from the origin. |
+ * |last_access_time|: |
+ * Last storage access time from the origin. |
+ * Number of seconds since Jan 1, 1970. |
+ * |
+ * |in_use|, |used_count| and |last_access_time| can be missing, |
+ * and some additional field can be included. |
+ */ |
+function handleOriginData(event) { |
+ /** |
+ * @type {Array<{ |
+ * origin: {!string}, |
+ * type: {!string}, |
+ * host: {!string}, |
+ * in_use: {?boolean}, |
+ * used_count: {?number}, |
+ * last_access_time: {?number} |
+ * }>} |
+ */ |
+ var data_array = event.detail; |
+ |
+ for (var i = 0; i < data_array.length; ++i) { |
+ var data = data_array[i]; |
+ |
+ var id = data.origin + data.type; |
+ var entry = quota_data.origin_data[id] || |
+ (quota_data.origin_data[id] = {}); |
+ overwrite_(data, entry); |
+ |
+ if (!entry.element) { |
+ entry.element = cr.doc.createElement('tr'); |
+ $('origin-entries').appendChild(entry.element); |
+ } |
+ |
+ entry.element.innerHTML = |
+ '<td>' + normalizer_.text(entry.origin) + '</td>' + |
+ '<td>' + normalizer_.text(entry.type) + '</td>' + |
+ '<td>' + normalizer_.text(entry.host) + '</td>' + |
+ '<td>' + normalizer_.bool(entry.in_use) + '</td>' + |
+ '<td>' + normalizer_.num(entry.used_count) + '</td>' + |
+ '<td>' + normalizer_.date(entry.last_access_time) + '</td>'; |
+ } |
+} |
+ |
+/** |
+ * Event Handler for |cr.quota.onStatisticsUpdated|. |
+ * |event.detail| contains misc statistics data as dictionary. |
+ */ |
+function handleStatistics(event) { |
+ var stats = event.detail; |
+ |
+ for (var key in stats) { |
+ var value = stats[key]; |
+ var entry = quota_data.stats[key] || |
+ (quota_data.stats[key] = {}); |
+ entry.value = value; |
+ if (!entry.element) { |
+ entry.element = cr.doc.createElement('tr'); |
+ $('stat-entries').appendChild(entry.element); |
+ } |
+ |
+ entry.element.innerHTML = |
+ '<td>' + normalizer_.text(entry.value) + '</td>'; |
+ } |
+} |
+ |
+function onLoad() { |
+ cr.quota.onAvailableSpaceUpdated.addEventListener('update', |
+ handleAvailableSpace); |
+ cr.quota.onGlobalDataUpdated.addEventListener('update', handleGlobalData); |
+ cr.quota.onHostDataUpdated.addEventListener('update', handleHostData); |
+ cr.quota.onOriginDataUpdated.addEventListener('update', handleOriginData); |
+ cr.quota.triggar(); |
+} |
+ |
+cr.doc.addEventListener('DOMContentLoaded', onLoad, false); |
+})(); |