Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(557)

Side by Side Diff: chrome/browser/extensions/shell_window_geometry_cache.cc

Issue 14031021: Save and restore State for ShellWindows, including panels (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/shell_window_geometry_cache.h" 5 #include "chrome/browser/extensions/shell_window_geometry_cache.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "chrome/browser/extensions/extension_prefs.h" 10 #include "chrome/browser/extensions/extension_prefs.h"
(...skipping 22 matching lines...) Expand all
33 content::Source<Profile>(profile)); 33 content::Source<Profile>(profile));
34 } 34 }
35 35
36 ShellWindowGeometryCache::~ShellWindowGeometryCache() { 36 ShellWindowGeometryCache::~ShellWindowGeometryCache() {
37 SyncToStorage(); 37 SyncToStorage();
38 } 38 }
39 39
40 void ShellWindowGeometryCache::SaveGeometry( 40 void ShellWindowGeometryCache::SaveGeometry(
41 const std::string& extension_id, 41 const std::string& extension_id,
42 const std::string& window_id, 42 const std::string& window_id,
43 const gfx::Rect& bounds) { 43 const gfx::Rect& bounds,
44 ui::WindowShowState window_state) {
44 ExtensionData& extension_data = cache_[extension_id]; 45 ExtensionData& extension_data = cache_[extension_id];
45 46
46 // If we don't have any unsynced changes and this is a duplicate of what's 47 // If we don't have any unsynced changes and this is a duplicate of what's
47 // already in the cache, just ignore it. 48 // already in the cache, just ignore it.
48 if (extension_data[window_id].bounds == bounds && 49 if (extension_data[window_id].bounds == bounds &&
50 extension_data[window_id].window_state == window_state &&
49 !ContainsKey(unsynced_extensions_, extension_id)) 51 !ContainsKey(unsynced_extensions_, extension_id))
50 return; 52 return;
51 53
52 base::Time now = base::Time::Now(); 54 base::Time now = base::Time::Now();
53 55
54 extension_data[window_id].bounds = bounds; 56 extension_data[window_id].bounds = bounds;
57 extension_data[window_id].window_state = window_state;
55 extension_data[window_id].last_change = now; 58 extension_data[window_id].last_change = now;
56 59
57 if (extension_data.size() > kMaxCachedWindows) { 60 if (extension_data.size() > kMaxCachedWindows) {
58 ExtensionData::iterator oldest = extension_data.end(); 61 ExtensionData::iterator oldest = extension_data.end();
59 // Too many windows in the cache, find the oldest one to remove. 62 // Too many windows in the cache, find the oldest one to remove.
60 for (ExtensionData::iterator it = extension_data.begin(); 63 for (ExtensionData::iterator it = extension_data.begin();
61 it != extension_data.end(); ++it) { 64 it != extension_data.end(); ++it) {
62 // Don't expunge the window that was just added. 65 // Don't expunge the window that was just added.
63 if (it->first == window_id) continue; 66 if (it->first == window_id) continue;
64 67
(...skipping 27 matching lines...) Expand all
92 95
93 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue); 96 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
94 for (ExtensionData::const_iterator it = extension_data.begin(), 97 for (ExtensionData::const_iterator it = extension_data.begin(),
95 eit = extension_data.end(); it != eit; ++it) { 98 eit = extension_data.end(); it != eit; ++it) {
96 base::DictionaryValue* value = new base::DictionaryValue; 99 base::DictionaryValue* value = new base::DictionaryValue;
97 const gfx::Rect& bounds = it->second.bounds; 100 const gfx::Rect& bounds = it->second.bounds;
98 value->SetInteger("x", bounds.x()); 101 value->SetInteger("x", bounds.x());
99 value->SetInteger("y", bounds.y()); 102 value->SetInteger("y", bounds.y());
100 value->SetInteger("w", bounds.width()); 103 value->SetInteger("w", bounds.width());
101 value->SetInteger("h", bounds.height()); 104 value->SetInteger("h", bounds.height());
105 value->SetInteger("state", it->second.window_state);
102 value->SetString( 106 value->SetString(
103 "ts", base::Int64ToString(it->second.last_change.ToInternalValue())); 107 "ts", base::Int64ToString(it->second.last_change.ToInternalValue()));
104 dict->SetWithoutPathExpansion(it->first, value); 108 dict->SetWithoutPathExpansion(it->first, value);
105 } 109 }
106 prefs_->SetGeometryCache(extension_id, dict.Pass()); 110 prefs_->SetGeometryCache(extension_id, dict.Pass());
107 } 111 }
108 } 112 }
109 113
110 bool ShellWindowGeometryCache::GetGeometry( 114 bool ShellWindowGeometryCache::GetGeometry(
111 const std::string& extension_id, 115 const std::string& extension_id,
112 const std::string& window_id, 116 const std::string& window_id,
113 gfx::Rect* bounds) const { 117 gfx::Rect* bounds,
118 ui::WindowShowState* window_state) const {
114 119
115 std::map<std::string, ExtensionData>::const_iterator 120 std::map<std::string, ExtensionData>::const_iterator
116 extension_data_it = cache_.find(extension_id); 121 extension_data_it = cache_.find(extension_id);
117 122
118 // Not in the map means loading data for the extension didn't finish yet. 123 // Not in the map means loading data for the extension didn't finish yet.
119 if (extension_data_it == cache_.end()) 124 if (extension_data_it == cache_.end())
120 return false; 125 return false;
121 126
122 ExtensionData::const_iterator window_data = extension_data_it->second.find( 127 ExtensionData::const_iterator window_data = extension_data_it->second.find(
123 window_id); 128 window_id);
124 129
125 if (window_data == extension_data_it->second.end()) 130 if (window_data == extension_data_it->second.end())
126 return false; 131 return false;
127 132
128 *bounds = window_data->second.bounds; 133 if (bounds)
134 *bounds = window_data->second.bounds;
135 if (window_state)
136 *window_state = window_data->second.window_state;
129 return true; 137 return true;
130 } 138 }
131 139
132 void ShellWindowGeometryCache::Observe( 140 void ShellWindowGeometryCache::Observe(
133 int type, const content::NotificationSource& source, 141 int type, const content::NotificationSource& source,
134 const content::NotificationDetails& details) { 142 const content::NotificationDetails& details) {
135 switch (type) { 143 switch (type) {
136 case chrome::NOTIFICATION_EXTENSION_LOADED: { 144 case chrome::NOTIFICATION_EXTENSION_LOADED: {
137 std::string extension_id = 145 std::string extension_id =
138 content::Details<const Extension>(details).ptr()->id(); 146 content::Details<const Extension>(details).ptr()->id();
(...skipping 25 matching lines...) Expand all
164 prefs_->GetGeometryCache(extension_id); 172 prefs_->GetGeometryCache(extension_id);
165 if (!stored_windows) 173 if (!stored_windows)
166 return; 174 return;
167 175
168 for (base::DictionaryValue::Iterator it(*stored_windows); !it.IsAtEnd(); 176 for (base::DictionaryValue::Iterator it(*stored_windows); !it.IsAtEnd();
169 it.Advance()) { 177 it.Advance()) {
170 // If the cache already contains geometry for this window, don't 178 // If the cache already contains geometry for this window, don't
171 // overwrite that information since it is probably the result of an 179 // overwrite that information since it is probably the result of an
172 // application starting up very quickly. 180 // application starting up very quickly.
173 const std::string& window_id = it.key(); 181 const std::string& window_id = it.key();
174 ExtensionData::iterator cached_window = 182 ExtensionData::iterator cached_window = extension_data.find(window_id);
175 extension_data.find(window_id);
176 if (cached_window == extension_data.end()) { 183 if (cached_window == extension_data.end()) {
177 const base::DictionaryValue* stored_window; 184 const base::DictionaryValue* stored_window;
178 if (it.value().GetAsDictionary(&stored_window)) { 185 if (it.value().GetAsDictionary(&stored_window)) {
179 WindowData& window_data = extension_data[it.key()]; 186 WindowData& window_data = extension_data[it.key()];
180 187
181 int i; 188 int i;
182 if (stored_window->GetInteger("x", &i)) 189 if (stored_window->GetInteger("x", &i))
183 window_data.bounds.set_x(i); 190 window_data.bounds.set_x(i);
184 if (stored_window->GetInteger("y", &i)) 191 if (stored_window->GetInteger("y", &i))
185 window_data.bounds.set_y(i); 192 window_data.bounds.set_y(i);
186 if (stored_window->GetInteger("w", &i)) 193 if (stored_window->GetInteger("w", &i))
187 window_data.bounds.set_width(i); 194 window_data.bounds.set_width(i);
188 if (stored_window->GetInteger("h", &i)) 195 if (stored_window->GetInteger("h", &i))
189 window_data.bounds.set_height(i); 196 window_data.bounds.set_height(i);
197 if (stored_window->GetInteger("state", &i)) {
198 window_data.window_state =
199 static_cast<ui::WindowShowState>(i);
200 }
190 std::string ts_as_string; 201 std::string ts_as_string;
191 if (stored_window->GetString("ts", &ts_as_string)) { 202 if (stored_window->GetString("ts", &ts_as_string)) {
192 int64 ts; 203 int64 ts;
193 if (base::StringToInt64(ts_as_string, &ts)) { 204 if (base::StringToInt64(ts_as_string, &ts)) {
194 window_data.last_change = base::Time::FromInternalValue(ts); 205 window_data.last_change = base::Time::FromInternalValue(ts);
195 } 206 }
196 } 207 }
197 } 208 }
198 } 209 }
199 } 210 }
200 } 211 }
201 212
202 void ShellWindowGeometryCache::OnExtensionUnloaded( 213 void ShellWindowGeometryCache::OnExtensionUnloaded(
203 const std::string& extension_id) { 214 const std::string& extension_id) {
204 SyncToStorage(); 215 SyncToStorage();
205 cache_.erase(extension_id); 216 cache_.erase(extension_id);
206 } 217 }
207 218
208 } // namespace extensions 219 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698