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