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 "chrome/browser/themes/theme_service.h" | 5 #include "chrome/browser/themes/theme_service.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/ref_counted_memory.h" | 8 #include "base/memory/ref_counted_memory.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
79 } | 79 } |
80 | 80 |
81 } // namespace | 81 } // namespace |
82 | 82 |
83 ThemeService::ThemeService() | 83 ThemeService::ThemeService() |
84 : ready_(false), | 84 : ready_(false), |
85 rb_(ResourceBundle::GetSharedInstance()), | 85 rb_(ResourceBundle::GetSharedInstance()), |
86 profile_(NULL), | 86 profile_(NULL), |
87 installed_pending_load_id_(kDefaultThemeID), | 87 installed_pending_load_id_(kDefaultThemeID), |
88 number_of_infobars_(0), | 88 number_of_infobars_(0), |
89 extension_registry_(NULL), | |
89 weak_ptr_factory_(this) { | 90 weak_ptr_factory_(this) { |
90 } | 91 } |
91 | 92 |
92 ThemeService::~ThemeService() { | 93 ThemeService::~ThemeService() { |
93 FreePlatformCaches(); | 94 FreePlatformCaches(); |
94 } | 95 } |
95 | 96 |
96 void ThemeService::Init(Profile* profile) { | 97 void ThemeService::Init(Profile* profile) { |
97 DCHECK(CalledOnValidThread()); | 98 DCHECK(CalledOnValidThread()); |
98 profile_ = profile; | 99 profile_ = profile; |
99 | 100 |
100 LoadThemePrefs(); | 101 LoadThemePrefs(); |
101 | 102 |
103 extension_registry_ = extensions::ExtensionRegistry::Get(profile_); | |
104 | |
102 registrar_.Add(this, | 105 registrar_.Add(this, |
103 extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED, | 106 extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED, |
104 content::Source<Profile>(profile_)); | 107 content::Source<Profile>(profile_)); |
105 | 108 |
106 theme_syncable_service_.reset(new ThemeSyncableService(profile_, this)); | 109 theme_syncable_service_.reset(new ThemeSyncableService(profile_, this)); |
107 } | 110 } |
108 | 111 |
109 gfx::Image ThemeService::GetImageNamed(int id) const { | 112 gfx::Image ThemeService::GetImageNamed(int id) const { |
110 DCHECK(CalledOnValidThread()); | 113 DCHECK(CalledOnValidThread()); |
111 | 114 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
245 const content::NotificationSource& source, | 248 const content::NotificationSource& source, |
246 const content::NotificationDetails& details) { | 249 const content::NotificationDetails& details) { |
247 using content::Details; | 250 using content::Details; |
248 switch (type) { | 251 switch (type) { |
249 case extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED: | 252 case extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED: |
250 registrar_.Remove(this, | 253 registrar_.Remove(this, |
251 extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED, | 254 extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED, |
252 content::Source<Profile>(profile_)); | 255 content::Source<Profile>(profile_)); |
253 OnExtensionServiceReady(); | 256 OnExtensionServiceReady(); |
254 break; | 257 break; |
255 case extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED: { | |
256 // The theme may be initially disabled. Wait till it is loaded (if ever). | |
257 Details<const extensions::InstalledExtensionInfo> installed_details( | |
258 details); | |
259 if (installed_details->extension->is_theme()) | |
260 installed_pending_load_id_ = installed_details->extension->id(); | |
261 break; | |
262 } | |
263 case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { | |
264 const Extension* extension = Details<const Extension>(details).ptr(); | |
265 if (extension->is_theme() && | |
266 installed_pending_load_id_ != kDefaultThemeID && | |
267 installed_pending_load_id_ == extension->id()) { | |
268 SetTheme(extension); | |
269 } | |
270 installed_pending_load_id_ = kDefaultThemeID; | |
271 break; | |
272 } | |
273 case extensions::NOTIFICATION_EXTENSION_ENABLED: { | 258 case extensions::NOTIFICATION_EXTENSION_ENABLED: { |
274 const Extension* extension = Details<const Extension>(details).ptr(); | 259 const Extension* extension = Details<const Extension>(details).ptr(); |
275 if (extension->is_theme()) | 260 if (extension->is_theme()) |
276 SetTheme(extension); | 261 SetTheme(extension); |
277 break; | 262 break; |
278 } | 263 } |
279 case extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: { | |
280 Details<const UnloadedExtensionInfo> unloaded_details(details); | |
281 if (unloaded_details->reason != UnloadedExtensionInfo::REASON_UPDATE && | |
282 unloaded_details->extension->is_theme() && | |
283 unloaded_details->extension->id() == GetThemeID()) { | |
284 UseDefaultTheme(); | |
285 } | |
286 break; | |
287 } | |
288 } | 264 } |
289 } | 265 } |
290 | 266 |
267 void ThemeService::OnExtensionLoaded(content::BrowserContext* browser_context, | |
268 const extensions::Extension* extension) { | |
269 if (extension->is_theme() && installed_pending_load_id_ != kDefaultThemeID && | |
Bernhard Bauer
2014/10/15 12:32:45
Please put each of these conditions on a separate
Jitu( very slow this week)
2014/10/15 13:01:12
Done.
| |
270 installed_pending_load_id_ == extension->id()) { | |
271 SetTheme(extension); | |
272 } | |
273 installed_pending_load_id_ = kDefaultThemeID; | |
274 } | |
275 | |
276 void ThemeService::OnExtensionUnloaded( | |
277 content::BrowserContext* browser_context, | |
278 const extensions::Extension* extension, | |
279 extensions::UnloadedExtensionInfo::Reason reason) { | |
280 if (reason != UnloadedExtensionInfo::REASON_UPDATE && extension->is_theme() && | |
281 extension->id() == GetThemeID()) { | |
282 UseDefaultTheme(); | |
283 } | |
284 } | |
285 | |
286 void ThemeService::OnExtensionWillBeInstalled( | |
287 content::BrowserContext* browser_context, | |
288 const extensions::Extension* extension, | |
289 bool is_update, | |
290 bool from_ephemeral, | |
291 const std::string& old_name) { | |
292 // The theme may be initially disabled. Wait till it is loaded (if ever). | |
293 if (extension->is_theme()) | |
294 installed_pending_load_id_ = extension->id(); | |
295 } | |
296 | |
297 void ThemeService::Shutdown() { | |
298 if (extension_registry_) { | |
Bernhard Bauer
2014/10/15 12:32:45
When is this NULL?
Jitu( very slow this week)
2014/10/15 13:01:12
This was added for safer side.
Let say we created
Bernhard Bauer
2014/10/15 13:21:04
That would be a bug. If we silently accept NULL he
| |
299 extension_registry_->RemoveObserver(this); | |
300 extension_registry_ = NULL; | |
301 } | |
302 } | |
303 | |
291 void ThemeService::SetTheme(const Extension* extension) { | 304 void ThemeService::SetTheme(const Extension* extension) { |
292 DCHECK(extension->is_theme()); | 305 DCHECK(extension->is_theme()); |
293 ExtensionService* service = | 306 ExtensionService* service = |
294 extensions::ExtensionSystem::Get(profile_)->extension_service(); | 307 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
295 if (!service->IsExtensionEnabled(extension->id())) { | 308 if (!service->IsExtensionEnabled(extension->id())) { |
296 // |extension| is disabled when reverting to the previous theme via an | 309 // |extension| is disabled when reverting to the previous theme via an |
297 // infobar. | 310 // infobar. |
298 service->EnableExtension(extension->id()); | 311 service->EnableExtension(extension->id()); |
299 // Enabling the extension will call back to SetTheme(). | 312 // Enabling the extension will call back to SetTheme(). |
300 return; | 313 return; |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
498 // If the ThemeService is not ready yet, the custom theme data pack needs to | 511 // If the ThemeService is not ready yet, the custom theme data pack needs to |
499 // be recreated from the extension. | 512 // be recreated from the extension. |
500 MigrateTheme(); | 513 MigrateTheme(); |
501 set_ready(); | 514 set_ready(); |
502 | 515 |
503 // Send notification in case anyone requested data and cached it when the | 516 // Send notification in case anyone requested data and cached it when the |
504 // theme service was not ready yet. | 517 // theme service was not ready yet. |
505 NotifyThemeChanged(); | 518 NotifyThemeChanged(); |
506 } | 519 } |
507 | 520 |
508 registrar_.Add( | 521 extension_registry_->AddObserver(this); |
509 this, | |
510 extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED, | |
511 content::Source<Profile>(profile_)); | |
512 registrar_.Add(this, | |
513 extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, | |
514 content::Source<Profile>(profile_)); | |
515 registrar_.Add(this, | 522 registrar_.Add(this, |
516 extensions::NOTIFICATION_EXTENSION_ENABLED, | 523 extensions::NOTIFICATION_EXTENSION_ENABLED, |
517 content::Source<Profile>(profile_)); | 524 content::Source<Profile>(profile_)); |
518 registrar_.Add(this, | |
519 extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, | |
520 content::Source<Profile>(profile_)); | |
521 | 525 |
522 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, | 526 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, |
523 base::Bind(&ThemeService::RemoveUnusedThemes, | 527 base::Bind(&ThemeService::RemoveUnusedThemes, |
524 weak_ptr_factory_.GetWeakPtr(), | 528 weak_ptr_factory_.GetWeakPtr(), |
525 false), | 529 false), |
526 base::TimeDelta::FromSeconds(kRemoveUnusedThemesStartupDelay)); | 530 base::TimeDelta::FromSeconds(kRemoveUnusedThemesStartupDelay)); |
527 } | 531 } |
528 | 532 |
529 void ThemeService::MigrateTheme() { | 533 void ThemeService::MigrateTheme() { |
530 // TODO(erg): We need to pop up a dialog informing the user that their | 534 // TODO(erg): We need to pop up a dialog informing the user that their |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
603 void ThemeService::OnInfobarDestroyed() { | 607 void ThemeService::OnInfobarDestroyed() { |
604 number_of_infobars_--; | 608 number_of_infobars_--; |
605 | 609 |
606 if (number_of_infobars_ == 0) | 610 if (number_of_infobars_ == 0) |
607 RemoveUnusedThemes(false); | 611 RemoveUnusedThemes(false); |
608 } | 612 } |
609 | 613 |
610 ThemeSyncableService* ThemeService::GetThemeSyncableService() const { | 614 ThemeSyncableService* ThemeService::GetThemeSyncableService() const { |
611 return theme_syncable_service_.get(); | 615 return theme_syncable_service_.get(); |
612 } | 616 } |
OLD | NEW |