Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5556)

Unified Diff: chrome/browser/extensions/api/webstore_private/webstore_private_api.cc

Issue 850283003: Add a new webstorePrivate API to show a permission prompt for delegated installs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@testext_permission_prompt
Patch Set: allow dashboard Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 52aa1b88a57fc79a9d2e9ed1e71c07f1ea9f2f0a..46f5242efa28302e1be0786d12aa28d7a9702d76 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -65,6 +65,8 @@ namespace IsInIncognitoMode = api::webstore_private::IsInIncognitoMode;
namespace LaunchEphemeralApp = api::webstore_private::LaunchEphemeralApp;
namespace LaunchEphemeralAppResult = LaunchEphemeralApp::Results;
namespace SetStoreLogin = api::webstore_private::SetStoreLogin;
+namespace ShowPermissionPromptForDelegatedInstall =
+ api::webstore_private::ShowPermissionPromptForDelegatedInstall;
namespace {
@@ -509,6 +511,177 @@ void WebstorePrivateCompleteInstallFunction::OnInstallSuccess(
SendResponse(true);
}
+WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
+ WebstorePrivateShowPermissionPromptForDelegatedInstallFunction() {
+}
+
+WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
+ ~WebstorePrivateShowPermissionPromptForDelegatedInstallFunction() {
+}
+
+bool WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
+ RunAsync() {
+ params_ = ShowPermissionPromptForDelegatedInstall::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(params_);
+
+ if (!crx_file::id_util::IdIsValid(params_->details.id)) {
+ SetResultCode(INVALID_ID);
+ error_ = kInvalidIdError;
+ return false;
+ }
+
+ if (params_->details.icon_data && params_->details.icon_url) {
+ SetResultCode(ICON_ERROR);
+ error_ = kCannotSpecifyIconDataAndUrlError;
+ return false;
+ }
+
+ 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()) {
+ SetResultCode(INVALID_ICON_URL);
+ error_ = kInvalidIconUrlError;
+ return false;
+ }
+ }
+
+ std::string icon_data = params_->details.icon_data ?
+ *params_->details.icon_data : std::string();
+
+ net::URLRequestContextGetter* context_getter = NULL;
+ if (!icon_url.is_empty())
+ context_getter = GetProfile()->GetRequestContext();
+
+ scoped_refptr<WebstoreInstallHelper> helper = new WebstoreInstallHelper(
+ this, params_->details.id, params_->details.manifest, icon_data, icon_url,
+ context_getter);
+
+ // The helper will call us back via OnWebstoreParseSuccess or
+ // OnWebstoreParseFailure.
+ helper->Start();
+
+ // Matched with a Release in OnWebstoreParseSuccess/OnWebstoreParseFailure.
+ AddRef();
+
+ // The response is sent asynchronously in OnWebstoreParseSuccess/
+ // OnWebstoreParseFailure.
+ return true;
+}
+
+const char* WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
+ ResultCodeToString(ResultCode code) {
+ switch (code) {
+ case ERROR_NONE:
+ return "";
+ case UNKNOWN_ERROR:
+ return "unknown_error";
+ case USER_CANCELLED:
+ return "user_cancelled";
+ case MANIFEST_ERROR:
+ return "manifest_error";
+ case ICON_ERROR:
+ return "icon_error";
+ case INVALID_ID:
+ return "invalid_id";
+ case INVALID_ICON_URL:
+ return "invalid_icon_url";
+ }
+ NOTREACHED();
+ return "";
+}
+
+void WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
+ SetResultCode(ResultCode code) {
+ results_ = ShowPermissionPromptForDelegatedInstall::Results::Create(
+ ResultCodeToString(code));
+}
+
+void WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
+ OnWebstoreParseSuccess(const std::string& id,
+ const SkBitmap& icon,
+ base::DictionaryValue* parsed_manifest) {
+ CHECK_EQ(params_->details.id, id);
+ CHECK(parsed_manifest);
+ icon_ = icon;
+ parsed_manifest_.reset(parsed_manifest);
+
+ std::string localized_name = params_->details.localized_name ?
+ *params_->details.localized_name : std::string();
+
+ std::string error;
+ dummy_extension_ = ExtensionInstallPrompt::GetLocalizedExtensionForDisplay(
+ parsed_manifest_.get(),
+ Extension::FROM_WEBSTORE,
+ id,
+ localized_name,
+ std::string(),
+ &error);
+
+ if (!dummy_extension_.get()) {
+ OnWebstoreParseFailure(params_->details.id,
+ WebstoreInstallHelper::Delegate::MANIFEST_ERROR,
+ kInvalidManifestError);
+ return;
+ }
+
+ content::WebContents* web_contents = GetAssociatedWebContents();
+ if (!web_contents) // The browser window has gone away.
+ return;
+ install_prompt_.reset(new ExtensionInstallPrompt(web_contents));
+ install_prompt_->ConfirmPermissionsForDelegatedInstall(
+ this, dummy_extension_.get(), params_->details.delegated_user, &icon_);
+ // Control flow finishes up in InstallUIProceed or InstallUIAbort.
+}
+
+void WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
+ OnWebstoreParseFailure(
+ const std::string& id,
+ WebstoreInstallHelper::Delegate::InstallHelperResultCode result_code,
+ const std::string& error_message) {
+ CHECK_EQ(params_->details.id, id);
+
+ // Map from WebstoreInstallHelper's result codes to ours.
+ switch (result_code) {
+ case WebstoreInstallHelper::Delegate::UNKNOWN_ERROR:
+ SetResultCode(UNKNOWN_ERROR);
+ break;
+ case WebstoreInstallHelper::Delegate::ICON_ERROR:
+ SetResultCode(ICON_ERROR);
+ break;
+ case WebstoreInstallHelper::Delegate::MANIFEST_ERROR:
+ SetResultCode(MANIFEST_ERROR);
+ break;
+ default:
+ CHECK(false);
+ }
+ error_ = error_message;
+ SendResponse(false);
+
+ // Matches the AddRef in RunAsync().
+ Release();
+}
+
+void WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
+ InstallUIProceed() {
+ SetResultCode(ERROR_NONE);
+ SendResponse(true);
+
+ // Matches the AddRef in RunAsync().
+ Release();
+}
+
+void WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
+ InstallUIAbort(bool user_initiated) {
+ error_ = kUserCancelledError;
+ SetResultCode(USER_CANCELLED);
+ SendResponse(false);
+
+ // Matches the AddRef in RunAsync().
+ Release();
+}
+
WebstorePrivateEnableAppLauncherFunction::
WebstorePrivateEnableAppLauncherFunction() {}

Powered by Google App Engine
This is Rietveld 408576698