OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview Implementation of ScreenContext class: key-value storage for | 6 * @fileoverview Implementation of ScreenContext class: key-value storage for |
7 * values that are shared between C++ and JS sides. | 7 * values that are shared between C++ and JS sides. |
8 */ | 8 */ |
9 cr.define('login', function() { | 9 cr.define('login', function() { |
10 'use strict'; | |
11 | |
10 function require(condition, message) { | 12 function require(condition, message) { |
11 if (!condition) { | 13 if (!condition) { |
12 throw Error(message); | 14 throw Error(message); |
13 } | 15 } |
14 } | 16 } |
15 | 17 |
16 function checkKeyIsValid(key) { | 18 function checkKeyIsValid(key) { |
17 var keyType = typeof key; | 19 var keyType = typeof key; |
18 require(keyType === 'string', 'Invalid type of key: "' + keyType + '".'); | 20 require(keyType === 'string', 'Invalid type of key: "' + keyType + '".'); |
19 } | 21 } |
20 | 22 |
21 function checkValueIsValid(value) { | 23 function checkValueIsValid(value, t) { |
ygorshenin1
2014/06/11 10:44:00
nit: from the function definition and usage it's n
Denis Kuznetsov (DE-MUC)
2014/06/11 14:29:17
Also, guide recommends to avoid abbreviations for
dzhioev (left Google)
2014/06/18 14:43:39
It is a garbage that I forgot to remove.
| |
22 var valueType = typeof value; | 24 var valueType = typeof value; |
23 require(['string', 'boolean', 'number'].indexOf(valueType) != -1, | 25 require(['string', 'boolean', 'number'].indexOf(valueType) != -1, |
24 'Invalid type of value: "' + valueType + '".'); | 26 'Invalid type of value ' + t + ': "' + valueType + '".'); |
25 } | 27 } |
26 | 28 |
27 function ScreenContext() { | 29 function ScreenContext(screen) { |
30 this.screen_ = screen; | |
ygorshenin1
2014/06/11 10:44:00
Cound you please point where |screen_| is used?
dzhioev (left Google)
2014/06/18 14:43:39
It is not used anymore. I forgot to remove it.
| |
28 this.storage_ = {}; | 31 this.storage_ = {}; |
29 this.changes_ = {}; | 32 this.changes_ = {}; |
33 this.observers_ = {}; | |
30 } | 34 } |
31 | 35 |
32 ScreenContext.prototype = { | 36 ScreenContext.prototype = { |
33 /** | 37 /** |
34 * Returns stored value for |key| or |defaultValue| if key not found in | 38 * Returns stored value for |key| or |defaultValue| if key not found in |
35 * storage. Throws Error if key not found and |defaultValue| omitted. | 39 * storage. Throws Error if key not found and |defaultValue| omitted. |
36 */ | 40 */ |
37 get: function(key, defaultValue) { | 41 get: function(key, defaultValue) { |
38 checkKeyIsValid(key); | 42 checkKeyIsValid(key); |
39 if (this.hasKey(key)) { | 43 if (this.hasKey(key)) { |
40 return this.storage_[key]; | 44 return this.storage_[key]; |
41 } else if (typeof defaultValue !== 'undefined') { | 45 } else if (typeof defaultValue !== 'undefined') { |
42 return defaultValue; | 46 return defaultValue; |
43 } else { | 47 } else { |
44 throw Error('Key "' + key + '" not found.'); | 48 throw Error('Key "' + key + '" not found.'); |
45 } | 49 } |
46 }, | 50 }, |
47 | 51 |
48 /** | 52 /** |
49 * Sets |value| for |key|. Returns true if call changes state of context, | 53 * Sets |value| for |key|. Returns true if call changes state of context, |
50 * false otherwise. | 54 * false otherwise. |
51 */ | 55 */ |
52 set: function(key, value) { | 56 set: function(key, value) { |
53 checkKeyIsValid(key); | 57 checkKeyIsValid(key); |
54 checkValueIsValid(value); | 58 checkValueIsValid(value, 2); |
Denis Kuznetsov (DE-MUC)
2014/06/11 14:29:17
It is not obvious what "2" means.
Could you use so
dzhioev (left Google)
2014/06/18 14:43:39
Removed.
| |
55 if (this.hasKey(key) && this.storage_[key] === value) | 59 if (this.hasKey(key) && this.storage_[key] === value) |
56 return false; | 60 return false; |
57 this.changes_[key] = value; | 61 this.changes_[key] = value; |
58 this.storage_[key] = value; | 62 this.storage_[key] = value; |
59 return true; | 63 return true; |
60 }, | 64 }, |
61 | 65 |
62 hasKey: function(key) { | 66 hasKey: function(key) { |
63 checkKeyIsValid(key); | 67 checkKeyIsValid(key); |
64 return this.storage_.hasOwnProperty(key); | 68 return this.storage_.hasOwnProperty(key); |
65 }, | 69 }, |
66 | 70 |
67 hasChanges: function() { | 71 hasChanges: function() { |
68 return Object.keys(this.changes_).length > 0; | 72 return Object.keys(this.changes_).length > 0; |
69 }, | 73 }, |
70 | 74 |
71 /** | 75 /** |
72 * Applies |changes| to context. Returns Array of changed keys' names. | 76 * Applies |changes| to context. Returns Array of changed keys' names. |
73 */ | 77 */ |
74 applyChanges: function(changes) { | 78 applyChanges: function(changes) { |
75 require(!this.hasChanges(), 'Context has changes.'); | 79 require(!this.hasChanges(), 'Context has changes.'); |
76 Object.keys(changes).forEach(function(key) { | 80 var oldValues = {}; |
81 for (var key in changes) { | |
77 checkKeyIsValid(key); | 82 checkKeyIsValid(key); |
78 checkValueIsValid(changes[key]); | 83 checkValueIsValid(changes[key], 1); |
Denis Kuznetsov (DE-MUC)
2014/06/11 14:29:17
What is the "1"?
dzhioev (left Google)
2014/06/18 14:43:39
Removed.
| |
84 oldValues[key] = this.storage_[key]; | |
79 this.storage_[key] = changes[key]; | 85 this.storage_[key] = changes[key]; |
80 }, this); | 86 } |
87 var observers = this.cloneObservers_(); | |
88 for (var key in changes) { | |
89 if (observers.hasOwnProperty(key)) { | |
90 var keyObservers = observers[key]; | |
91 for (var observerIndex in keyObservers) | |
92 keyObservers[observerIndex](changes[key], oldValues[key], key); | |
93 } | |
94 } | |
81 return Object.keys(changes); | 95 return Object.keys(changes); |
82 }, | 96 }, |
83 | 97 |
84 /** | 98 /** |
85 * Returns changes made on context since previous call. | 99 * Returns changes made on context since previous call. |
86 */ | 100 */ |
87 getChangesAndReset: function() { | 101 getChangesAndReset: function() { |
88 var result = this.changes_; | 102 var result = this.changes_; |
89 this.changes_ = {}; | 103 this.changes_ = {}; |
90 return result; | 104 return result; |
91 } | 105 }, |
106 | |
107 observe: function(key, observer) { | |
Denis Kuznetsov (DE-MUC)
2014/06/11 14:29:17
subscribe/unsubscribe?
"Observe" is the local acti
dzhioev (left Google)
2014/06/18 14:43:39
I used same wording as new JS API use ( http://www
Denis Kuznetsov (DE-MUC)
2014/06/19 19:16:36
Then it's even more relevant : we need to avoid na
dzhioev (left Google)
2014/06/20 07:24:16
OK, renamed to familiar (add/remove)Observer.
| |
108 if (!this.observers_.hasOwnProperty(key)) | |
109 this.observers_[key] = []; | |
110 if (this.observers_[key].indexOf(observer) !== -1) { | |
111 console.warn('Observer already registered.'); | |
112 return; | |
113 } | |
114 this.observers_[key].push(observer); | |
115 }, | |
116 | |
117 unobserve: function(observer) { | |
118 for (var key in this.observers_) { | |
119 var observerIndex = this.observers_[key].indexOf(observer); | |
120 if (observerIndex != -1) | |
121 this.observers_[key].splice(observerIndex, 1); | |
122 } | |
123 }, | |
124 | |
125 cloneObservers_: function() { | |
126 var result = {}; | |
127 for (var key in this.observers_) | |
128 result[key] = this.observers_[key].slice(); | |
129 return result; | |
130 }, | |
131 | |
ygorshenin1
2014/06/11 10:44:00
nit: drop empty line and trailing comma.
dzhioev (left Google)
2014/06/18 14:43:39
Done.
| |
92 }; | 132 }; |
93 | 133 |
94 return { | 134 return { |
95 ScreenContext: ScreenContext | 135 ScreenContext: ScreenContext |
96 }; | 136 }; |
97 }); | 137 }); |
OLD | NEW |