Index: chrome/browser/extensions/api/webstore_private/webstore_private_api.cc |
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc |
index 6453e460a25e6fe2f33359311421fb5a5c9205d3..a7d1a8bdaf40604980fa10f8176df1f28ab6ae1c 100644 |
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc |
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc |
@@ -46,6 +46,8 @@ namespace GetWebGLStatus = api::webstore_private::GetWebGLStatus; |
namespace IsInIncognitoMode = api::webstore_private::IsInIncognitoMode; |
namespace LaunchEphemeralApp = api::webstore_private::LaunchEphemeralApp; |
namespace SetStoreLogin = api::webstore_private::SetStoreLogin; |
+namespace ShowPermissionPromptForDelegatedInstall = |
+ api::webstore_private::ShowPermissionPromptForDelegatedInstall; |
namespace { |
@@ -133,6 +135,20 @@ api::webstore_private::Result WebstoreInstallResultToApiResult( |
return api::webstore_private::RESULT_NONE; |
} |
+api::webstore_private::Result WebstoreInstallHelperResultToApiResult( |
+ WebstoreInstallHelper::Delegate::InstallHelperResultCode result) { |
+ switch (result) { |
+ case WebstoreInstallHelper::Delegate::UNKNOWN_ERROR: |
+ return api::webstore_private::RESULT_UNKNOWN_ERROR; |
+ case WebstoreInstallHelper::Delegate::ICON_ERROR: |
+ return api::webstore_private::RESULT_ICON_ERROR; |
+ case WebstoreInstallHelper::Delegate::MANIFEST_ERROR: |
+ return api::webstore_private::RESULT_MANIFEST_ERROR; |
+ } |
+ NOTREACHED(); |
+ return api::webstore_private::RESULT_NONE; |
+} |
+ |
static base::LazyInstance<PendingApprovals> g_pending_approvals = |
LAZY_INSTANCE_INITIALIZER; |
@@ -185,60 +201,62 @@ WebstorePrivateApi::PopApprovalForTesting( |
return g_pending_approvals.Get().PopApproval(profile, extension_id); |
} |
-WebstorePrivateBeginInstallWithManifest3Function:: |
- WebstorePrivateBeginInstallWithManifest3Function() : chrome_details_(this) { |
+template<typename Params> |
+WebstorePrivateFunctionWithPermissionPrompt<Params>:: |
+ WebstorePrivateFunctionWithPermissionPrompt() { |
} |
-WebstorePrivateBeginInstallWithManifest3Function:: |
- ~WebstorePrivateBeginInstallWithManifest3Function() { |
+template<typename Params> |
+WebstorePrivateFunctionWithPermissionPrompt<Params>:: |
+ ~WebstorePrivateFunctionWithPermissionPrompt() { |
+} |
+ |
+template<typename Params> |
+bool WebstorePrivateFunctionWithPermissionPrompt<Params>::RunImpl( |
+ api::webstore_private::Result* result, |
+ std::string* error) { |
+ return false; |
} |
+template<typename Params> |
+scoped_ptr<base::DictionaryValue> |
+WebstorePrivateFunctionWithPermissionPrompt<Params>::PassParsedManifest() { |
+ return parsed_manifest_.Pass(); |
+} |
+ |
+template<typename Params> |
ExtensionFunction::ResponseAction |
-WebstorePrivateBeginInstallWithManifest3Function::Run() { |
- params_ = BeginInstallWithManifest3::Params::Create(*args_); |
+WebstorePrivateFunctionWithPermissionPrompt<Params>::Run() { |
+ params_ = Params::Create(*args_); |
EXTENSION_FUNCTION_VALIDATE(params_); |
if (!crx_file::id_util::IdIsValid(params_->details.id)) { |
- return RespondNow(BuildResponseForError( |
- api::webstore_private::RESULT_INVALID_ID, |
- kInvalidIdError)); |
+ return RespondNow(BuildResponse(api::webstore_private::RESULT_INVALID_ID, |
+ kInvalidIdError)); |
} |
if (params_->details.icon_data && params_->details.icon_url) { |
- return RespondNow(BuildResponseForError( |
- api::webstore_private::RESULT_ICON_ERROR, |
- kCannotSpecifyIconDataAndUrlError)); |
+ return RespondNow(BuildResponse(api::webstore_private::RESULT_ICON_ERROR, |
+ kCannotSpecifyIconDataAndUrlError)); |
} |
GURL icon_url; |
if (params_->details.icon_url) { |
- std::string tmp_url; |
icon_url = source_url().Resolve(*params_->details.icon_url); |
if (!icon_url.is_valid()) { |
- return RespondNow(BuildResponseForError( |
+ return RespondNow(BuildResponse( |
api::webstore_private::RESULT_INVALID_ICON_URL, |
kInvalidIconUrlError)); |
} |
} |
- if (params_->details.authuser) { |
- authuser_ = *params_->details.authuser; |
- } |
- |
std::string icon_data = params_->details.icon_data ? |
*params_->details.icon_data : std::string(); |
- InstallTracker* tracker = InstallTracker::Get(browser_context()); |
- DCHECK(tracker); |
- if (util::IsExtensionInstalledPermanently(params_->details.id, |
- browser_context()) || |
- tracker->GetActiveInstall(params_->details.id)) { |
- return RespondNow(BuildResponseForError( |
- api::webstore_private::RESULT_ALREADY_INSTALLED, |
- kAlreadyInstalledError)); |
- } |
- ActiveInstallData install_data(params_->details.id); |
- scoped_active_install_.reset(new ScopedActiveInstall(tracker, install_data)); |
+ api::webstore_private::Result result; |
+ std::string error; |
+ if (RunImpl(&result, &error)) |
not at google - send to devlin
2015/02/25 17:23:00
RunImpl isn't a very helpful name. How about a met
not at google - send to devlin
2015/02/25 17:24:41
RunExtraForResponse? RunHookForResponse?
Marc Treib
2015/02/26 11:49:58
Done.
|
+ return RespondNow(BuildResponse(result, error)); |
net::URLRequestContextGetter* context_getter = NULL; |
if (!icon_url.is_empty()) |
@@ -246,7 +264,7 @@ WebstorePrivateBeginInstallWithManifest3Function::Run() { |
scoped_refptr<WebstoreInstallHelper> helper = new WebstoreInstallHelper( |
this, params_->details.id, params_->details.manifest, icon_data, icon_url, |
- context_getter); |
+ context_getter); |
// The helper will call us back via OnWebstoreParseSuccess or |
// OnWebstoreParseFailure. |
@@ -260,7 +278,9 @@ WebstorePrivateBeginInstallWithManifest3Function::Run() { |
return RespondLater(); |
} |
-void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess( |
+template<typename Params> |
+void |
+WebstorePrivateFunctionWithPermissionPrompt<Params>::OnWebstoreParseSuccess( |
const std::string& id, |
const SkBitmap& icon, |
base::DictionaryValue* parsed_manifest) { |
@@ -289,118 +309,149 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess( |
} |
content::WebContents* web_contents = GetAssociatedWebContents(); |
- if (!web_contents) // The browser window has gone away. |
+ if (!web_contents) { |
+ // The browser window has gone away. |
+ Respond(BuildResponse(api::webstore_private::RESULT_USER_CANCELLED, |
+ kUserCancelledError)); |
+ // Matches the AddRef in Run(). |
+ Release(); |
return; |
+ } |
install_prompt_.reset(new ExtensionInstallPrompt(web_contents)); |
- install_prompt_->ConfirmWebstoreInstall( |
- this, |
- dummy_extension_.get(), |
- &icon_, |
- ExtensionInstallPrompt::GetDefaultShowDialogCallback()); |
+ ShowPrompt(install_prompt_.get()); |
// Control flow finishes up in InstallUIProceed or InstallUIAbort. |
} |
-void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseFailure( |
+template<typename Params> |
+void |
+WebstorePrivateFunctionWithPermissionPrompt<Params>::OnWebstoreParseFailure( |
const std::string& id, |
WebstoreInstallHelper::Delegate::InstallHelperResultCode result, |
const std::string& error_message) { |
CHECK_EQ(params_->details.id, id); |
- // Map from WebstoreInstallHelper's result codes to ours. |
- api::webstore_private::Result api_result = |
- api::webstore_private::RESULT_NONE; |
- switch (result) { |
- case WebstoreInstallHelper::Delegate::UNKNOWN_ERROR: |
- api_result = api::webstore_private::RESULT_UNKNOWN_ERROR; |
- break; |
- case WebstoreInstallHelper::Delegate::ICON_ERROR: |
- api_result = api::webstore_private::RESULT_ICON_ERROR; |
- break; |
- case WebstoreInstallHelper::Delegate::MANIFEST_ERROR: |
- api_result = api::webstore_private::RESULT_MANIFEST_ERROR; |
- break; |
- } |
- DCHECK_NE(api_result, api::webstore_private::RESULT_NONE); |
- Respond(BuildResponseForError(api_result, error_message)); |
+ Respond(BuildResponse(WebstoreInstallHelperResultToApiResult(result), |
+ error_message)); |
+ |
+ // Matches the AddRef in Run(). |
+ Release(); |
+} |
+ |
+template<typename Params> |
+void WebstorePrivateFunctionWithPermissionPrompt<Params>::InstallUIProceed() { |
not at google - send to devlin
2015/02/25 17:23:00
It would be nice to avoid needing these extra Inst
Marc Treib
2015/02/26 11:49:58
I'm not sure I understand the question. These are
|
+ OnInstallUIProceed(); |
+ |
+ Respond(BuildResponse(api::webstore_private::RESULT_SUCCESS, std::string())); |
+ |
+ // Matches the AddRef in Run(). |
+ Release(); |
+} |
+ |
+template<typename Params> |
+void WebstorePrivateFunctionWithPermissionPrompt<Params>::InstallUIAbort( |
+ bool user_initiated) { |
+ OnInstallUIAbort(user_initiated); |
+ |
+ Respond(BuildResponse(api::webstore_private::RESULT_USER_CANCELLED, |
+ kUserCancelledError)); |
// Matches the AddRef in Run(). |
Release(); |
} |
-void WebstorePrivateBeginInstallWithManifest3Function::InstallUIProceed() { |
+WebstorePrivateBeginInstallWithManifest3Function:: |
+ WebstorePrivateBeginInstallWithManifest3Function() : chrome_details_(this) { |
+} |
+ |
+WebstorePrivateBeginInstallWithManifest3Function:: |
+ ~WebstorePrivateBeginInstallWithManifest3Function() { |
+} |
+ |
+bool WebstorePrivateBeginInstallWithManifest3Function::RunImpl( |
+ api::webstore_private::Result* result, |
+ std::string* error) { |
+ InstallTracker* tracker = InstallTracker::Get(browser_context()); |
+ DCHECK(tracker); |
+ if (util::IsExtensionInstalledPermanently(params().details.id, |
+ browser_context()) || |
+ tracker->GetActiveInstall(params().details.id)) { |
+ *result = api::webstore_private::RESULT_ALREADY_INSTALLED; |
+ *error = kAlreadyInstalledError; |
+ return true; |
+ } |
+ ActiveInstallData install_data(params().details.id); |
+ scoped_active_install_.reset(new ScopedActiveInstall(tracker, install_data)); |
+ return false; |
+} |
+ |
+void WebstorePrivateBeginInstallWithManifest3Function::OnInstallUIProceed() { |
// This gets cleared in CrxInstaller::ConfirmInstall(). TODO(asargent) - in |
// the future we may also want to add time-based expiration, where a whitelist |
// entry is only valid for some number of minutes. |
scoped_ptr<WebstoreInstaller::Approval> approval( |
WebstoreInstaller::Approval::CreateWithNoInstallPrompt( |
chrome_details_.GetProfile(), |
- params_->details.id, |
- parsed_manifest_.Pass(), |
+ params().details.id, |
+ PassParsedManifest(), |
false)); |
- approval->use_app_installed_bubble = params_->details.app_install_bubble; |
- approval->enable_launcher = params_->details.enable_launcher; |
+ approval->use_app_installed_bubble = params().details.app_install_bubble; |
+ approval->enable_launcher = params().details.enable_launcher; |
// If we are enabling the launcher, we should not show the app list in order |
// to train the user to open it themselves at least once. |
- approval->skip_post_install_ui = params_->details.enable_launcher; |
- approval->dummy_extension = dummy_extension_; |
- approval->installing_icon = gfx::ImageSkia::CreateFrom1xBitmap(icon_); |
- approval->authuser = authuser_; |
+ approval->skip_post_install_ui = params().details.enable_launcher; |
+ approval->dummy_extension = dummy_extension(); |
+ approval->installing_icon = gfx::ImageSkia::CreateFrom1xBitmap(icon()); |
+ if (params().details.authuser) |
+ approval->authuser = *params().details.authuser; |
g_pending_approvals.Get().PushApproval(approval.Pass()); |
DCHECK(scoped_active_install_.get()); |
scoped_active_install_->CancelDeregister(); |
- Respond(BuildResponseForSuccess()); |
- |
// The Permissions_Install histogram is recorded from the ExtensionService |
// for all extension installs, so we only need to record the web store |
// specific histogram here. |
ExtensionService::RecordPermissionMessagesHistogram( |
- dummy_extension_.get(), "Extensions.Permissions_WebStoreInstall2"); |
- |
- // Matches the AddRef in Run(). |
- Release(); |
+ dummy_extension().get(), "Extensions.Permissions_WebStoreInstall2"); |
} |
-void WebstorePrivateBeginInstallWithManifest3Function::InstallUIAbort( |
+void WebstorePrivateBeginInstallWithManifest3Function::OnInstallUIAbort( |
bool user_initiated) { |
- Respond(BuildResponseForError( |
- api::webstore_private::RESULT_USER_CANCELLED, |
- kUserCancelledError)); |
- |
// The web store install histograms are a subset of the install histograms. |
// We need to record both histograms here since CrxInstaller::InstallUIAbort |
// is never called for web store install cancellations. |
std::string histogram_name = |
user_initiated ? "Extensions.Permissions_WebStoreInstallCancel2" |
: "Extensions.Permissions_WebStoreInstallAbort2"; |
- ExtensionService::RecordPermissionMessagesHistogram(dummy_extension_.get(), |
+ ExtensionService::RecordPermissionMessagesHistogram(dummy_extension().get(), |
histogram_name.c_str()); |
histogram_name = user_initiated ? "Extensions.Permissions_InstallCancel2" |
: "Extensions.Permissions_InstallAbort2"; |
- ExtensionService::RecordPermissionMessagesHistogram(dummy_extension_.get(), |
+ ExtensionService::RecordPermissionMessagesHistogram(dummy_extension().get(), |
histogram_name.c_str()); |
+} |
- // Matches the AddRef in Run(). |
- Release(); |
+void WebstorePrivateBeginInstallWithManifest3Function::ShowPrompt( |
+ ExtensionInstallPrompt* install_prompt) { |
+ install_prompt->ConfirmWebstoreInstall( |
+ this, dummy_extension().get(), &icon(), |
+ ExtensionInstallPrompt::GetDefaultShowDialogCallback()); |
} |
ExtensionFunction::ResponseValue |
-WebstorePrivateBeginInstallWithManifest3Function::BuildResponseForSuccess() { |
+WebstorePrivateBeginInstallWithManifest3Function::BuildResponse( |
+ api::webstore_private::Result result, const std::string& error) { |
+ if (result != api::webstore_private::RESULT_SUCCESS) { |
+ return ErrorWithArguments( |
+ BeginInstallWithManifest3::Results::Create(result), error); |
+ } |
// The web store expects an empty string on success, so don't use |
// RESULT_SUCCESS here. |
return ArgumentList(BeginInstallWithManifest3::Results::Create( |
api::webstore_private::RESULT_EMPTY_STRING)); |
} |
-ExtensionFunction::ResponseValue |
-WebstorePrivateBeginInstallWithManifest3Function::BuildResponseForError( |
- api::webstore_private::Result result, const std::string& error) { |
- return ErrorWithArguments(BeginInstallWithManifest3::Results::Create(result), |
- error); |
-} |
- |
WebstorePrivateCompleteInstallFunction:: |
WebstorePrivateCompleteInstallFunction() : chrome_details_(this) {} |
@@ -516,6 +567,32 @@ void WebstorePrivateCompleteInstallFunction::OnInstallSuccess( |
test_webstore_installer_delegate->OnExtensionInstallSuccess(id); |
} |
+WebstorePrivateShowPermissionPromptForDelegatedInstallFunction:: |
+ WebstorePrivateShowPermissionPromptForDelegatedInstallFunction() { |
+} |
+ |
+WebstorePrivateShowPermissionPromptForDelegatedInstallFunction:: |
+ ~WebstorePrivateShowPermissionPromptForDelegatedInstallFunction() { |
+} |
+ |
+void WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::ShowPrompt( |
+ ExtensionInstallPrompt* install_prompt) { |
+ install_prompt->ConfirmPermissionsForDelegatedInstall( |
+ this, dummy_extension().get(), params().details.delegated_user, &icon()); |
+} |
+ |
+ExtensionFunction::ResponseValue |
+WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::BuildResponse( |
+ api::webstore_private::Result result, const std::string& error) { |
+ if (result != api::webstore_private::RESULT_SUCCESS) { |
+ return ErrorWithArguments( |
+ ShowPermissionPromptForDelegatedInstall::Results::Create(result), |
+ error); |
+ } |
+ return ArgumentList( |
+ ShowPermissionPromptForDelegatedInstall::Results::Create(result)); |
not at google - send to devlin
2015/02/25 17:23:00
For better or worse, I think showPermissionPromptF
Marc Treib
2015/02/26 11:49:58
Hrm... alright, consistency over correctness, I gu
not at google - send to devlin
2015/02/26 17:25:07
See last comment I left.
|
+} |
+ |
WebstorePrivateEnableAppLauncherFunction:: |
WebstorePrivateEnableAppLauncherFunction() : chrome_details_(this) {} |