1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SCREEN_CONTEXT_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SCREEN_CONTEXT_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/linked_ptr.h" 155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/non_thread_safe.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler_utils.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ScreenContext is a key-value storage for values that are shared 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// between C++ and JS sides. Objects of this class should be used in 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the following way: 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// context.SetString("user", "john"); 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// context.SetInteger("image-index", 0); 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// context.SetDouble("zoom", 1.25); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// context.GetChangesAndReset(&dictionary); 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// CallJS("onContextChanged", dictionary); 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ScreenContext memorizes changed key-value pairs and returns them 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// via GetChangesAndReset() method. After call to this method an 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// internal buffer of changes will be cleared. 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ScreenContext : public base::NonThreadSafe { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::string KeyType; 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Value ValueType; 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScreenContext(); 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~ScreenContext(); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SetBoolean(const KeyType& key, bool value); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SetInteger(const KeyType& key, int value); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SetDouble(const KeyType& key, double value); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SetString(const KeyType& key, const std::string& value); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SetString(const KeyType& key, const base::string16& value); 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool SetStringList(const KeyType& key, const StringList& value); 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool SetString16List(const KeyType& key, const String16List& value); 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool GetBoolean(const KeyType& key) const; 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool GetBoolean(const KeyType& key, bool default_value) const; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int GetInteger(const KeyType& key) const; 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int GetInteger(const KeyType& key, int default_value) const; 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double GetDouble(const KeyType& key) const; 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double GetDouble(const KeyType& key, double default_value) const; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string GetString(const KeyType& key) const; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string GetString(const KeyType& key, 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& default_value) const; 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16 GetString16(const KeyType& key) const; 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 GetString16(const KeyType& key, 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::string16& default_value) const; 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch StringList GetStringList(const KeyType& key) const; 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch StringList GetStringList(const KeyType& key, 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const StringList& default_value) const; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch String16List GetString16List(const KeyType& key) const; 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch String16List GetString16List(const KeyType& key, 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const String16List& default_value) const; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns true if context has |key|. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool HasKey(const KeyType& key) const; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns true if there was changes since last call to 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // GetChangesAndReset(). 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool HasChanges() const; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Stores all changes since the last call to the 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // GetChangesAndReset() in |diff|. All previous contents of |diff| 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will be thrown away. 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void GetChangesAndReset(base::DictionaryValue* diff); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Applies changes from |diff| to the context. All keys from |diff| 836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // are stored in |keys|. |keys| argument is optional and can be NULL. 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ApplyChanges(const base::DictionaryValue& diff, 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string>* keys); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns underlying dictionary containing all the stored data. 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue& storage() const { return storage_; } 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool Set(const KeyType& key, base::Value* value); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch template <typename T> 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch T Get(const KeyType& key) const { 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(CalledOnValidThread()); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Value* value; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_key = storage_.Get(key, &value); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(has_key); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) T result; 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!ParseValue(value, &result)) { 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return T(); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return result; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch template <typename T> 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch T Get(const KeyType& key, const T& default_value) const { 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(CalledOnValidThread()); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!HasKey(key)) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return default_value; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return Get<T>(key); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Contains current state of <key, value> map. 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue storage_; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Contains all pending changes. 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue changes_; 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScreenContext); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace chromeos 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_SCREEN_CONTEXT_H_ 127