1 // Copyright 2013 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/extensions/signin/gaia_auth_extension_loader.h" 6 7 #include "base/command_line.h" 8 #include "base/files/file_path.h" 9 #include "base/lazy_instance.h" 10 #include "base/logging.h" 11 #include "chrome/browser/extensions/component_loader.h" 12 #include "chrome/browser/extensions/extension_service.h" 13 #include "chrome/common/chrome_constants.h" 14 #include "chrome/common/chrome_switches.h" 15 #include "chrome/common/url_constants.h" 16 #include "content/public/browser/browser_context.h" 17 #include "content/public/browser/browser_thread.h" 18 #include "content/public/browser/storage_partition.h" 19 #include "extensions/browser/extension_system.h" 20 #include "grit/browser_resources.h" 21 22 #if defined(OS_CHROMEOS) 23 #include "chrome/browser/chromeos/system/input_device_settings.h" 24 #endif 25 26 using content::BrowserContext; 27 using content::BrowserThread; 28 29 namespace { 30 31 extensions::ComponentLoader* GetComponentLoader(BrowserContext* context) { 32 extensions::ExtensionSystem* extension_system = 33 extensions::ExtensionSystem::Get(context); 34 ExtensionService* extension_service = extension_system->extension_service(); 35 return extension_service->component_loader(); 36 } 37 38 void LoadGaiaAuthExtension(BrowserContext* context) { 39 DCHECK_CURRENTLY_ON(BrowserThread::UI); 40 41 extensions::ComponentLoader* component_loader = GetComponentLoader(context); 42 const CommandLine* command_line = CommandLine::ForCurrentProcess(); 43 if (command_line->HasSwitch(switches::kAuthExtensionPath)) { 44 base::FilePath auth_extension_path = 45 command_line->GetSwitchValuePath(switches::kAuthExtensionPath); 46 component_loader->Add(IDR_GAIA_AUTH_MANIFEST, auth_extension_path); 47 return; 48 } 49 50 int manifest_resource_id = IDR_GAIA_AUTH_MANIFEST; 51 52 #if defined(OS_CHROMEOS) 53 if (chromeos::system::InputDeviceSettings::Get() 54 ->ForceKeyboardDrivenUINavigation()) { 55 manifest_resource_id = IDR_GAIA_AUTH_KEYBOARD_MANIFEST; 56 } 57 #endif 58 59 component_loader->Add(manifest_resource_id, 60 base::FilePath(FILE_PATH_LITERAL("gaia_auth"))); 61 } 62 63 void UnloadGaiaAuthExtension(BrowserContext* context) { 64 DCHECK_CURRENTLY_ON(BrowserThread::UI); 65 66 content::StoragePartition* partition = 67 content::BrowserContext::GetStoragePartitionForSite( 68 context, GURL(chrome::kChromeUIChromeSigninURL)); 69 if (partition) { 70 partition->ClearData( 71 content::StoragePartition::REMOVE_DATA_MASK_ALL, 72 content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, 73 GURL(), 74 content::StoragePartition::OriginMatcherFunction(), 75 base::Time(), 76 base::Time::Max(), 77 base::Bind(&base::DoNothing)); 78 } 79 GetComponentLoader(context)->Remove(extensions::kGaiaAuthExtensionId); 80 } 81 82 } // namespace 83 84 namespace extensions { 85 86 GaiaAuthExtensionLoader::GaiaAuthExtensionLoader(BrowserContext* context) 87 : browser_context_(context), load_count_(0) {} 88 89 GaiaAuthExtensionLoader::~GaiaAuthExtensionLoader() { 90 DCHECK_EQ(0, load_count_); 91 } 92 93 void GaiaAuthExtensionLoader::LoadIfNeeded() { 94 if (load_count_ == 0) 95 LoadGaiaAuthExtension(browser_context_); 96 ++load_count_; 97 } 98 99 void GaiaAuthExtensionLoader::UnloadIfNeeded() { 100 --load_count_; 101 if (load_count_ == 0) 102 UnloadGaiaAuthExtension(browser_context_); 103 } 104 105 void GaiaAuthExtensionLoader::Shutdown() { 106 if (load_count_ > 0) { 107 UnloadGaiaAuthExtension(browser_context_); 108 load_count_ = 0; 109 } 110 } 111 112 // static 113 GaiaAuthExtensionLoader* GaiaAuthExtensionLoader::Get(BrowserContext* context) { 114 return BrowserContextKeyedAPIFactory<GaiaAuthExtensionLoader>::Get(context); 115 } 116 117 static base::LazyInstance< 118 BrowserContextKeyedAPIFactory<GaiaAuthExtensionLoader> > g_factory = 119 LAZY_INSTANCE_INITIALIZER; 120 121 // static 122 BrowserContextKeyedAPIFactory<GaiaAuthExtensionLoader>* 123 GaiaAuthExtensionLoader::GetFactoryInstance() { 124 return g_factory.Pointer(); 125 } 126 127 } // namespace extensions 128