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/webstore_private/webstore_private_api.h" | 5 #include "chrome/browser/extensions/api/webstore_private/webstore_private_api.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 icon_url = source_url().Resolve(*details().icon_url); | 200 icon_url = source_url().Resolve(*details().icon_url); |
201 if (!icon_url.is_valid()) { | 201 if (!icon_url.is_valid()) { |
202 return RespondNow(BuildResponse( | 202 return RespondNow(BuildResponse( |
203 api::webstore_private::RESULT_INVALID_ICON_URL, | 203 api::webstore_private::RESULT_INVALID_ICON_URL, |
204 kInvalidIconUrlError)); | 204 kInvalidIconUrlError)); |
205 } | 205 } |
206 } | 206 } |
207 | 207 |
208 InstallTracker* tracker = InstallTracker::Get(browser_context()); | 208 InstallTracker* tracker = InstallTracker::Get(browser_context()); |
209 DCHECK(tracker); | 209 DCHECK(tracker); |
210 if (util::IsExtensionInstalledPermanently(details().id, browser_context()) || | 210 bool is_installed = |
211 tracker->GetActiveInstall(details().id)) { | 211 extensions::ExtensionRegistry::Get(browser_context())->GetExtensionById( |
| 212 details().id, extensions::ExtensionRegistry::EVERYTHING) != nullptr; |
| 213 if (is_installed || tracker->GetActiveInstall(details().id)) { |
212 return RespondNow(BuildResponse( | 214 return RespondNow(BuildResponse( |
213 api::webstore_private::RESULT_ALREADY_INSTALLED, | 215 api::webstore_private::RESULT_ALREADY_INSTALLED, |
214 kAlreadyInstalledError)); | 216 kAlreadyInstalledError)); |
215 } | 217 } |
216 ActiveInstallData install_data(details().id); | 218 ActiveInstallData install_data(details().id); |
217 scoped_active_install_.reset(new ScopedActiveInstall(tracker, install_data)); | 219 scoped_active_install_.reset(new ScopedActiveInstall(tracker, install_data)); |
218 | 220 |
219 net::URLRequestContextGetter* context_getter = nullptr; | 221 net::URLRequestContextGetter* context_getter = nullptr; |
220 if (!icon_url.is_empty()) | 222 if (!icon_url.is_empty()) |
221 context_getter = browser_context()->GetRequestContext(); | 223 context_getter = browser_context()->GetRequestContext(); |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 | 421 |
420 if (IsAppLauncherEnabled() && approval_->manifest->is_app()) { | 422 if (IsAppLauncherEnabled() && approval_->manifest->is_app()) { |
421 // Show the app list to show download is progressing. Don't show the app | 423 // Show the app list to show download is progressing. Don't show the app |
422 // list on first app install so users can be trained to open it themselves. | 424 // list on first app install so users can be trained to open it themselves. |
423 app_list_service->ShowForAppInstall( | 425 app_list_service->ShowForAppInstall( |
424 chrome_details_.GetProfile(), | 426 chrome_details_.GetProfile(), |
425 params->expected_id, | 427 params->expected_id, |
426 approval_->enable_launcher); | 428 approval_->enable_launcher); |
427 } | 429 } |
428 | 430 |
429 // If the target extension has already been installed ephemerally and is | |
430 // up to date, it can be promoted to a regular installed extension and | |
431 // downloading from the Web Store is not necessary. | |
432 const Extension* extension = ExtensionRegistry::Get(browser_context())-> | |
433 GetExtensionById(params->expected_id, ExtensionRegistry::EVERYTHING); | |
434 if (extension && approval_->dummy_extension.get() && | |
435 util::IsEphemeralApp(extension->id(), browser_context()) && | |
436 extension->version()->CompareTo(*approval_->dummy_extension->version()) >= | |
437 0) { | |
438 install_ui::ShowPostInstallUIForApproval( | |
439 browser_context(), *approval_, extension); | |
440 | |
441 ExtensionService* extension_service = | |
442 ExtensionSystem::Get(browser_context())->extension_service(); | |
443 extension_service->PromoteEphemeralApp(extension, false); | |
444 OnInstallSuccess(extension->id()); | |
445 VLOG(1) << "Install success, sending response"; | |
446 return RespondNow(NoArguments()); | |
447 } | |
448 | |
449 // Balanced in OnExtensionInstallSuccess() or OnExtensionInstallFailure(). | 431 // Balanced in OnExtensionInstallSuccess() or OnExtensionInstallFailure(). |
450 AddRef(); | 432 AddRef(); |
451 | 433 |
452 // The extension will install through the normal extension install flow, but | 434 // The extension will install through the normal extension install flow, but |
453 // the whitelist entry will bypass the normal permissions install dialog. | 435 // the whitelist entry will bypass the normal permissions install dialog. |
454 scoped_refptr<WebstoreInstaller> installer = new WebstoreInstaller( | 436 scoped_refptr<WebstoreInstaller> installer = new WebstoreInstaller( |
455 chrome_details_.GetProfile(), | 437 chrome_details_.GetProfile(), |
456 this, | 438 this, |
457 chrome_details_.GetAssociatedWebContents(), | 439 chrome_details_.GetAssociatedWebContents(), |
458 params->expected_id, | 440 params->expected_id, |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 // The response is sent asynchronously in OnFetchComplete, OnInstallApproval, | 519 // The response is sent asynchronously in OnFetchComplete, OnInstallApproval, |
538 // or OnInstallComplete. | 520 // or OnInstallComplete. |
539 return RespondLater(); | 521 return RespondLater(); |
540 } | 522 } |
541 | 523 |
542 void WebstorePrivateInstallBundleFunction::OnFetchComplete( | 524 void WebstorePrivateInstallBundleFunction::OnFetchComplete( |
543 const GURL& url, const SkBitmap* bitmap) { | 525 const GURL& url, const SkBitmap* bitmap) { |
544 BundleInstaller::ItemList items; | 526 BundleInstaller::ItemList items; |
545 for (const auto& entry : params_->contents) { | 527 for (const auto& entry : params_->contents) { |
546 // Skip already-installed items. | 528 // Skip already-installed items. |
547 if (util::IsExtensionInstalledPermanently(entry->id, browser_context()) || | 529 bool is_installed = |
| 530 extensions::ExtensionRegistry::Get(browser_context())->GetExtensionById( |
| 531 entry->id, extensions::ExtensionRegistry::EVERYTHING) != nullptr; |
| 532 if (is_installed || |
548 InstallTracker::Get(browser_context())->GetActiveInstall(entry->id)) { | 533 InstallTracker::Get(browser_context())->GetActiveInstall(entry->id)) { |
549 continue; | 534 continue; |
550 } | 535 } |
551 BundleInstaller::Item item; | 536 BundleInstaller::Item item; |
552 item.id = entry->id; | 537 item.id = entry->id; |
553 item.manifest = entry->manifest; | 538 item.manifest = entry->manifest; |
554 item.localized_name = entry->localized_name; | 539 item.localized_name = entry->localized_name; |
555 if (entry->icon_url) | 540 if (entry->icon_url) |
556 item.icon_url = source_url().Resolve(*entry->icon_url); | 541 item.icon_url = source_url().Resolve(*entry->icon_url); |
557 items.push_back(item); | 542 items.push_back(item); |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 WebstorePrivateGetEphemeralAppsEnabledFunction:: | 702 WebstorePrivateGetEphemeralAppsEnabledFunction:: |
718 ~WebstorePrivateGetEphemeralAppsEnabledFunction() {} | 703 ~WebstorePrivateGetEphemeralAppsEnabledFunction() {} |
719 | 704 |
720 ExtensionFunction::ResponseAction | 705 ExtensionFunction::ResponseAction |
721 WebstorePrivateGetEphemeralAppsEnabledFunction::Run() { | 706 WebstorePrivateGetEphemeralAppsEnabledFunction::Run() { |
722 return RespondNow(ArgumentList(GetEphemeralAppsEnabled::Results::Create( | 707 return RespondNow(ArgumentList(GetEphemeralAppsEnabled::Results::Create( |
723 false))); | 708 false))); |
724 } | 709 } |
725 | 710 |
726 } // namespace extensions | 711 } // namespace extensions |
OLD | NEW |