Rewrite AndroidSyncSettings to be significantly simpler.
[chromium-blink-merge.git] / remoting / webapp / unittests / chrome_mocks.js
blobbe557855636f670b96d606acda9d95a7bfee9855
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // This file contains various mock objects for the chrome platform to make
6 // unit testing easier.
8 Entry = function() {};
10 var chromeMocks = {};
12 (function(){
14 /**
15  * @constructor
16  */
17 chromeMocks.Event = function() {
18   this.listeners_ = [];
21 /** @param {Function} callback */
22 chromeMocks.Event.prototype.addListener = function(callback) {
23   this.listeners_.push(callback);
26 /** @param {Function} callback */
27 chromeMocks.Event.prototype.removeListener = function(callback) {
28   for (var i = 0; i < this.listeners_.length; i++) {
29     if (this.listeners_[i] === callback) {
30       this.listeners_.splice(i, 1);
31       break;
32     }
33   }
36 /**
37  * @param {...*} var_args
38  * @return {void}
39  */
40 chromeMocks.Event.prototype.mock$fire = function(var_args) {
41   var params = Array.prototype.slice.call(arguments);
42   this.listeners_.forEach(
43       /** @param {Function} listener */
44       function(listener){
45         listener.apply(null, params);
46       });
49 /** @type {Object} */
50 chromeMocks.runtime = {};
52 /** @constructor */
53 chromeMocks.runtime.Port = function() {
54   this.onMessage = new chromeMocks.Event();
55   this.onDisconnect = new chromeMocks.Event();
57   /** @type {string} */
58   this.name = '';
60   /** @type {chrome.runtime.MessageSender} */
61   this.sender = null;
64 chromeMocks.runtime.Port.prototype.disconnect = function() {};
66 /**
67  * @param {Object} message
68  */
69 chromeMocks.runtime.Port.prototype.postMessage = function(message) {};
71 /** @type {chromeMocks.Event} */
72 chromeMocks.runtime.onMessage = new chromeMocks.Event();
74 /**
75  * @param {string?} extensionId
76  * @param {*} message
77  * @param {function(*)=} responseCallback
78  */
79 chromeMocks.runtime.sendMessage = function(extensionId, message,
80                                            responseCallback) {
81   base.debug.assert(
82       extensionId === null,
83       'The mock only supports sending messages to the same extension.');
84   extensionId = chrome.runtime.id;
85   window.requestAnimationFrame(function() {
86     var message_copy = base.deepCopy(message);
87     chromeMocks.runtime.onMessage.mock$fire(
88         message_copy, {id: extensionId}, responseCallback);
89   });
92 /** @type {string} */
93 chromeMocks.runtime.id = 'extensionId';
95 /** @type {Object} */
96 chromeMocks.storage = {};
98 // Sample implementation of chrome.StorageArea according to
99 // https://developer.chrome.com/apps/storage#type-StorageArea
100 /** @constructor */
101 chromeMocks.StorageArea = function() {
102   /** @type {Object} */
103   this.storage_ = {};
107  * @param {!Object} keys
108  * @return {Array<string>}
109  */
110 function getKeys(keys) {
111   if (typeof keys === 'string') {
112     return [keys];
113   } else if (typeof keys === 'object') {
114     return Object.keys(keys);
115   }
116   return [];
120  * @param {!Object} keys
121  * @param {Function} onDone
122  */
123 chromeMocks.StorageArea.prototype.get = function(keys, onDone) {
124   if (!keys) {
125     onDone(base.deepCopy(this.storage_));
126     return;
127   }
129   var result = (typeof keys === 'object') ? keys : {};
130   getKeys(keys).forEach(
131       /** @param {string} key */
132       function(key) {
133         if (key in this.storage_) {
134           result[key] = base.deepCopy(this.storage_[key]);
135         }
136       }, this);
137   onDone(result);
140 /** @param {Object} value */
141 chromeMocks.StorageArea.prototype.set = function(value) {
142   for (var key in value) {
143     this.storage_[key] = base.deepCopy(value[key]);
144   }
148  * @param {!Object} keys
149  */
150 chromeMocks.StorageArea.prototype.remove = function(keys) {
151   getKeys(keys).forEach(
152       /** @param {string} key */
153       function(key) {
154         delete this.storage_[key];
155       }, this);
158 chromeMocks.StorageArea.prototype.clear = function() {
159   this.storage_ = null;
162 /** @type {chromeMocks.StorageArea} */
163 chromeMocks.storage.local = new chromeMocks.StorageArea();
165 var originals_ = null;
168  * Activates a list of Chrome components to mock
169  * @param {Array<string>} components
170  */
171 chromeMocks.activate = function(components) {
172   if (originals_) {
173     throw new Error('chromeMocks.activate() can only be called once.');
174   }
175   originals_ = {};
176   components.forEach(function(component) {
177     if (!chromeMocks[component]) {
178       throw new Error('No mocks defined for chrome.' + component);
179     }
180     originals_[component] = chrome[component];
181     chrome[component] = chromeMocks[component];
182   });
185 chromeMocks.restore = function() {
186   if (!originals_) {
187     throw new Error('You must call activate() before restore().');
188   }
189   for (var components in originals_) {
190     chrome[components] = originals_[components];
191   }
192   originals_ = null;
195 })();