| 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/api/runtime/runtime_api.h" | 5 #include "chrome/browser/extensions/api/runtime/runtime_api.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 12 #include "base/values.h" | 12 #include "base/values.h" |
| 13 #include "chrome/browser/browser_process.h" | |
| 14 #include "chrome/browser/chrome_notification_types.h" | 13 #include "chrome/browser/chrome_notification_types.h" |
| 15 #include "chrome/browser/extensions/extension_service.h" | 14 #include "chrome/browser/extensions/extension_service.h" |
| 16 #include "chrome/browser/extensions/updater/extension_updater.h" | 15 #include "chrome/browser/extensions/updater/extension_updater.h" |
| 17 #include "chrome/browser/omaha_query_params/omaha_query_params.h" | 16 #include "chrome/browser/omaha_query_params/omaha_query_params.h" |
| 18 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
| 19 #include "chrome/browser/profiles/profile_manager.h" | 18 #include "chrome/browser/profiles/profile_manager.h" |
| 20 #include "chrome/browser/ui/browser_finder.h" | 19 #include "chrome/browser/ui/browser_finder.h" |
| 21 #include "chrome/browser/ui/browser_navigator.h" | 20 #include "chrome/browser/ui/browser_navigator.h" |
| 22 #include "chrome/browser/ui/browser_window.h" | 21 #include "chrome/browser/ui/browser_window.h" |
| 23 #include "chrome/common/extensions/api/runtime.h" | 22 #include "chrome/common/extensions/api/runtime.h" |
| 24 #include "content/public/browser/child_process_security_policy.h" | 23 #include "content/public/browser/child_process_security_policy.h" |
| 25 #include "content/public/browser/notification_service.h" | 24 #include "content/public/browser/notification_service.h" |
| 26 #include "content/public/browser/render_process_host.h" | 25 #include "content/public/browser/render_process_host.h" |
| 27 #include "content/public/browser/render_view_host.h" | 26 #include "content/public/browser/render_view_host.h" |
| 28 #include "extensions/browser/event_router.h" | 27 #include "extensions/browser/api/runtime/runtime_event_router.h" |
| 29 #include "extensions/browser/extension_host.h" | 28 #include "extensions/browser/extension_host.h" |
| 30 #include "extensions/browser/extension_registry.h" | 29 #include "extensions/browser/extension_registry.h" |
| 31 #include "extensions/browser/extension_system.h" | 30 #include "extensions/browser/extension_system.h" |
| 32 #include "extensions/browser/extensions_browser_client.h" | 31 #include "extensions/browser/extensions_browser_client.h" |
| 33 #include "extensions/browser/lazy_background_task_queue.h" | 32 #include "extensions/browser/lazy_background_task_queue.h" |
| 34 #include "extensions/browser/process_manager.h" | 33 #include "extensions/browser/process_manager.h" |
| 35 #include "extensions/common/error_utils.h" | 34 #include "extensions/common/error_utils.h" |
| 36 #include "extensions/common/extension.h" | 35 #include "extensions/common/extension.h" |
| 37 #include "extensions/common/manifest_handlers/background_info.h" | 36 #include "extensions/common/manifest_handlers/background_info.h" |
| 38 #include "url/gurl.h" | 37 #include "url/gurl.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 49 namespace GetPlatformInfo = extensions::api::runtime::GetPlatformInfo; | 48 namespace GetPlatformInfo = extensions::api::runtime::GetPlatformInfo; |
| 50 | 49 |
| 51 namespace extensions { | 50 namespace extensions { |
| 52 | 51 |
| 53 namespace runtime = api::runtime; | 52 namespace runtime = api::runtime; |
| 54 | 53 |
| 55 namespace { | 54 namespace { |
| 56 | 55 |
| 57 const char kNoBackgroundPageError[] = "You do not have a background page."; | 56 const char kNoBackgroundPageError[] = "You do not have a background page."; |
| 58 const char kPageLoadError[] = "Background page failed to load."; | 57 const char kPageLoadError[] = "Background page failed to load."; |
| 59 const char kInstallReason[] = "reason"; | |
| 60 const char kInstallReasonChromeUpdate[] = "chrome_update"; | |
| 61 const char kInstallReasonUpdate[] = "update"; | |
| 62 const char kInstallReasonInstall[] = "install"; | |
| 63 const char kInstallPreviousVersion[] = "previousVersion"; | |
| 64 const char kInvalidUrlError[] = "Invalid URL."; | 58 const char kInvalidUrlError[] = "Invalid URL."; |
| 65 const char kUpdatesDisabledError[] = "Autoupdate is not enabled."; | 59 const char kUpdatesDisabledError[] = "Autoupdate is not enabled."; |
| 66 const char kUpdateFound[] = "update_available"; | 60 const char kUpdateFound[] = "update_available"; |
| 67 const char kUpdateNotFound[] = "no_update"; | 61 const char kUpdateNotFound[] = "no_update"; |
| 68 const char kUpdateThrottled[] = "throttled"; | 62 const char kUpdateThrottled[] = "throttled"; |
| 69 | 63 |
| 70 // A preference key storing the url loaded when an extension is uninstalled. | 64 // A preference key storing the url loaded when an extension is uninstalled. |
| 71 const char kUninstallUrl[] = "uninstall_url"; | 65 const char kUninstallUrl[] = "uninstall_url"; |
| 72 | 66 |
| 73 // The name of the directory to be returned by getPackageDirectoryEntry. This | 67 // The name of the directory to be returned by getPackageDirectoryEntry. This |
| 74 // particular value does not matter to user code, but is chosen for consistency | 68 // particular value does not matter to user code, but is chosen for consistency |
| 75 // with the equivalent Pepper API. | 69 // with the equivalent Pepper API. |
| 76 const char kPackageDirectoryPath[] = "crxfs"; | 70 const char kPackageDirectoryPath[] = "crxfs"; |
| 77 | 71 |
| 78 void DispatchOnStartupEventImpl(BrowserContext* browser_context, | |
| 79 const std::string& extension_id, | |
| 80 bool first_call, | |
| 81 ExtensionHost* host) { | |
| 82 // A NULL host from the LazyBackgroundTaskQueue means the page failed to | |
| 83 // load. Give up. | |
| 84 if (!host && !first_call) | |
| 85 return; | |
| 86 | |
| 87 // Don't send onStartup events to incognito browser contexts. | |
| 88 if (browser_context->IsOffTheRecord()) | |
| 89 return; | |
| 90 | |
| 91 if (ExtensionsBrowserClient::Get()->IsShuttingDown() || | |
| 92 !ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) | |
| 93 return; | |
| 94 ExtensionSystem* system = ExtensionSystem::Get(browser_context); | |
| 95 if (!system) | |
| 96 return; | |
| 97 | |
| 98 // If this is a persistent background page, we want to wait for it to load | |
| 99 // (it might not be ready, since this is startup). But only enqueue once. | |
| 100 // If it fails to load the first time, don't bother trying again. | |
| 101 const Extension* extension = | |
| 102 ExtensionRegistry::Get(browser_context)->enabled_extensions().GetByID( | |
| 103 extension_id); | |
| 104 if (extension && BackgroundInfo::HasPersistentBackgroundPage(extension) && | |
| 105 first_call && | |
| 106 system->lazy_background_task_queue()-> | |
| 107 ShouldEnqueueTask(browser_context, extension)) { | |
| 108 system->lazy_background_task_queue()->AddPendingTask( | |
| 109 browser_context, extension_id, | |
| 110 base::Bind(&DispatchOnStartupEventImpl, | |
| 111 browser_context, extension_id, false)); | |
| 112 return; | |
| 113 } | |
| 114 | |
| 115 scoped_ptr<base::ListValue> event_args(new base::ListValue()); | |
| 116 scoped_ptr<Event> event(new Event(runtime::OnStartup::kEventName, | |
| 117 event_args.Pass())); | |
| 118 system->event_router()->DispatchEventToExtension(extension_id, event.Pass()); | |
| 119 } | |
| 120 | |
| 121 void SetUninstallURL(ExtensionPrefs* prefs, | 72 void SetUninstallURL(ExtensionPrefs* prefs, |
| 122 const std::string& extension_id, | 73 const std::string& extension_id, |
| 123 const std::string& url_string) { | 74 const std::string& url_string) { |
| 124 prefs->UpdateExtensionPref(extension_id, | 75 prefs->UpdateExtensionPref(extension_id, |
| 125 kUninstallUrl, | 76 kUninstallUrl, |
| 126 new base::StringValue(url_string)); | 77 new base::StringValue(url_string)); |
| 127 } | 78 } |
| 128 | 79 |
| 129 #if defined(ENABLE_EXTENSIONS) | 80 #if defined(ENABLE_EXTENSIONS) |
| 130 std::string GetUninstallURL(ExtensionPrefs* prefs, | 81 std::string GetUninstallURL(ExtensionPrefs* prefs, |
| 131 const std::string& extension_id) { | 82 const std::string& extension_id) { |
| 132 std::string url_string; | 83 std::string url_string; |
| 133 prefs->ReadPrefAsString(extension_id, kUninstallUrl, &url_string); | 84 prefs->ReadPrefAsString(extension_id, kUninstallUrl, &url_string); |
| 134 return url_string; | 85 return url_string; |
| 135 } | 86 } |
| 136 #endif // defined(ENABLE_EXTENSIONS) | 87 #endif // defined(ENABLE_EXTENSIONS) |
| 137 | 88 |
| 138 } // namespace | 89 } // namespace |
| 139 | 90 |
| 140 /////////////////////////////////////////////////////////////////////////////// | 91 /////////////////////////////////////////////////////////////////////////////// |
| 141 | 92 |
| 142 static base::LazyInstance<BrowserContextKeyedAPIFactory<RuntimeAPI> > | 93 static base::LazyInstance<BrowserContextKeyedAPIFactory<RuntimeAPI> > |
| 143 g_factory = LAZY_INSTANCE_INITIALIZER; | 94 g_factory = LAZY_INSTANCE_INITIALIZER; |
| 144 | 95 |
| 145 // static | 96 // static |
| 146 BrowserContextKeyedAPIFactory<RuntimeAPI>* RuntimeAPI::GetFactoryInstance() { | 97 BrowserContextKeyedAPIFactory<RuntimeAPI>* RuntimeAPI::GetFactoryInstance() { |
| 147 return g_factory.Pointer(); | 98 return g_factory.Pointer(); |
| 148 } | 99 } |
| 149 | 100 |
| 150 RuntimeAPI::RuntimeAPI(content::BrowserContext* context) | 101 RuntimeAPI::RuntimeAPI(BrowserContext* context) |
| 151 : browser_context_(context), | 102 : browser_context_(context), |
| 152 dispatch_chrome_updated_event_(false), | 103 dispatch_chrome_updated_event_(false), |
| 153 registered_for_updates_(false) { | 104 registered_for_updates_(false) { |
| 154 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, | 105 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, |
| 155 content::Source<BrowserContext>(context)); | 106 content::Source<BrowserContext>(context)); |
| 156 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, | 107 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, |
| 157 content::Source<BrowserContext>(context)); | 108 content::Source<BrowserContext>(context)); |
| 158 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, | 109 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, |
| 159 content::Source<BrowserContext>(context)); | 110 content::Source<BrowserContext>(context)); |
| 160 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, | 111 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 true)); | 180 true)); |
| 230 } | 181 } |
| 231 | 182 |
| 232 void RuntimeAPI::OnExtensionInstalled(const Extension* extension) { | 183 void RuntimeAPI::OnExtensionInstalled(const Extension* extension) { |
| 233 // Ephemeral apps are not considered to be installed and do not receive | 184 // Ephemeral apps are not considered to be installed and do not receive |
| 234 // the onInstalled() event. | 185 // the onInstalled() event. |
| 235 if (extension->is_ephemeral()) | 186 if (extension->is_ephemeral()) |
| 236 return; | 187 return; |
| 237 | 188 |
| 238 // Get the previous version to check if this is an upgrade. | 189 // Get the previous version to check if this is an upgrade. |
| 239 ExtensionService* service = ExtensionSystem::Get( | 190 const Extension* old = |
| 240 browser_context_)->extension_service(); | 191 ExtensionRegistry::Get(browser_context_) |
| 241 const Extension* old = service->GetExtensionById(extension->id(), true); | 192 ->GetExtensionById(extension->id(), ExtensionRegistry::EVERYTHING); |
| 242 Version old_version; | 193 Version old_version; |
| 243 if (old) | 194 if (old) |
| 244 old_version = *old->version(); | 195 old_version = *old->version(); |
| 245 | 196 |
| 246 // Dispatch the onInstalled event. | 197 // Dispatch the onInstalled event. |
| 247 base::MessageLoop::current()->PostTask( | 198 base::MessageLoop::current()->PostTask( |
| 248 FROM_HERE, | 199 FROM_HERE, |
| 249 base::Bind(&RuntimeEventRouter::DispatchOnInstalledEvent, | 200 base::Bind(&RuntimeEventRouter::DispatchOnInstalledEvent, |
| 250 browser_context_, | 201 browser_context_, |
| 251 extension->id(), | 202 extension->id(), |
| 252 old_version, | 203 old_version, |
| 253 false)); | 204 false)); |
| 254 | 205 |
| 255 } | 206 } |
| 256 | 207 |
| 257 void RuntimeAPI::OnExtensionUninstalled(const Extension* extension) { | 208 void RuntimeAPI::OnExtensionUninstalled(const Extension* extension) { |
| 258 // Ephemeral apps are not considered to be installed, so the uninstall URL | 209 // Ephemeral apps are not considered to be installed, so the uninstall URL |
| 259 // is not invoked when they are removed. | 210 // is not invoked when they are removed. |
| 260 if (extension->is_ephemeral()) | 211 if (extension->is_ephemeral()) |
| 261 return; | 212 return; |
| 262 | 213 |
| 263 Profile* profile = Profile::FromBrowserContext(browser_context_); | 214 Profile* profile = Profile::FromBrowserContext(browser_context_); |
| 264 RuntimeEventRouter::OnExtensionUninstalled(profile, extension->id()); | 215 ShowUninstallURL(profile, extension->id()); |
| 265 } | |
| 266 | |
| 267 void RuntimeAPI::OnAppUpdateAvailable(const Extension* extension) { | |
| 268 Profile* profile = Profile::FromBrowserContext(browser_context_); | |
| 269 RuntimeEventRouter::DispatchOnUpdateAvailableEvent( | |
| 270 profile, extension->id(), extension->manifest()->value()); | |
| 271 } | |
| 272 | |
| 273 void RuntimeAPI::OnChromeUpdateAvailable() { | |
| 274 Profile* profile = Profile::FromBrowserContext(browser_context_); | |
| 275 RuntimeEventRouter::DispatchOnBrowserUpdateAvailableEvent(profile); | |
| 276 } | |
| 277 | |
| 278 /////////////////////////////////////////////////////////////////////////////// | |
| 279 | |
| 280 // static | |
| 281 void RuntimeEventRouter::DispatchOnStartupEvent( | |
| 282 content::BrowserContext* context, const std::string& extension_id) { | |
| 283 DispatchOnStartupEventImpl(context, extension_id, true, NULL); | |
| 284 } | 216 } |
| 285 | 217 |
| 286 // static | 218 // static |
| 287 void RuntimeEventRouter::DispatchOnInstalledEvent( | 219 void RuntimeAPI::ShowUninstallURL(Profile* profile, |
| 288 content::BrowserContext* context, | 220 const std::string& extension_id) { |
| 289 const std::string& extension_id, | |
| 290 const Version& old_version, | |
| 291 bool chrome_updated) { | |
| 292 if (!ExtensionsBrowserClient::Get()->IsValidContext(context)) | |
| 293 return; | |
| 294 ExtensionSystem* system = ExtensionSystem::Get(context); | |
| 295 if (!system) | |
| 296 return; | |
| 297 | |
| 298 scoped_ptr<base::ListValue> event_args(new base::ListValue()); | |
| 299 base::DictionaryValue* info = new base::DictionaryValue(); | |
| 300 event_args->Append(info); | |
| 301 if (old_version.IsValid()) { | |
| 302 info->SetString(kInstallReason, kInstallReasonUpdate); | |
| 303 info->SetString(kInstallPreviousVersion, old_version.GetString()); | |
| 304 } else if (chrome_updated) { | |
| 305 info->SetString(kInstallReason, kInstallReasonChromeUpdate); | |
| 306 } else { | |
| 307 info->SetString(kInstallReason, kInstallReasonInstall); | |
| 308 } | |
| 309 DCHECK(system->event_router()); | |
| 310 scoped_ptr<Event> event(new Event(runtime::OnInstalled::kEventName, | |
| 311 event_args.Pass())); | |
| 312 system->event_router()->DispatchEventWithLazyListener(extension_id, | |
| 313 event.Pass()); | |
| 314 } | |
| 315 | |
| 316 // static | |
| 317 void RuntimeEventRouter::DispatchOnUpdateAvailableEvent( | |
| 318 Profile* profile, | |
| 319 const std::string& extension_id, | |
| 320 const base::DictionaryValue* manifest) { | |
| 321 ExtensionSystem* system = ExtensionSystem::Get(profile); | |
| 322 if (!system) | |
| 323 return; | |
| 324 | |
| 325 scoped_ptr<base::ListValue> args(new base::ListValue); | |
| 326 args->Append(manifest->DeepCopy()); | |
| 327 DCHECK(system->event_router()); | |
| 328 scoped_ptr<Event> event(new Event(runtime::OnUpdateAvailable::kEventName, | |
| 329 args.Pass())); | |
| 330 system->event_router()->DispatchEventToExtension(extension_id, event.Pass()); | |
| 331 } | |
| 332 | |
| 333 // static | |
| 334 void RuntimeEventRouter::DispatchOnBrowserUpdateAvailableEvent( | |
| 335 Profile* profile) { | |
| 336 ExtensionSystem* system = ExtensionSystem::Get(profile); | |
| 337 if (!system) | |
| 338 return; | |
| 339 | |
| 340 scoped_ptr<base::ListValue> args(new base::ListValue); | |
| 341 DCHECK(system->event_router()); | |
| 342 scoped_ptr<Event> event(new Event( | |
| 343 runtime::OnBrowserUpdateAvailable::kEventName, args.Pass())); | |
| 344 system->event_router()->BroadcastEvent(event.Pass()); | |
| 345 } | |
| 346 | |
| 347 // static | |
| 348 void RuntimeEventRouter::DispatchOnRestartRequiredEvent( | |
| 349 Profile* profile, | |
| 350 const std::string& app_id, | |
| 351 api::runtime::OnRestartRequired::Reason reason) { | |
| 352 ExtensionSystem* system = ExtensionSystem::Get(profile); | |
| 353 if (!system) | |
| 354 return; | |
| 355 | |
| 356 scoped_ptr<Event> event( | |
| 357 new Event(runtime::OnRestartRequired::kEventName, | |
| 358 api::runtime::OnRestartRequired::Create(reason))); | |
| 359 | |
| 360 DCHECK(system->event_router()); | |
| 361 system->event_router()->DispatchEventToExtension(app_id, event.Pass()); | |
| 362 } | |
| 363 | |
| 364 // static | |
| 365 void RuntimeEventRouter::OnExtensionUninstalled( | |
| 366 Profile* profile, | |
| 367 const std::string& extension_id) { | |
| 368 #if defined(ENABLE_EXTENSIONS) | 221 #if defined(ENABLE_EXTENSIONS) |
| 369 GURL uninstall_url(GetUninstallURL(ExtensionPrefs::Get(profile), | 222 GURL uninstall_url(GetUninstallURL(ExtensionPrefs::Get(profile), |
| 370 extension_id)); | 223 extension_id)); |
| 371 | 224 |
| 372 if (uninstall_url.is_empty()) | 225 if (uninstall_url.is_empty()) |
| 373 return; | 226 return; |
| 374 | 227 |
| 375 Browser* browser = chrome::FindLastActiveWithProfile(profile, | 228 Browser* browser = chrome::FindLastActiveWithProfile(profile, |
| 376 chrome::GetActiveDesktop()); | 229 chrome::GetActiveDesktop()); |
| 377 if (!browser) | 230 if (!browser) |
| 378 browser = new Browser(Browser::CreateParams(profile, | 231 browser = new Browser(Browser::CreateParams(profile, |
| 379 chrome::GetActiveDesktop())); | 232 chrome::GetActiveDesktop())); |
| 380 | 233 |
| 381 chrome::NavigateParams params(browser, uninstall_url, | 234 chrome::NavigateParams params(browser, uninstall_url, |
| 382 content::PAGE_TRANSITION_CLIENT_REDIRECT); | 235 content::PAGE_TRANSITION_CLIENT_REDIRECT); |
| 383 params.disposition = NEW_FOREGROUND_TAB; | 236 params.disposition = NEW_FOREGROUND_TAB; |
| 384 params.user_gesture = false; | 237 params.user_gesture = false; |
| 385 chrome::Navigate(¶ms); | 238 chrome::Navigate(¶ms); |
| 386 #endif // defined(ENABLE_EXTENSIONS) | 239 #endif // defined(ENABLE_EXTENSIONS) |
| 387 } | 240 } |
| 388 | 241 |
| 242 void RuntimeAPI::OnAppUpdateAvailable(const Extension* extension) { |
| 243 RuntimeEventRouter::DispatchOnUpdateAvailableEvent( |
| 244 browser_context_, extension->id(), extension->manifest()->value()); |
| 245 } |
| 246 |
| 247 void RuntimeAPI::OnChromeUpdateAvailable() { |
| 248 RuntimeEventRouter::DispatchOnBrowserUpdateAvailableEvent(browser_context_); |
| 249 } |
| 250 |
| 251 /////////////////////////////////////////////////////////////////////////////// |
| 252 |
| 389 bool RuntimeGetBackgroundPageFunction::RunImpl() { | 253 bool RuntimeGetBackgroundPageFunction::RunImpl() { |
| 390 ExtensionSystem* system = ExtensionSystem::Get(GetProfile()); | 254 ExtensionSystem* system = ExtensionSystem::Get(GetProfile()); |
| 391 ExtensionHost* host = system->process_manager()-> | 255 ExtensionHost* host = system->process_manager()-> |
| 392 GetBackgroundHostForExtension(extension_id()); | 256 GetBackgroundHostForExtension(extension_id()); |
| 393 if (system->lazy_background_task_queue()->ShouldEnqueueTask(GetProfile(), | 257 if (system->lazy_background_task_queue()->ShouldEnqueueTask(GetProfile(), |
| 394 GetExtension())) { | 258 GetExtension())) { |
| 395 system->lazy_background_task_queue()->AddPendingTask( | 259 system->lazy_background_task_queue()->AddPendingTask( |
| 396 GetProfile(), | 260 GetProfile(), |
| 397 extension_id(), | 261 extension_id(), |
| 398 base::Bind(&RuntimeGetBackgroundPageFunction::OnPageLoaded, this)); | 262 base::Bind(&RuntimeGetBackgroundPageFunction::OnPageLoaded, this)); |
| 399 } else if (host) { | 263 } else if (host) { |
| 400 OnPageLoaded(host); | 264 OnPageLoaded(host); |
| 401 } else { | 265 } else { |
| 402 error_ = kNoBackgroundPageError; | 266 error_ = kNoBackgroundPageError; |
| 403 return false; | 267 return false; |
| 404 } | 268 } |
| 405 | 269 |
| 406 return true; | 270 return true; |
| 407 } | 271 } |
| 408 | 272 |
| 409 void RuntimeGetBackgroundPageFunction::OnPageLoaded(ExtensionHost* host) { | 273 void RuntimeGetBackgroundPageFunction::OnPageLoaded(ExtensionHost* host) { |
| 410 if (host) { | 274 if (host) { |
| 411 SendResponse(true); | 275 SendResponse(true); |
| 412 } else { | 276 } else { |
| 413 error_ = kPageLoadError; | 277 error_ = kPageLoadError; |
| 414 SendResponse(false); | 278 SendResponse(false); |
| 415 } | 279 } |
| 416 } | 280 } |
| 417 | 281 |
| 282 ////////////////////////////////////////////////////////////////////////////// |
| 283 |
| 418 bool RuntimeSetUninstallURLFunction::RunImpl() { | 284 bool RuntimeSetUninstallURLFunction::RunImpl() { |
| 419 std::string url_string; | 285 std::string url_string; |
| 420 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url_string)); | 286 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url_string)); |
| 421 | 287 |
| 422 GURL url(url_string); | 288 GURL url(url_string); |
| 423 if (!url.is_valid()) { | 289 if (!url.is_valid()) { |
| 424 error_ = ErrorUtils::FormatErrorMessage(kInvalidUrlError, url_string); | 290 error_ = ErrorUtils::FormatErrorMessage(kInvalidUrlError, url_string); |
| 425 return false; | 291 return false; |
| 426 } | 292 } |
| 427 | 293 |
| 428 SetUninstallURL( | 294 SetUninstallURL( |
| 429 ExtensionPrefs::Get(GetProfile()), extension_id(), url_string); | 295 ExtensionPrefs::Get(GetProfile()), extension_id(), url_string); |
| 430 return true; | 296 return true; |
| 431 } | 297 } |
| 432 | 298 |
| 299 ////////////////////////////////////////////////////////////////////////////// |
| 300 |
| 433 bool RuntimeReloadFunction::RunImpl() { | 301 bool RuntimeReloadFunction::RunImpl() { |
| 434 // We can't call ReloadExtension directly, since when this method finishes | 302 // We can't call ReloadExtension directly, since when this method finishes |
| 435 // it tries to decrease the reference count for the extension, which fails | 303 // it tries to decrease the reference count for the extension, which fails |
| 436 // if the extension has already been reloaded; so instead we post a task. | 304 // if the extension has already been reloaded; so instead we post a task. |
| 437 base::MessageLoop::current()->PostTask( | 305 base::MessageLoop::current()->PostTask( |
| 438 FROM_HERE, | 306 FROM_HERE, |
| 439 base::Bind(&ExtensionService::ReloadExtension, | 307 base::Bind(&ExtensionService::ReloadExtension, |
| 440 GetProfile()->GetExtensionService()->AsWeakPtr(), | 308 GetProfile()->GetExtensionService()->AsWeakPtr(), |
| 441 extension_id())); | 309 extension_id())); |
| 442 return true; | 310 return true; |
| 443 } | 311 } |
| 444 | 312 |
| 313 ////////////////////////////////////////////////////////////////////////////// |
| 314 |
| 445 RuntimeRequestUpdateCheckFunction::RuntimeRequestUpdateCheckFunction() { | 315 RuntimeRequestUpdateCheckFunction::RuntimeRequestUpdateCheckFunction() { |
| 446 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND, | 316 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND, |
| 447 content::NotificationService::AllSources()); | 317 content::NotificationService::AllSources()); |
| 448 } | 318 } |
| 449 | 319 |
| 450 bool RuntimeRequestUpdateCheckFunction::RunImpl() { | 320 bool RuntimeRequestUpdateCheckFunction::RunImpl() { |
| 451 ExtensionSystem* system = ExtensionSystem::Get(GetProfile()); | 321 ExtensionSystem* system = ExtensionSystem::Get(GetProfile()); |
| 452 ExtensionService* service = system->extension_service(); | 322 ExtensionService* service = system->extension_service(); |
| 453 ExtensionUpdater* updater = service->updater(); | 323 ExtensionUpdater* updater = service->updater(); |
| 454 if (!updater) { | 324 if (!updater) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 const std::string& version) { | 377 const std::string& version) { |
| 508 did_reply_ = true; | 378 did_reply_ = true; |
| 509 results_.reset(new base::ListValue); | 379 results_.reset(new base::ListValue); |
| 510 results_->AppendString(kUpdateFound); | 380 results_->AppendString(kUpdateFound); |
| 511 base::DictionaryValue* details = new base::DictionaryValue; | 381 base::DictionaryValue* details = new base::DictionaryValue; |
| 512 results_->Append(details); | 382 results_->Append(details); |
| 513 details->SetString("version", version); | 383 details->SetString("version", version); |
| 514 SendResponse(true); | 384 SendResponse(true); |
| 515 } | 385 } |
| 516 | 386 |
| 387 ////////////////////////////////////////////////////////////////////////////// |
| 388 |
| 517 bool RuntimeRestartFunction::RunImpl() { | 389 bool RuntimeRestartFunction::RunImpl() { |
| 518 #if defined(OS_CHROMEOS) | 390 #if defined(OS_CHROMEOS) |
| 519 if (chromeos::UserManager::Get()->IsLoggedInAsKioskApp()) { | 391 if (chromeos::UserManager::Get()->IsLoggedInAsKioskApp()) { |
| 520 chromeos::DBusThreadManager::Get() | 392 chromeos::DBusThreadManager::Get() |
| 521 ->GetPowerManagerClient() | 393 ->GetPowerManagerClient() |
| 522 ->RequestRestart(); | 394 ->RequestRestart(); |
| 523 return true; | 395 return true; |
| 524 } | 396 } |
| 525 #endif | 397 #endif |
| 526 SetError("Function available only for ChromeOS kiosk mode."); | 398 SetError("Function available only for ChromeOS kiosk mode."); |
| 527 return false; | 399 return false; |
| 528 } | 400 } |
| 529 | 401 |
| 402 ////////////////////////////////////////////////////////////////////////////// |
| 403 |
| 530 bool RuntimeGetPlatformInfoFunction::RunImpl() { | 404 bool RuntimeGetPlatformInfoFunction::RunImpl() { |
| 531 GetPlatformInfo::Results::PlatformInfo info; | 405 GetPlatformInfo::Results::PlatformInfo info; |
| 532 | 406 |
| 533 const char* os = chrome::OmahaQueryParams::GetOS(); | 407 const char* os = chrome::OmahaQueryParams::GetOS(); |
| 534 if (strcmp(os, "mac") == 0) { | 408 if (strcmp(os, "mac") == 0) { |
| 535 info.os = GetPlatformInfo::Results::PlatformInfo::OS_MAC_; | 409 info.os = GetPlatformInfo::Results::PlatformInfo::OS_MAC_; |
| 536 } else if (strcmp(os, "win") == 0) { | 410 } else if (strcmp(os, "win") == 0) { |
| 537 info.os = GetPlatformInfo::Results::PlatformInfo::OS_WIN_; | 411 info.os = GetPlatformInfo::Results::PlatformInfo::OS_WIN_; |
| 538 } else if (strcmp(os, "android") == 0) { | 412 } else if (strcmp(os, "android") == 0) { |
| 539 info.os = GetPlatformInfo::Results::PlatformInfo::OS_ANDROID_; | 413 info.os = GetPlatformInfo::Results::PlatformInfo::OS_ANDROID_; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 569 info.nacl_arch = GetPlatformInfo::Results::PlatformInfo::NACL_ARCH_X86_64; | 443 info.nacl_arch = GetPlatformInfo::Results::PlatformInfo::NACL_ARCH_X86_64; |
| 570 } else { | 444 } else { |
| 571 NOTREACHED(); | 445 NOTREACHED(); |
| 572 return false; | 446 return false; |
| 573 } | 447 } |
| 574 | 448 |
| 575 results_ = GetPlatformInfo::Results::Create(info); | 449 results_ = GetPlatformInfo::Results::Create(info); |
| 576 return true; | 450 return true; |
| 577 } | 451 } |
| 578 | 452 |
| 453 ////////////////////////////////////////////////////////////////////////////// |
| 454 |
| 579 bool RuntimeGetPackageDirectoryEntryFunction::RunImpl() { | 455 bool RuntimeGetPackageDirectoryEntryFunction::RunImpl() { |
| 580 fileapi::IsolatedContext* isolated_context = | 456 fileapi::IsolatedContext* isolated_context = |
| 581 fileapi::IsolatedContext::GetInstance(); | 457 fileapi::IsolatedContext::GetInstance(); |
| 582 DCHECK(isolated_context); | 458 DCHECK(isolated_context); |
| 583 | 459 |
| 584 std::string relative_path = kPackageDirectoryPath; | 460 std::string relative_path = kPackageDirectoryPath; |
| 585 base::FilePath path = extension_->path(); | 461 base::FilePath path = extension_->path(); |
| 586 std::string filesystem_id = isolated_context->RegisterFileSystemForPath( | 462 std::string filesystem_id = isolated_context->RegisterFileSystemForPath( |
| 587 fileapi::kFileSystemTypeNativeLocal, path, &relative_path); | 463 fileapi::kFileSystemTypeNativeLocal, path, &relative_path); |
| 588 | 464 |
| 589 int renderer_id = render_view_host_->GetProcess()->GetID(); | 465 int renderer_id = render_view_host_->GetProcess()->GetID(); |
| 590 content::ChildProcessSecurityPolicy* policy = | 466 content::ChildProcessSecurityPolicy* policy = |
| 591 content::ChildProcessSecurityPolicy::GetInstance(); | 467 content::ChildProcessSecurityPolicy::GetInstance(); |
| 592 policy->GrantReadFileSystem(renderer_id, filesystem_id); | 468 policy->GrantReadFileSystem(renderer_id, filesystem_id); |
| 593 base::DictionaryValue* dict = new base::DictionaryValue(); | 469 base::DictionaryValue* dict = new base::DictionaryValue(); |
| 594 SetResult(dict); | 470 SetResult(dict); |
| 595 dict->SetString("fileSystemId", filesystem_id); | 471 dict->SetString("fileSystemId", filesystem_id); |
| 596 dict->SetString("baseName", relative_path); | 472 dict->SetString("baseName", relative_path); |
| 597 return true; | 473 return true; |
| 598 } | 474 } |
| 599 | 475 |
| 600 } // namespace extensions | 476 } // namespace extensions |
| OLD | NEW |