Index: chrome/browser/resources/chromeos/login/screen_context.js |
diff --git a/chrome/browser/resources/chromeos/login/screen_context.js b/chrome/browser/resources/chromeos/login/screen_context.js |
index 6a014a4828365e61576db7ad3f07c5982af7ed6c..083b90c68258e9d1268102676a6519776e0593ea 100644 |
--- a/chrome/browser/resources/chromeos/login/screen_context.js |
+++ b/chrome/browser/resources/chromeos/login/screen_context.js |
@@ -7,6 +7,8 @@ |
* values that are shared between C++ and JS sides. |
*/ |
cr.define('login', function() { |
+ 'use strict'; |
+ |
function require(condition, message) { |
if (!condition) { |
throw Error(message); |
@@ -27,6 +29,7 @@ cr.define('login', function() { |
function ScreenContext() { |
this.storage_ = {}; |
this.changes_ = {}; |
+ this.observers_ = {}; |
} |
ScreenContext.prototype = { |
@@ -73,11 +76,21 @@ cr.define('login', function() { |
*/ |
applyChanges: function(changes) { |
require(!this.hasChanges(), 'Context has changes.'); |
- Object.keys(changes).forEach(function(key) { |
+ var oldValues = {}; |
+ for (var key in changes) { |
checkKeyIsValid(key); |
checkValueIsValid(changes[key]); |
+ oldValues[key] = this.storage_[key]; |
this.storage_[key] = changes[key]; |
- }, this); |
+ } |
+ var observers = this.cloneObservers_(); |
+ for (var key in changes) { |
+ if (observers.hasOwnProperty(key)) { |
+ var keyObservers = observers[key]; |
+ for (var observerIndex in keyObservers) |
+ keyObservers[observerIndex](changes[key], oldValues[key], key); |
+ } |
+ } |
return Object.keys(changes); |
}, |
@@ -88,6 +101,35 @@ cr.define('login', function() { |
var result = this.changes_; |
this.changes_ = {}; |
return result; |
+ }, |
+ |
+ addObserver: function(key, observer) { |
+ if (!this.observers_.hasOwnProperty(key)) |
+ this.observers_[key] = []; |
+ if (this.observers_[key].indexOf(observer) !== -1) { |
+ console.warn('Observer already registered.'); |
+ return; |
+ } |
+ this.observers_[key].push(observer); |
+ }, |
+ |
+ removeObserver: function(observer) { |
+ for (var key in this.observers_) { |
+ var observerIndex = this.observers_[key].indexOf(observer); |
+ if (observerIndex != -1) |
+ this.observers_[key].splice(observerIndex, 1); |
+ } |
+ }, |
+ |
+ /** |
+ * Creates deep copy of observers lists. |
+ * @private |
+ */ |
+ cloneObservers_: function() { |
+ var result = {}; |
+ for (var key in this.observers_) |
+ result[key] = this.observers_[key].slice(); |
+ return result; |
} |
}; |