11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright (c) 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/observer_list.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/writeable_pref_store.h" 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/values.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/devtools/devtools_window.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/prefs/browser_ui_prefs_migrator.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/pref_names.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DictionaryPrefStore : public WriteablePrefStore { 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DictionaryPrefStore() : WriteablePrefStore() {} 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Overrides from PrefStore. 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void AddObserver(Observer* observer) OVERRIDE { 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci observers_.AddObserver(observer); 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RemoveObserver(Observer* observer) OVERRIDE { 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci observers_.RemoveObserver(observer); 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool GetValue(const std::string& key, 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Value** result) const OVERRIDE { 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return prefs_.Get(key, result); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Overrides from WriteablePrefStore. 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetValue(const std::string& key, base::Value* value) OVERRIDE { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(value); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs_.Set(key, value); 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReportValueChanged(key); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RemoveValue(const std::string& key) OVERRIDE { 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prefs_.RemovePath(key, NULL)) 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReportValueChanged(key); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool GetMutableValue(const std::string& key, 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Value** result) OVERRIDE { 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return prefs_.Get(key, result); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ReportValueChanged(const std::string& key) OVERRIDE {} 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetValueSilently(const std::string& key, 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Value* value) OVERRIDE { 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTIMPLEMENTED(); 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SignalObservers() { 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FOR_EACH_OBSERVER( 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefStore::Observer, observers_, OnInitializationCompleted(true)); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~DictionaryPrefStore() {} 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::DictionaryValue prefs_; 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ObserverList<PrefStore::Observer, true> observers_; 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(DictionaryPrefStore); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(UIPrefsMigratorTest, MigrateTest) { 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<DictionaryPrefStore> pref_store(new DictionaryPrefStore); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::DictionaryValue> browser_window_placement( 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new base::DictionaryValue); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_window_placement->SetInteger("bottom", 1000); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_store->SetValue(prefs::kBrowserWindowPlacement, 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_window_placement.release()); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::DictionaryValue> browser_window_placement_popup( 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new base::DictionaryValue); 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_window_placement_popup->SetInteger("top", 50); 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_store->SetValue(prefs::kBrowserWindowPlacementPopup, 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_window_placement_popup.release()); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::DictionaryValue> single_app_placement_dict( 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new base::DictionaryValue); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci single_app_placement_dict->SetInteger("right", 986); 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* kAppName("localhost_/some_app.html"); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kOldPathToOneAppDictionary = 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs::kBrowserWindowPlacement + std::string("_") + kAppName; 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_store->SetValue(kOldPathToOneAppDictionary, 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci single_app_placement_dict.release()); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(pref_store->GetValue(kOldPathToOneAppDictionary, NULL)); 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::DictionaryValue> devtools_placement_dict( 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new base::DictionaryValue); 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci devtools_placement_dict->SetInteger("left", 700); 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string kOldPathToDevToolsDictionary = 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs::kBrowserWindowPlacement + std::string("_") + 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DevToolsWindow::kDevToolsApp; 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_store->SetValue(kOldPathToDevToolsDictionary, 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci devtools_placement_dict.release()); 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(pref_store->GetValue(kOldPathToDevToolsDictionary, NULL)); 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_store->AddObserver(new BrowserUIPrefsMigrator(pref_store.get())); 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_store->SignalObservers(); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(pref_store->GetValue(kOldPathToOneAppDictionary, NULL)); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(pref_store->GetValue(kOldPathToDevToolsDictionary, NULL)); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Value* value = NULL; 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue* dictionary = NULL; 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int out_value; 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(pref_store->GetValue(prefs::kBrowserWindowPlacement, &value)); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(value->GetAsDictionary(&dictionary)); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(dictionary->GetInteger("bottom", &out_value)); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1000, out_value); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE( 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_store->GetValue(prefs::kBrowserWindowPlacementPopup, &value)); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(value->GetAsDictionary(&dictionary)); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(dictionary->GetInteger("top", &out_value)); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(50, out_value); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(pref_store->GetValue( 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs::kAppWindowPlacement + std::string(".") + kAppName, &value)); 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(value->GetAsDictionary(&dictionary)); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(dictionary->GetInteger("right", &out_value)); 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(986, out_value); 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(pref_store->GetValue(prefs::kAppWindowPlacement + 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string(".") + 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DevToolsWindow::kDevToolsApp, 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &value)); 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(value->GetAsDictionary(&dictionary)); 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(dictionary->GetInteger("left", &out_value)); 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(700, out_value); 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 142