| OLD | NEW |
| 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 "apps/shell_window_geometry_cache.h" | 5 #include "apps/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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 // static | 43 // static |
| 44 ShellWindowGeometryCache* ShellWindowGeometryCache::Get( | 44 ShellWindowGeometryCache* ShellWindowGeometryCache::Get( |
| 45 content::BrowserContext* context) { | 45 content::BrowserContext* context) { |
| 46 return Factory::GetForContext(context, true /* create */); | 46 return Factory::GetForContext(context, true /* create */); |
| 47 } | 47 } |
| 48 | 48 |
| 49 void ShellWindowGeometryCache::SaveGeometry( | 49 void ShellWindowGeometryCache::SaveGeometry( |
| 50 const std::string& extension_id, | 50 const std::string& extension_id, |
| 51 const std::string& window_id, | 51 const std::string& window_id, |
| 52 const gfx::Rect& bounds, | 52 const gfx::Rect& bounds, |
| 53 const gfx::Rect& screen_bounds, |
| 53 ui::WindowShowState window_state) { | 54 ui::WindowShowState window_state) { |
| 54 ExtensionData& extension_data = cache_[extension_id]; | 55 ExtensionData& extension_data = cache_[extension_id]; |
| 55 | 56 |
| 56 // If we don't have any unsynced changes and this is a duplicate of what's | 57 // If we don't have any unsynced changes and this is a duplicate of what's |
| 57 // already in the cache, just ignore it. | 58 // already in the cache, just ignore it. |
| 58 if (extension_data[window_id].bounds == bounds && | 59 if (extension_data[window_id].bounds == bounds && |
| 59 extension_data[window_id].window_state == window_state && | 60 extension_data[window_id].window_state == window_state && |
| 61 extension_data[window_id].screen_bounds == screen_bounds && |
| 60 !ContainsKey(unsynced_extensions_, extension_id)) | 62 !ContainsKey(unsynced_extensions_, extension_id)) |
| 61 return; | 63 return; |
| 62 | 64 |
| 63 base::Time now = base::Time::Now(); | 65 base::Time now = base::Time::Now(); |
| 64 | 66 |
| 65 extension_data[window_id].bounds = bounds; | 67 extension_data[window_id].bounds = bounds; |
| 68 extension_data[window_id].screen_bounds = screen_bounds; |
| 66 extension_data[window_id].window_state = window_state; | 69 extension_data[window_id].window_state = window_state; |
| 67 extension_data[window_id].last_change = now; | 70 extension_data[window_id].last_change = now; |
| 68 | 71 |
| 69 if (extension_data.size() > kMaxCachedWindows) { | 72 if (extension_data.size() > kMaxCachedWindows) { |
| 70 ExtensionData::iterator oldest = extension_data.end(); | 73 ExtensionData::iterator oldest = extension_data.end(); |
| 71 // Too many windows in the cache, find the oldest one to remove. | 74 // Too many windows in the cache, find the oldest one to remove. |
| 72 for (ExtensionData::iterator it = extension_data.begin(); | 75 for (ExtensionData::iterator it = extension_data.begin(); |
| 73 it != extension_data.end(); ++it) { | 76 it != extension_data.end(); ++it) { |
| 74 // Don't expunge the window that was just added. | 77 // Don't expunge the window that was just added. |
| 75 if (it->first == window_id) continue; | 78 if (it->first == window_id) continue; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 100 for (std::set<std::string>::const_iterator it = tosync.begin(), | 103 for (std::set<std::string>::const_iterator it = tosync.begin(), |
| 101 eit = tosync.end(); it != eit; ++it) { | 104 eit = tosync.end(); it != eit; ++it) { |
| 102 const std::string& extension_id = *it; | 105 const std::string& extension_id = *it; |
| 103 const ExtensionData& extension_data = cache_[extension_id]; | 106 const ExtensionData& extension_data = cache_[extension_id]; |
| 104 | 107 |
| 105 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue); | 108 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue); |
| 106 for (ExtensionData::const_iterator it = extension_data.begin(), | 109 for (ExtensionData::const_iterator it = extension_data.begin(), |
| 107 eit = extension_data.end(); it != eit; ++it) { | 110 eit = extension_data.end(); it != eit; ++it) { |
| 108 base::DictionaryValue* value = new base::DictionaryValue; | 111 base::DictionaryValue* value = new base::DictionaryValue; |
| 109 const gfx::Rect& bounds = it->second.bounds; | 112 const gfx::Rect& bounds = it->second.bounds; |
| 113 const gfx::Rect& screen_bounds = it->second.screen_bounds; |
| 110 value->SetInteger("x", bounds.x()); | 114 value->SetInteger("x", bounds.x()); |
| 111 value->SetInteger("y", bounds.y()); | 115 value->SetInteger("y", bounds.y()); |
| 112 value->SetInteger("w", bounds.width()); | 116 value->SetInteger("w", bounds.width()); |
| 113 value->SetInteger("h", bounds.height()); | 117 value->SetInteger("h", bounds.height()); |
| 118 value->SetInteger("screen_bounds_x", screen_bounds.x()); |
| 119 value->SetInteger("screen_bounds_y", screen_bounds.y()); |
| 120 value->SetInteger("screen_bounds_w", screen_bounds.width()); |
| 121 value->SetInteger("screen_bounds_h", screen_bounds.height()); |
| 114 value->SetInteger("state", it->second.window_state); | 122 value->SetInteger("state", it->second.window_state); |
| 115 value->SetString( | 123 value->SetString( |
| 116 "ts", base::Int64ToString(it->second.last_change.ToInternalValue())); | 124 "ts", base::Int64ToString(it->second.last_change.ToInternalValue())); |
| 117 dict->SetWithoutPathExpansion(it->first, value); | 125 dict->SetWithoutPathExpansion(it->first, value); |
| 118 } | 126 } |
| 119 prefs_->SetGeometryCache(extension_id, dict.Pass()); | 127 prefs_->SetGeometryCache(extension_id, dict.Pass()); |
| 120 } | 128 } |
| 121 } | 129 } |
| 122 | 130 |
| 123 bool ShellWindowGeometryCache::GetGeometry( | 131 bool ShellWindowGeometryCache::GetGeometry( |
| 124 const std::string& extension_id, | 132 const std::string& extension_id, |
| 125 const std::string& window_id, | 133 const std::string& window_id, |
| 126 gfx::Rect* bounds, | 134 gfx::Rect* bounds, |
| 135 gfx::Rect* screen_bounds, |
| 127 ui::WindowShowState* window_state) { | 136 ui::WindowShowState* window_state) { |
| 128 | 137 |
| 129 std::map<std::string, ExtensionData>::const_iterator | 138 std::map<std::string, ExtensionData>::const_iterator |
| 130 extension_data_it = cache_.find(extension_id); | 139 extension_data_it = cache_.find(extension_id); |
| 131 | 140 |
| 132 // Not in the map means loading data for the extension didn't finish yet or | 141 // Not in the map means loading data for the extension didn't finish yet or |
| 133 // the cache was not constructed until after the extension was loaded. | 142 // the cache was not constructed until after the extension was loaded. |
| 134 // Attempt to load from sync to address the latter case. | 143 // Attempt to load from sync to address the latter case. |
| 135 if (extension_data_it == cache_.end()) { | 144 if (extension_data_it == cache_.end()) { |
| 136 LoadGeometryFromStorage(extension_id); | 145 LoadGeometryFromStorage(extension_id); |
| 137 extension_data_it = cache_.find(extension_id); | 146 extension_data_it = cache_.find(extension_id); |
| 138 DCHECK(extension_data_it != cache_.end()); | 147 DCHECK(extension_data_it != cache_.end()); |
| 139 } | 148 } |
| 140 | 149 |
| 141 ExtensionData::const_iterator window_data = extension_data_it->second.find( | 150 ExtensionData::const_iterator window_data = extension_data_it->second.find( |
| 142 window_id); | 151 window_id); |
| 143 | 152 |
| 144 if (window_data == extension_data_it->second.end()) | 153 if (window_data == extension_data_it->second.end()) |
| 145 return false; | 154 return false; |
| 146 | 155 |
| 147 if (bounds) | 156 if (bounds) |
| 148 *bounds = window_data->second.bounds; | 157 *bounds = window_data->second.bounds; |
| 158 if (screen_bounds) |
| 159 *screen_bounds = window_data->second.screen_bounds; |
| 149 if (window_state) | 160 if (window_state) |
| 150 *window_state = window_data->second.window_state; | 161 *window_state = window_data->second.window_state; |
| 151 return true; | 162 return true; |
| 152 } | 163 } |
| 153 | 164 |
| 154 void ShellWindowGeometryCache::Shutdown() { | 165 void ShellWindowGeometryCache::Shutdown() { |
| 155 SyncToStorage(); | 166 SyncToStorage(); |
| 156 } | 167 } |
| 157 | 168 |
| 169 |
| 170 ShellWindowGeometryCache::WindowData::WindowData() |
| 171 : window_state(ui::SHOW_STATE_DEFAULT) { |
| 172 } |
| 173 |
| 174 ShellWindowGeometryCache::WindowData::~WindowData() { |
| 175 } |
| 176 |
| 158 void ShellWindowGeometryCache::Observe( | 177 void ShellWindowGeometryCache::Observe( |
| 159 int type, const content::NotificationSource& source, | 178 int type, const content::NotificationSource& source, |
| 160 const content::NotificationDetails& details) { | 179 const content::NotificationDetails& details) { |
| 161 switch (type) { | 180 switch (type) { |
| 162 case chrome::NOTIFICATION_EXTENSION_LOADED: { | 181 case chrome::NOTIFICATION_EXTENSION_LOADED: { |
| 163 std::string extension_id = | 182 std::string extension_id = |
| 164 content::Details<const extensions::Extension>(details).ptr()->id(); | 183 content::Details<const extensions::Extension>(details).ptr()->id(); |
| 165 LoadGeometryFromStorage(extension_id); | 184 LoadGeometryFromStorage(extension_id); |
| 166 break; | 185 break; |
| 167 } | 186 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 | 224 |
| 206 int i; | 225 int i; |
| 207 if (stored_window->GetInteger("x", &i)) | 226 if (stored_window->GetInteger("x", &i)) |
| 208 window_data.bounds.set_x(i); | 227 window_data.bounds.set_x(i); |
| 209 if (stored_window->GetInteger("y", &i)) | 228 if (stored_window->GetInteger("y", &i)) |
| 210 window_data.bounds.set_y(i); | 229 window_data.bounds.set_y(i); |
| 211 if (stored_window->GetInteger("w", &i)) | 230 if (stored_window->GetInteger("w", &i)) |
| 212 window_data.bounds.set_width(i); | 231 window_data.bounds.set_width(i); |
| 213 if (stored_window->GetInteger("h", &i)) | 232 if (stored_window->GetInteger("h", &i)) |
| 214 window_data.bounds.set_height(i); | 233 window_data.bounds.set_height(i); |
| 234 if (stored_window->GetInteger("screen_bounds_x", &i)) |
| 235 window_data.screen_bounds.set_x(i); |
| 236 if (stored_window->GetInteger("screen_bounds_y", &i)) |
| 237 window_data.screen_bounds.set_y(i); |
| 238 if (stored_window->GetInteger("screen_bounds_w", &i)) |
| 239 window_data.screen_bounds.set_width(i); |
| 240 if (stored_window->GetInteger("screen_bounds_h", &i)) |
| 241 window_data.screen_bounds.set_height(i); |
| 215 if (stored_window->GetInteger("state", &i)) { | 242 if (stored_window->GetInteger("state", &i)) { |
| 216 window_data.window_state = | 243 window_data.window_state = |
| 217 static_cast<ui::WindowShowState>(i); | 244 static_cast<ui::WindowShowState>(i); |
| 218 } | 245 } |
| 219 std::string ts_as_string; | 246 std::string ts_as_string; |
| 220 if (stored_window->GetString("ts", &ts_as_string)) { | 247 if (stored_window->GetString("ts", &ts_as_string)) { |
| 221 int64 ts; | 248 int64 ts; |
| 222 if (base::StringToInt64(ts_as_string, &ts)) { | 249 if (base::StringToInt64(ts_as_string, &ts)) { |
| 223 window_data.last_change = base::Time::FromInternalValue(ts); | 250 window_data.last_change = base::Time::FromInternalValue(ts); |
| 224 } | 251 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 return false; | 299 return false; |
| 273 } | 300 } |
| 274 | 301 |
| 275 content::BrowserContext* | 302 content::BrowserContext* |
| 276 ShellWindowGeometryCache::Factory::GetBrowserContextToUse( | 303 ShellWindowGeometryCache::Factory::GetBrowserContextToUse( |
| 277 content::BrowserContext* context) const { | 304 content::BrowserContext* context) const { |
| 278 return chrome::GetBrowserContextRedirectedInIncognito(context); | 305 return chrome::GetBrowserContextRedirectedInIncognito(context); |
| 279 } | 306 } |
| 280 | 307 |
| 281 } // namespace apps | 308 } // namespace apps |
| OLD | NEW |