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/extensions/extension_service.h" | 5 #include "chrome/browser/extensions/extension_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
343 | 343 |
344 // Figure out if extension installation should be enabled. | 344 // Figure out if extension installation should be enabled. |
345 if (command_line->HasSwitch(switches::kDisableExtensions)) { | 345 if (command_line->HasSwitch(switches::kDisableExtensions)) { |
346 extensions_enabled_ = false; | 346 extensions_enabled_ = false; |
347 } else if (profile->GetPrefs()->GetBoolean(prefs::kDisableExtensions)) { | 347 } else if (profile->GetPrefs()->GetBoolean(prefs::kDisableExtensions)) { |
348 extensions_enabled_ = false; | 348 extensions_enabled_ = false; |
349 } | 349 } |
350 | 350 |
351 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, | 351 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, |
352 content::NotificationService::AllBrowserContextsAndSources()); | 352 content::NotificationService::AllBrowserContextsAndSources()); |
353 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, | |
354 content::NotificationService::AllBrowserContextsAndSources()); | |
355 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, | |
356 content::NotificationService::AllBrowserContextsAndSources()); | |
353 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED, | 357 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED, |
354 content::NotificationService::AllBrowserContextsAndSources()); | 358 content::NotificationService::AllBrowserContextsAndSources()); |
355 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, | 359 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, |
356 content::NotificationService::AllBrowserContextsAndSources()); | 360 content::NotificationService::AllBrowserContextsAndSources()); |
357 pref_change_registrar_.Init(profile->GetPrefs()); | 361 pref_change_registrar_.Init(profile->GetPrefs()); |
358 pref_change_registrar_.Add(prefs::kExtensionInstallAllowList, this); | 362 pref_change_registrar_.Add(prefs::kExtensionInstallAllowList, this); |
359 pref_change_registrar_.Add(prefs::kExtensionInstallDenyList, this); | 363 pref_change_registrar_.Add(prefs::kExtensionInstallDenyList, this); |
360 | 364 |
361 // Set up the ExtensionUpdater | 365 // Set up the ExtensionUpdater |
362 if (autoupdate_enabled) { | 366 if (autoupdate_enabled) { |
(...skipping 1488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1851 | 1855 |
1852 void ExtensionService::UnloadAllExtensions() { | 1856 void ExtensionService::UnloadAllExtensions() { |
1853 profile_->GetExtensionSpecialStoragePolicy()-> | 1857 profile_->GetExtensionSpecialStoragePolicy()-> |
1854 RevokeRightsForAllExtensions(); | 1858 RevokeRightsForAllExtensions(); |
1855 | 1859 |
1856 extensions_.Clear(); | 1860 extensions_.Clear(); |
1857 disabled_extensions_.Clear(); | 1861 disabled_extensions_.Clear(); |
1858 terminated_extensions_.Clear(); | 1862 terminated_extensions_.Clear(); |
1859 extension_runtime_data_.clear(); | 1863 extension_runtime_data_.clear(); |
1860 | 1864 |
1865 STLDeleteValues(&page_actions_); | |
Jeffrey Yasskin
2012/09/14 19:18:33
Need to double-check if there are other places tha
| |
1866 STLDeleteValues(&browser_actions_); | |
1867 STLDeleteValues(&script_badges_); | |
1868 | |
1861 // TODO(erikkay) should there be a notification for this? We can't use | 1869 // TODO(erikkay) should there be a notification for this? We can't use |
1862 // EXTENSION_UNLOADED since that implies that the extension has been disabled | 1870 // EXTENSION_UNLOADED since that implies that the extension has been disabled |
1863 // or uninstalled, and UnloadAll is just part of shutdown. | 1871 // or uninstalled, and UnloadAll is just part of shutdown. |
1864 } | 1872 } |
1865 | 1873 |
1866 void ExtensionService::ReloadExtensions() { | 1874 void ExtensionService::ReloadExtensions() { |
1867 UnloadAllExtensions(); | 1875 UnloadAllExtensions(); |
1868 component_loader_->LoadAll(); | 1876 component_loader_->LoadAll(); |
1869 extensions::InstalledLoader(this).LoadAllExtensions(); | 1877 extensions::InstalledLoader(this).LoadAllExtensions(); |
1870 } | 1878 } |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2285 gfx::Image ExtensionService::GetOmniboxIcon( | 2293 gfx::Image ExtensionService::GetOmniboxIcon( |
2286 const std::string& extension_id) { | 2294 const std::string& extension_id) { |
2287 return gfx::Image(omnibox_icon_manager_.GetIcon(extension_id)); | 2295 return gfx::Image(omnibox_icon_manager_.GetIcon(extension_id)); |
2288 } | 2296 } |
2289 | 2297 |
2290 gfx::Image ExtensionService::GetOmniboxPopupIcon( | 2298 gfx::Image ExtensionService::GetOmniboxPopupIcon( |
2291 const std::string& extension_id) { | 2299 const std::string& extension_id) { |
2292 return gfx::Image(omnibox_popup_icon_manager_.GetIcon(extension_id)); | 2300 return gfx::Image(omnibox_popup_icon_manager_.GetIcon(extension_id)); |
2293 } | 2301 } |
2294 | 2302 |
2303 ExtensionAction* ExtensionService::GetPageAction( | |
2304 const Extension& extension) const { | |
2305 return ContainsKey(page_actions_, extension.id()) ? | |
2306 page_actions_.find(extension.id())->second : NULL; | |
2307 } | |
2308 ExtensionAction* ExtensionService::GetBrowserAction( | |
2309 const Extension& extension) const { | |
2310 return ContainsKey(browser_actions_, extension.id()) ? | |
2311 browser_actions_.find(extension.id())->second : NULL; | |
2312 } | |
2313 ExtensionAction* ExtensionService::GetScriptBadge( | |
2314 const Extension& extension) const { | |
2315 return ContainsKey(script_badges_, extension.id()) ? | |
2316 script_badges_.find(extension.id())->second : NULL; | |
2317 } | |
2318 | |
2295 bool ExtensionService::OnExternalExtensionFileFound( | 2319 bool ExtensionService::OnExternalExtensionFileFound( |
2296 const std::string& id, | 2320 const std::string& id, |
2297 const Version* version, | 2321 const Version* version, |
2298 const FilePath& path, | 2322 const FilePath& path, |
2299 Extension::Location location, | 2323 Extension::Location location, |
2300 int creation_flags, | 2324 int creation_flags, |
2301 bool mark_acknowledged) { | 2325 bool mark_acknowledged) { |
2302 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2326 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2303 CHECK(Extension::IdIsValid(id)); | 2327 CHECK(Extension::IdIsValid(id)); |
2304 if (extension_prefs_->IsExternalExtensionUninstalled(id)) | 2328 if (extension_prefs_->IsExternalExtensionUninstalled(id)) |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2388 host->render_view_host()); | 2412 host->render_view_host()); |
2389 content::DevToolsManager::GetInstance()->AttachClientHost(iter->second, | 2413 content::DevToolsManager::GetInstance()->AttachClientHost(iter->second, |
2390 agent); | 2414 agent); |
2391 orphaned_dev_tools_.erase(iter); | 2415 orphaned_dev_tools_.erase(iter); |
2392 } | 2416 } |
2393 | 2417 |
2394 void ExtensionService::Observe(int type, | 2418 void ExtensionService::Observe(int type, |
2395 const content::NotificationSource& source, | 2419 const content::NotificationSource& source, |
2396 const content::NotificationDetails& details) { | 2420 const content::NotificationDetails& details) { |
2397 switch (type) { | 2421 switch (type) { |
2422 case chrome::NOTIFICATION_EXTENSION_LOADED: { | |
Aaron Boodman
2012/09/16 01:42:50
This is the kind of code I'm trying to keep out of
not at google - send to devlin
2012/09/27 00:46:10
Not that this solves the LOADED/UNLOADED problem,
| |
2423 if (profile_ != | |
2424 content::Source<Profile>(source).ptr()->GetOriginalProfile()) { | |
2425 break; | |
2426 } | |
2427 | |
2428 const Extension* extension = | |
2429 content::Details<const Extension>(details).ptr(); | |
2430 if (extension->page_action() && | |
2431 !ContainsKey(page_actions_, extension->id())) { | |
2432 page_actions_[extension->id()] = | |
2433 new ExtensionAction(extension->id(), *extension->page_action()); | |
2434 } | |
2435 if (extension->browser_action() && | |
2436 !ContainsKey(browser_actions_, extension->id())) { | |
2437 browser_actions_[extension->id()] = | |
2438 new ExtensionAction(extension->id(), *extension->browser_action()); | |
2439 } | |
2440 DCHECK(extension->script_badge()); | |
2441 if (!ContainsKey(script_badges_, extension->id())) { | |
2442 script_badges_[extension->id()] = | |
2443 new ExtensionAction(extension->id(), *extension->script_badge()); | |
2444 } | |
2445 break; | |
2446 } | |
2447 case chrome::NOTIFICATION_EXTENSION_UNLOADED: { | |
2448 if (profile_ != | |
2449 content::Source<Profile>(source).ptr()->GetOriginalProfile()) { | |
2450 break; | |
2451 } | |
2452 | |
2453 const Extension* extension = | |
2454 content::Details<UnloadedExtensionInfo>(details)->extension; | |
2455 if (ContainsKey(page_actions_, extension->id())) { | |
2456 delete page_actions_[extension->id()]; | |
2457 page_actions_.erase(extension->id()); | |
2458 } | |
2459 if (ContainsKey(browser_actions_, extension->id())) { | |
2460 delete browser_actions_[extension->id()]; | |
2461 browser_actions_.erase(extension->id()); | |
2462 } | |
2463 if (ContainsKey(script_badges_, extension->id())) { | |
2464 script_badges_.erase(extension->id()); | |
2465 } | |
2466 break; | |
2467 } | |
2398 case chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED: { | 2468 case chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED: { |
2399 if (profile_ != | 2469 if (profile_ != |
2400 content::Source<Profile>(source).ptr()->GetOriginalProfile()) { | 2470 content::Source<Profile>(source).ptr()->GetOriginalProfile()) { |
2401 break; | 2471 break; |
2402 } | 2472 } |
2403 | 2473 |
2404 extensions::ExtensionHost* host = | 2474 extensions::ExtensionHost* host = |
2405 content::Details<extensions::ExtensionHost>(details).ptr(); | 2475 content::Details<extensions::ExtensionHost>(details).ptr(); |
2406 | 2476 |
2407 // Mark the extension as terminated and Unload it. We want it to | 2477 // Mark the extension as terminated and Unload it. We want it to |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2640 extensions::ExtensionHost* extension_host) { | 2710 extensions::ExtensionHost* extension_host) { |
2641 if (!extension_host) | 2711 if (!extension_host) |
2642 return; | 2712 return; |
2643 | 2713 |
2644 #if !defined(OS_ANDROID) | 2714 #if !defined(OS_ANDROID) |
2645 extensions::LaunchPlatformApp(extension_host->profile(), | 2715 extensions::LaunchPlatformApp(extension_host->profile(), |
2646 extension_host->extension(), | 2716 extension_host->extension(), |
2647 NULL, FilePath()); | 2717 NULL, FilePath()); |
2648 #endif | 2718 #endif |
2649 } | 2719 } |
OLD | NEW |