- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / resources / chromeos / login / screen_context.js
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
3 // found in the LICENSE file.
4
5 /**
6  * @fileoverview Implementation of ScreenContext class: key-value storage for
7  * values that are shared between C++ and JS sides.
8  */
9 cr.define('login', function() {
10   function require(condition, message) {
11     if (!condition) {
12       throw Error(message);
13     }
14   }
15
16   function checkKeyIsValid(key) {
17     var keyType = typeof key;
18     require(keyType === 'string', 'Invalid type of key: "' + keyType + '".');
19   }
20
21   function checkValueIsValid(value) {
22     var valueType = typeof value;
23     require(['string', 'boolean', 'number'].indexOf(valueType) != -1,
24         'Invalid type of value: "' + valueType + '".');
25   }
26
27   function ScreenContext() {
28     this.storage_ = {};
29     this.changes_ = {};
30   }
31
32   ScreenContext.prototype = {
33     /**
34      * Returns stored value for |key| or |defaultValue| if key not found in
35      * storage. Throws Error if key not found and |defaultValue| omitted.
36      */
37     get: function(key, defaultValue) {
38       checkKeyIsValid(key);
39       if (this.hasKey(key)) {
40         return this.storage_[key];
41       } else if (typeof defaultValue !== 'undefined') {
42         return defaultValue;
43       } else {
44         throw Error('Key "' + key + '" not found.');
45       }
46     },
47
48     /**
49      * Sets |value| for |key|. Returns true if call changes state of context,
50      * false otherwise.
51      */
52     set: function(key, value) {
53       checkKeyIsValid(key);
54       checkValueIsValid(value);
55       if (this.hasKey(key) && this.storage_[key] === value)
56         return false;
57       this.changes_[key] = value;
58       this.storage_[key] = value;
59       return true;
60     },
61
62     hasKey: function(key) {
63       checkKeyIsValid(key);
64       return this.storage_.hasOwnProperty(key);
65     },
66
67     hasChanges: function() {
68       return Object.keys(this.changes_).length > 0;
69     },
70
71     /**
72      * Applies |changes| to context. Returns Array of changed keys' names.
73      */
74     applyChanges: function(changes) {
75       require(!this.hasChanges(), 'Context has changes.');
76       Object.keys(changes).forEach(function(key) {
77         checkKeyIsValid(key);
78         checkValueIsValid(changes[key]);
79         this.storage_[key] = changes[key];
80       }, this);
81       return Object.keys(changes);
82     },
83
84     /**
85      * Returns changes made on context since previous call.
86      */
87     getChangesAndReset: function() {
88       var result = this.changes_;
89       this.changes_ = {};
90       return result;
91     }
92   };
93
94   return {
95     ScreenContext: ScreenContext
96   };
97 });