OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2014 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 #include "chrome/browser/ui/zoom/zoom_level_prefs_store_impl.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/files/file_path.h" | |
9 #include "base/prefs/json_pref_store.h" | |
10 #include "base/prefs/pref_filter.h" | |
11 #include "base/prefs/scoped_user_pref_update.h" | |
12 #include "base/values.h" | |
13 #include "chrome/browser/prefs/pref_service_syncable.h" | |
14 #include "chrome/browser/prefs/pref_service_syncable_factory.h" | |
15 #include "chrome/common/chrome_constants.h" | |
16 #include "chrome/common/pref_names.h" | |
17 #include "components/pref_registry/pref_registry_syncable.h" | |
18 #include "content/public/browser/browser_thread.h" | |
19 #include "content/public/browser/host_zoom_map.h" | |
20 #include "content/public/common/page_zoom.h" | |
21 | |
22 namespace browser { | |
wjmaclean
2014/08/14 19:42:17
Ooops, this needs to be chrome too ...
| |
23 | |
24 ZoomLevelPrefsStoreImpl::ZoomLevelPrefsStoreImpl() | |
25 : host_zoom_map_(NULL) {} | |
26 | |
27 void ZoomLevelPrefsStoreImpl::InitHostZoomMap( | |
28 const base::FilePath& file_path, | |
29 content::HostZoomMap* host_zoom_map) { | |
30 DCHECK(!file_path.empty()); | |
31 DCHECK(host_zoom_map); | |
32 host_zoom_map_ = host_zoom_map; | |
33 | |
34 base::FilePath file_name( | |
35 file_path.Append(chrome::kZoomLevelPreferencesFilename)); | |
36 zoom_level_prefs_ = new JsonPrefStore( | |
37 file_name, | |
38 JsonPrefStore::GetTaskRunnerForFile( | |
39 file_name, content::BrowserThread::GetBlockingPool()), | |
40 scoped_ptr<PrefFilter>()); | |
41 scoped_refptr<user_prefs::PrefRegistrySyncable> registry = | |
42 new user_prefs::PrefRegistrySyncable(); | |
43 registry->RegisterDictionaryPref( | |
44 prefs::kPerHostZoomLevels, | |
45 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | |
46 | |
47 PrefServiceSyncableFactory factory; | |
48 factory.set_user_prefs(zoom_level_prefs_); | |
49 factory.set_async(true); | |
50 | |
51 zoom_level_prefs_->AddObserver(this); | |
52 | |
53 pref_service_ = factory.CreateSyncable(registry.get()); | |
54 } | |
55 | |
56 PrefService* ZoomLevelPrefsStoreImpl::GetPrefs() { | |
57 return pref_service_.get(); | |
58 } | |
59 | |
60 void ZoomLevelPrefsStoreImpl::OnPrefValueChanged(const std::string& key) { | |
61 } | |
62 | |
63 void ZoomLevelPrefsStoreImpl::OnInitializationCompleted(bool succeeded) { | |
64 if (!succeeded) { | |
65 return; | |
66 } | |
67 const base::DictionaryValue* host_zoom_dictionary = | |
68 pref_service_->GetDictionary(prefs::kPerHostZoomLevels); | |
69 if (host_zoom_dictionary != NULL) { | |
70 std::vector<std::string> keys_to_remove; | |
71 for (base::DictionaryValue::Iterator i(*host_zoom_dictionary); | |
72 !i.IsAtEnd(); | |
73 i.Advance()) { | |
74 const std::string& host(i.key()); | |
75 double zoom_level = 0; | |
76 | |
77 bool success = i.value().GetAsDouble(&zoom_level); | |
78 DCHECK(success); | |
79 | |
80 if (host.empty() || | |
81 content::ZoomValuesEqual( | |
82 zoom_level, host_zoom_map_->GetDefaultZoomLevel())) { | |
83 keys_to_remove.push_back(host); | |
84 continue; | |
85 } | |
86 | |
87 host_zoom_map_->SetZoomLevelForHost(host, zoom_level); | |
88 } | |
89 | |
90 // Sanitize prefs to remove entries that match the default zoom level and/or | |
91 // have an empty host. | |
92 DictionaryPrefUpdate update(pref_service_.get(), prefs::kPerHostZoomLevels); | |
93 base::DictionaryValue* host_zoom_dictionary = update.Get(); | |
94 for (std::vector<std::string>::const_iterator it = keys_to_remove.begin(); | |
95 it != keys_to_remove.end(); ++it) { | |
96 host_zoom_dictionary->RemoveWithoutPathExpansion(*it, NULL); | |
97 } | |
98 } | |
99 zoom_subscription_ = host_zoom_map_->AddZoomLevelChangedCallback( | |
100 base::Bind(&ZoomLevelPrefsStoreImpl::OnZoomLevelChanged, | |
101 base::Unretained(this))); | |
102 } | |
103 | |
104 void ZoomLevelPrefsStoreImpl::OnZoomLevelChanged( | |
105 const content::HostZoomMap::ZoomLevelChange& change) { | |
106 if (change.mode != content::HostZoomMap::ZOOM_CHANGED_FOR_HOST) | |
107 return; | |
108 double level = change.zoom_level; | |
109 DictionaryPrefUpdate update(pref_service_.get(), prefs::kPerHostZoomLevels); | |
110 base::DictionaryValue* host_zoom_dictionary = update.Get(); | |
111 if (content::ZoomValuesEqual(level, host_zoom_map_->GetDefaultZoomLevel())) | |
112 host_zoom_dictionary->RemoveWithoutPathExpansion(change.host, NULL); | |
113 else | |
114 host_zoom_dictionary->SetDoubleWithoutPathExpansion(change.host, level); | |
115 } | |
116 | |
117 ZoomLevelPrefsStoreImpl::~ZoomLevelPrefsStoreImpl() { | |
118 zoom_subscription_.reset(); | |
119 if (zoom_level_prefs_) | |
120 zoom_level_prefs_->RemoveObserver(this); | |
121 } | |
122 | |
123 } // namespace browser | |
OLD | NEW |