Chromium Code Reviews| 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 "apps/app_launcher.h" | 7 #include "apps/app_launcher.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 79 WebstoreInstaller::Approval* approval = approvals[i]; | 79 WebstoreInstaller::Approval* approval = approvals[i]; |
| 80 if (approval->extension_id == id && | 80 if (approval->extension_id == id && |
| 81 profile->IsSameProfile(approval->profile)) { | 81 profile->IsSameProfile(approval->profile)) { |
| 82 approvals.weak_erase(approvals.begin() + i); | 82 approvals.weak_erase(approvals.begin() + i); |
| 83 return scoped_ptr<WebstoreInstaller::Approval>(approval); | 83 return scoped_ptr<WebstoreInstaller::Approval>(approval); |
| 84 } | 84 } |
| 85 } | 85 } |
| 86 return scoped_ptr<WebstoreInstaller::Approval>(NULL); | 86 return scoped_ptr<WebstoreInstaller::Approval>(NULL); |
| 87 } | 87 } |
| 88 | 88 |
| 89 // Uniquely holds the profile and extension id of an install between the time we | |
| 90 // prompt and complete the installs. | |
| 91 struct PendingInstalls { | |
|
koz (OOO until 15th September)
2013/05/20 23:57:12
Make this a class with |installs_| and related typ
calamity
2013/05/21 00:49:41
Done.
| |
| 92 typedef std::pair<Profile*, std::string> ProfileAndExtensionId; | |
| 93 typedef std::vector<ProfileAndExtensionId> InstallList; | |
| 94 | |
| 95 bool InsertInstall(Profile* profile, const std::string& id); | |
| 96 void EraseInstall(Profile* profile, const std::string& id); | |
| 97 InstallList::iterator FindInstall(Profile* profile, const std::string& id); | |
| 98 | |
| 99 InstallList installs_; | |
| 100 }; | |
| 101 | |
| 102 // Returns true and inserts the profile/id pair if it is not present. Otherwise | |
| 103 // returns false. | |
| 104 bool PendingInstalls::InsertInstall(Profile* profile, const std::string& id) { | |
| 105 if (FindInstall(profile, id) != installs_.end()) { | |
|
koz (OOO until 15th September)
2013/05/20 23:57:12
nit: no curlies
calamity
2013/05/21 00:49:41
Done.
| |
| 106 return false; | |
| 107 } | |
| 108 installs_.push_back(make_pair(profile, id)); | |
| 109 return true; | |
| 110 } | |
| 111 | |
| 112 // Removes the given profile/id pair. | |
| 113 void PendingInstalls::EraseInstall(Profile* profile, const std::string& id) { | |
| 114 InstallList::iterator it = FindInstall(profile, id); | |
| 115 if (it != installs_.end()) { | |
|
koz (OOO until 15th September)
2013/05/20 23:57:12
nit: no curlies
calamity
2013/05/21 00:49:41
Done.
| |
| 116 installs_.erase(it); | |
| 117 } | |
| 118 } | |
| 119 | |
| 120 PendingInstalls::InstallList::iterator PendingInstalls::FindInstall( | |
| 121 Profile* profile, | |
| 122 const std::string& id) { | |
| 123 for (size_t i = 0; i < installs_.size(); ++i) { | |
| 124 ProfileAndExtensionId install = installs_[i]; | |
| 125 if (install.second == id && | |
| 126 profile->IsSameProfile(install.first)) { | |
| 127 return (installs_.begin() + i); | |
| 128 } | |
| 129 } | |
| 130 return installs_.end(); | |
| 131 } | |
| 132 | |
| 89 static base::LazyInstance<PendingApprovals> g_pending_approvals = | 133 static base::LazyInstance<PendingApprovals> g_pending_approvals = |
| 90 LAZY_INSTANCE_INITIALIZER; | 134 LAZY_INSTANCE_INITIALIZER; |
| 135 static base::LazyInstance<PendingInstalls> g_pending_installs = | |
| 136 LAZY_INSTANCE_INITIALIZER; | |
| 91 | 137 |
| 92 const char kAppInstallBubbleKey[] = "appInstallBubble"; | 138 const char kAppInstallBubbleKey[] = "appInstallBubble"; |
| 93 const char kEnableLauncherKey[] = "enableLauncher"; | 139 const char kEnableLauncherKey[] = "enableLauncher"; |
| 94 const char kIconDataKey[] = "iconData"; | 140 const char kIconDataKey[] = "iconData"; |
| 95 const char kIconUrlKey[] = "iconUrl"; | 141 const char kIconUrlKey[] = "iconUrl"; |
| 96 const char kIdKey[] = "id"; | 142 const char kIdKey[] = "id"; |
| 97 const char kLocalizedNameKey[] = "localizedName"; | 143 const char kLocalizedNameKey[] = "localizedName"; |
| 98 const char kLoginKey[] = "login"; | 144 const char kLoginKey[] = "login"; |
| 99 const char kManifestKey[] = "manifest"; | 145 const char kManifestKey[] = "manifest"; |
| 100 | 146 |
| 147 const char kAlreadyInstalledError[] = "This item is already installed"; | |
| 101 const char kCannotSpecifyIconDataAndUrlError[] = | 148 const char kCannotSpecifyIconDataAndUrlError[] = |
| 102 "You cannot specify both icon data and an icon url"; | 149 "You cannot specify both icon data and an icon url"; |
| 103 const char kInvalidIconUrlError[] = "Invalid icon url"; | 150 const char kInvalidIconUrlError[] = "Invalid icon url"; |
| 104 const char kInvalidIdError[] = "Invalid id"; | 151 const char kInvalidIdError[] = "Invalid id"; |
| 105 const char kInvalidManifestError[] = "Invalid manifest"; | 152 const char kInvalidManifestError[] = "Invalid manifest"; |
| 106 const char kNoPreviousBeginInstallWithManifestError[] = | 153 const char kNoPreviousBeginInstallWithManifestError[] = |
| 107 "* does not match a previous call to beginInstallWithManifest3"; | 154 "* does not match a previous call to beginInstallWithManifest3"; |
| 108 const char kUserCancelledError[] = "User cancelled install"; | 155 const char kUserCancelledError[] = "User cancelled install"; |
| 109 | 156 |
| 110 // Helper to create a dictionary with login properties set from the appropriate | 157 // Helper to create a dictionary with login properties set from the appropriate |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 216 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details)); | 263 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details)); |
| 217 CHECK(details); | 264 CHECK(details); |
| 218 | 265 |
| 219 EXTENSION_FUNCTION_VALIDATE(details->GetString(kIdKey, &id_)); | 266 EXTENSION_FUNCTION_VALIDATE(details->GetString(kIdKey, &id_)); |
| 220 if (!extensions::Extension::IdIsValid(id_)) { | 267 if (!extensions::Extension::IdIsValid(id_)) { |
| 221 SetResultCode(INVALID_ID); | 268 SetResultCode(INVALID_ID); |
| 222 error_ = kInvalidIdError; | 269 error_ = kInvalidIdError; |
| 223 return false; | 270 return false; |
| 224 } | 271 } |
| 225 | 272 |
| 273 ExtensionService* service = | |
| 274 extensions::ExtensionSystem::Get(profile_)->extension_service(); | |
| 275 if (service->GetInstalledExtension(id_) || | |
| 276 !g_pending_installs.Get().InsertInstall(profile_, id_)) { | |
| 277 SetResultCode(ALREADY_INSTALLED); | |
| 278 error_ = kAlreadyInstalledError; | |
| 279 return false; | |
| 280 } | |
| 281 | |
| 226 EXTENSION_FUNCTION_VALIDATE(details->GetString(kManifestKey, &manifest_)); | 282 EXTENSION_FUNCTION_VALIDATE(details->GetString(kManifestKey, &manifest_)); |
| 227 | 283 |
| 228 if (details->HasKey(kIconDataKey) && details->HasKey(kIconUrlKey)) { | 284 if (details->HasKey(kIconDataKey) && details->HasKey(kIconUrlKey)) { |
| 229 SetResultCode(ICON_ERROR); | 285 SetResultCode(ICON_ERROR); |
| 230 error_ = kCannotSpecifyIconDataAndUrlError; | 286 error_ = kCannotSpecifyIconDataAndUrlError; |
| 231 return false; | 287 return false; |
| 232 } | 288 } |
| 233 | 289 |
| 234 if (details->HasKey(kIconDataKey)) | 290 if (details->HasKey(kIconDataKey)) |
| 235 EXTENSION_FUNCTION_VALIDATE(details->GetString(kIconDataKey, &icon_data_)); | 291 EXTENSION_FUNCTION_VALIDATE(details->GetString(kIconDataKey, &icon_data_)); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 300 break; | 356 break; |
| 301 case PERMISSION_DENIED: | 357 case PERMISSION_DENIED: |
| 302 SetResult(Value::CreateStringValue("permission_denied")); | 358 SetResult(Value::CreateStringValue("permission_denied")); |
| 303 break; | 359 break; |
| 304 case INVALID_ICON_URL: | 360 case INVALID_ICON_URL: |
| 305 SetResult(Value::CreateStringValue("invalid_icon_url")); | 361 SetResult(Value::CreateStringValue("invalid_icon_url")); |
| 306 break; | 362 break; |
| 307 case SIGNIN_FAILED: | 363 case SIGNIN_FAILED: |
| 308 SetResult(Value::CreateStringValue("signin_failed")); | 364 SetResult(Value::CreateStringValue("signin_failed")); |
| 309 break; | 365 break; |
| 366 case ALREADY_INSTALLED: | |
| 367 SetResult(Value::CreateStringValue("already_installed")); | |
| 368 break; | |
| 310 default: | 369 default: |
| 311 CHECK(false); | 370 CHECK(false); |
| 312 } | 371 } |
| 313 } | 372 } |
| 314 | 373 |
| 315 void BeginInstallWithManifestFunction::OnWebstoreParseSuccess( | 374 void BeginInstallWithManifestFunction::OnWebstoreParseSuccess( |
| 316 const std::string& id, | 375 const std::string& id, |
| 317 const SkBitmap& icon, | 376 const SkBitmap& icon, |
| 318 DictionaryValue* parsed_manifest) { | 377 DictionaryValue* parsed_manifest) { |
| 319 CHECK_EQ(id_, id); | 378 CHECK_EQ(id_, id); |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 525 &(dispatcher()->delegate()->GetAssociatedWebContents()->GetController()), | 584 &(dispatcher()->delegate()->GetAssociatedWebContents()->GetController()), |
| 526 id, approval_.Pass(), WebstoreInstaller::FLAG_NONE); | 585 id, approval_.Pass(), WebstoreInstaller::FLAG_NONE); |
| 527 installer->Start(); | 586 installer->Start(); |
| 528 } | 587 } |
| 529 | 588 |
| 530 void CompleteInstallFunction::OnExtensionInstallSuccess( | 589 void CompleteInstallFunction::OnExtensionInstallSuccess( |
| 531 const std::string& id) { | 590 const std::string& id) { |
| 532 if (test_webstore_installer_delegate) | 591 if (test_webstore_installer_delegate) |
| 533 test_webstore_installer_delegate->OnExtensionInstallSuccess(id); | 592 test_webstore_installer_delegate->OnExtensionInstallSuccess(id); |
| 534 | 593 |
| 594 g_pending_installs.Get().EraseInstall(profile_, id); | |
| 595 | |
| 535 LOG(INFO) << "Install success, sending response"; | 596 LOG(INFO) << "Install success, sending response"; |
| 536 SendResponse(true); | 597 SendResponse(true); |
| 537 | 598 |
| 538 // Matches the AddRef in RunImpl(). | 599 // Matches the AddRef in RunImpl(). |
| 539 Release(); | 600 Release(); |
| 540 } | 601 } |
| 541 | 602 |
| 542 void CompleteInstallFunction::OnExtensionInstallFailure( | 603 void CompleteInstallFunction::OnExtensionInstallFailure( |
| 543 const std::string& id, | 604 const std::string& id, |
| 544 const std::string& error, | 605 const std::string& error, |
| 545 WebstoreInstaller::FailureReason reason) { | 606 WebstoreInstaller::FailureReason reason) { |
| 546 extensions::InstallTracker* tracker = | 607 extensions::InstallTracker* tracker = |
| 547 extensions::InstallTrackerFactory::GetForProfile(profile()); | 608 extensions::InstallTrackerFactory::GetForProfile(profile()); |
| 548 tracker->OnInstallFailure(id); | 609 tracker->OnInstallFailure(id); |
| 549 if (test_webstore_installer_delegate) { | 610 if (test_webstore_installer_delegate) { |
| 550 test_webstore_installer_delegate->OnExtensionInstallFailure( | 611 test_webstore_installer_delegate->OnExtensionInstallFailure( |
| 551 id, error, reason); | 612 id, error, reason); |
| 552 } | 613 } |
| 553 | 614 |
| 615 g_pending_installs.Get().EraseInstall(profile_, id); | |
| 616 | |
| 554 error_ = error; | 617 error_ = error; |
| 555 LOG(INFO) << "Install failed, sending response"; | 618 LOG(INFO) << "Install failed, sending response"; |
| 556 SendResponse(false); | 619 SendResponse(false); |
| 557 | 620 |
| 558 // Matches the AddRef in RunImpl(). | 621 // Matches the AddRef in RunImpl(). |
| 559 Release(); | 622 Release(); |
| 560 } | 623 } |
| 561 | 624 |
| 562 void CompleteInstallFunction::OnExtensionDownloadProgress( | 625 void CompleteInstallFunction::OnExtensionDownloadProgress( |
| 563 const std::string& id, | 626 const std::string& id, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 640 &GetIsLauncherEnabledFunction::OnIsLauncherCheckCompleted, this)); | 703 &GetIsLauncherEnabledFunction::OnIsLauncherCheckCompleted, this)); |
| 641 return true; | 704 return true; |
| 642 } | 705 } |
| 643 | 706 |
| 644 void GetIsLauncherEnabledFunction::OnIsLauncherCheckCompleted(bool is_enabled) { | 707 void GetIsLauncherEnabledFunction::OnIsLauncherCheckCompleted(bool is_enabled) { |
| 645 SetResult(Value::CreateBooleanValue(is_enabled)); | 708 SetResult(Value::CreateBooleanValue(is_enabled)); |
| 646 SendResponse(true); | 709 SendResponse(true); |
| 647 } | 710 } |
| 648 | 711 |
| 649 } // namespace extensions | 712 } // namespace extensions |
| OLD | NEW |