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

Side by Side 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: histograms Created 5 years, 9 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 unified diff | Download patch
OLDNEW
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_helpers.h" 7 #include "base/bind_helpers.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 28 matching lines...) Expand all
39 namespace CompleteInstall = api::webstore_private::CompleteInstall; 39 namespace CompleteInstall = api::webstore_private::CompleteInstall;
40 namespace GetBrowserLogin = api::webstore_private::GetBrowserLogin; 40 namespace GetBrowserLogin = api::webstore_private::GetBrowserLogin;
41 namespace GetEphemeralAppsEnabled = 41 namespace GetEphemeralAppsEnabled =
42 api::webstore_private::GetEphemeralAppsEnabled; 42 api::webstore_private::GetEphemeralAppsEnabled;
43 namespace GetIsLauncherEnabled = api::webstore_private::GetIsLauncherEnabled; 43 namespace GetIsLauncherEnabled = api::webstore_private::GetIsLauncherEnabled;
44 namespace GetStoreLogin = api::webstore_private::GetStoreLogin; 44 namespace GetStoreLogin = api::webstore_private::GetStoreLogin;
45 namespace GetWebGLStatus = api::webstore_private::GetWebGLStatus; 45 namespace GetWebGLStatus = api::webstore_private::GetWebGLStatus;
46 namespace IsInIncognitoMode = api::webstore_private::IsInIncognitoMode; 46 namespace IsInIncognitoMode = api::webstore_private::IsInIncognitoMode;
47 namespace LaunchEphemeralApp = api::webstore_private::LaunchEphemeralApp; 47 namespace LaunchEphemeralApp = api::webstore_private::LaunchEphemeralApp;
48 namespace SetStoreLogin = api::webstore_private::SetStoreLogin; 48 namespace SetStoreLogin = api::webstore_private::SetStoreLogin;
49 namespace ShowPermissionPromptForDelegatedInstall =
50 api::webstore_private::ShowPermissionPromptForDelegatedInstall;
49 51
50 namespace { 52 namespace {
51 53
52 // Holds the Approvals between the time we prompt and start the installs. 54 // Holds the Approvals between the time we prompt and start the installs.
53 class PendingApprovals { 55 class PendingApprovals {
54 public: 56 public:
55 PendingApprovals(); 57 PendingApprovals();
56 ~PendingApprovals(); 58 ~PendingApprovals();
57 59
58 void PushApproval(scoped_ptr<WebstoreInstaller::Approval> approval); 60 void PushApproval(scoped_ptr<WebstoreInstaller::Approval> approval);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 return api::webstore_private::RESULT_UNSUPPORTED_EXTENSION_TYPE; 128 return api::webstore_private::RESULT_UNSUPPORTED_EXTENSION_TYPE;
127 case webstore_install::INSTALL_IN_PROGRESS: 129 case webstore_install::INSTALL_IN_PROGRESS:
128 return api::webstore_private::RESULT_INSTALL_IN_PROGRESS; 130 return api::webstore_private::RESULT_INSTALL_IN_PROGRESS;
129 case webstore_install::LAUNCH_IN_PROGRESS: 131 case webstore_install::LAUNCH_IN_PROGRESS:
130 return api::webstore_private::RESULT_LAUNCH_IN_PROGRESS; 132 return api::webstore_private::RESULT_LAUNCH_IN_PROGRESS;
131 } 133 }
132 NOTREACHED(); 134 NOTREACHED();
133 return api::webstore_private::RESULT_NONE; 135 return api::webstore_private::RESULT_NONE;
134 } 136 }
135 137
138 api::webstore_private::Result WebstoreInstallHelperResultToApiResult(
139 WebstoreInstallHelper::Delegate::InstallHelperResultCode result) {
140 switch (result) {
141 case WebstoreInstallHelper::Delegate::UNKNOWN_ERROR:
142 return api::webstore_private::RESULT_UNKNOWN_ERROR;
143 case WebstoreInstallHelper::Delegate::ICON_ERROR:
144 return api::webstore_private::RESULT_ICON_ERROR;
145 case WebstoreInstallHelper::Delegate::MANIFEST_ERROR:
146 return api::webstore_private::RESULT_MANIFEST_ERROR;
147 }
148 NOTREACHED();
149 return api::webstore_private::RESULT_NONE;
150 }
151
136 static base::LazyInstance<PendingApprovals> g_pending_approvals = 152 static base::LazyInstance<PendingApprovals> g_pending_approvals =
137 LAZY_INSTANCE_INITIALIZER; 153 LAZY_INSTANCE_INITIALIZER;
138 154
139 // A preference set by the web store to indicate login information for 155 // A preference set by the web store to indicate login information for
140 // purchased apps. 156 // purchased apps.
141 const char kWebstoreLogin[] = "extensions.webstore_login"; 157 const char kWebstoreLogin[] = "extensions.webstore_login";
142 const char kAlreadyInstalledError[] = "This item is already installed"; 158 const char kAlreadyInstalledError[] = "This item is already installed";
143 const char kCannotSpecifyIconDataAndUrlError[] = 159 const char kCannotSpecifyIconDataAndUrlError[] =
144 "You cannot specify both icon data and an icon url"; 160 "You cannot specify both icon data and an icon url";
145 const char kInvalidIconUrlError[] = "Invalid icon url"; 161 const char kInvalidIconUrlError[] = "Invalid icon url";
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 test_webstore_installer_delegate = delegate; 194 test_webstore_installer_delegate = delegate;
179 } 195 }
180 196
181 // static 197 // static
182 scoped_ptr<WebstoreInstaller::Approval> 198 scoped_ptr<WebstoreInstaller::Approval>
183 WebstorePrivateApi::PopApprovalForTesting( 199 WebstorePrivateApi::PopApprovalForTesting(
184 Profile* profile, const std::string& extension_id) { 200 Profile* profile, const std::string& extension_id) {
185 return g_pending_approvals.Get().PopApproval(profile, extension_id); 201 return g_pending_approvals.Get().PopApproval(profile, extension_id);
186 } 202 }
187 203
188 WebstorePrivateBeginInstallWithManifest3Function:: 204 template<typename Params>
189 WebstorePrivateBeginInstallWithManifest3Function() : chrome_details_(this) { 205 WebstorePrivateFunctionWithPermissionPrompt<Params>::
206 WebstorePrivateFunctionWithPermissionPrompt() {
190 } 207 }
191 208
192 WebstorePrivateBeginInstallWithManifest3Function:: 209 template<typename Params>
193 ~WebstorePrivateBeginInstallWithManifest3Function() { 210 WebstorePrivateFunctionWithPermissionPrompt<Params>::
211 ~WebstorePrivateFunctionWithPermissionPrompt() {
194 } 212 }
195 213
214 template<typename Params>
215 ExtensionFunction::ResponseValue
216 WebstorePrivateFunctionWithPermissionPrompt<Params>::RunExtraForResponse() {
217 return ExtensionFunction::ResponseValue();
218 }
219
220 template<typename Params>
221 ExtensionFunction::ResponseValue
222 WebstorePrivateFunctionWithPermissionPrompt<Params>::BuildResponse(
223 api::webstore_private::Result result, const std::string& error) {
224 if (result != api::webstore_private::RESULT_SUCCESS)
225 return ErrorWithArguments(CreateResults(result), error);
226
227 // The web store expects an empty string on success, so don't use
228 // RESULT_SUCCESS here.
229 return ArgumentList(
230 CreateResults(api::webstore_private::RESULT_EMPTY_STRING));
231 }
232
233 template<typename Params>
234 scoped_ptr<base::DictionaryValue>
235 WebstorePrivateFunctionWithPermissionPrompt<Params>::PassParsedManifest() {
236 return parsed_manifest_.Pass();
237 }
238
239 template<typename Params>
196 ExtensionFunction::ResponseAction 240 ExtensionFunction::ResponseAction
197 WebstorePrivateBeginInstallWithManifest3Function::Run() { 241 WebstorePrivateFunctionWithPermissionPrompt<Params>::Run() {
198 params_ = BeginInstallWithManifest3::Params::Create(*args_); 242 params_ = Params::Create(*args_);
199 EXTENSION_FUNCTION_VALIDATE(params_); 243 EXTENSION_FUNCTION_VALIDATE(params_);
200 244
201 if (!crx_file::id_util::IdIsValid(params_->details.id)) { 245 if (!crx_file::id_util::IdIsValid(params_->details.id)) {
202 return RespondNow(BuildResponseForError( 246 return RespondNow(BuildResponse(api::webstore_private::RESULT_INVALID_ID,
203 api::webstore_private::RESULT_INVALID_ID, 247 kInvalidIdError));
204 kInvalidIdError));
205 } 248 }
206 249
207 if (params_->details.icon_data && params_->details.icon_url) { 250 if (params_->details.icon_data && params_->details.icon_url) {
208 return RespondNow(BuildResponseForError( 251 return RespondNow(BuildResponse(api::webstore_private::RESULT_ICON_ERROR,
209 api::webstore_private::RESULT_ICON_ERROR, 252 kCannotSpecifyIconDataAndUrlError));
210 kCannotSpecifyIconDataAndUrlError));
211 } 253 }
212 254
213 GURL icon_url; 255 GURL icon_url;
214 if (params_->details.icon_url) { 256 if (params_->details.icon_url) {
215 std::string tmp_url;
216 icon_url = source_url().Resolve(*params_->details.icon_url); 257 icon_url = source_url().Resolve(*params_->details.icon_url);
217 if (!icon_url.is_valid()) { 258 if (!icon_url.is_valid()) {
218 return RespondNow(BuildResponseForError( 259 return RespondNow(BuildResponse(
219 api::webstore_private::RESULT_INVALID_ICON_URL, 260 api::webstore_private::RESULT_INVALID_ICON_URL,
220 kInvalidIconUrlError)); 261 kInvalidIconUrlError));
221 } 262 }
222 } 263 }
223 264
224 if (params_->details.authuser) {
225 authuser_ = *params_->details.authuser;
226 }
227
228 std::string icon_data = params_->details.icon_data ? 265 std::string icon_data = params_->details.icon_data ?
229 *params_->details.icon_data : std::string(); 266 *params_->details.icon_data : std::string();
230 267
231 InstallTracker* tracker = InstallTracker::Get(browser_context()); 268 ExtensionFunction::ResponseValue response = RunExtraForResponse();
232 DCHECK(tracker); 269 if (response)
233 if (util::IsExtensionInstalledPermanently(params_->details.id, 270 return RespondNow(response.Pass());
234 browser_context()) ||
235 tracker->GetActiveInstall(params_->details.id)) {
236 return RespondNow(BuildResponseForError(
237 api::webstore_private::RESULT_ALREADY_INSTALLED,
238 kAlreadyInstalledError));
239 }
240 ActiveInstallData install_data(params_->details.id);
241 scoped_active_install_.reset(new ScopedActiveInstall(tracker, install_data));
242 271
243 net::URLRequestContextGetter* context_getter = NULL; 272 net::URLRequestContextGetter* context_getter = NULL;
244 if (!icon_url.is_empty()) 273 if (!icon_url.is_empty())
245 context_getter = browser_context()->GetRequestContext(); 274 context_getter = browser_context()->GetRequestContext();
246 275
247 scoped_refptr<WebstoreInstallHelper> helper = new WebstoreInstallHelper( 276 scoped_refptr<WebstoreInstallHelper> helper = new WebstoreInstallHelper(
248 this, params_->details.id, params_->details.manifest, icon_data, icon_url, 277 this, params_->details.id, params_->details.manifest, icon_data, icon_url,
249 context_getter); 278 context_getter);
250 279
251 // The helper will call us back via OnWebstoreParseSuccess or 280 // The helper will call us back via OnWebstoreParseSuccess or
252 // OnWebstoreParseFailure. 281 // OnWebstoreParseFailure.
253 helper->Start(); 282 helper->Start();
254 283
255 // Matched with a Release in OnWebstoreParseSuccess/OnWebstoreParseFailure. 284 // Matched with a Release in OnWebstoreParseSuccess/OnWebstoreParseFailure.
256 AddRef(); 285 AddRef();
257 286
258 // The response is sent asynchronously in OnWebstoreParseSuccess/ 287 // The response is sent asynchronously in OnWebstoreParseSuccess/
259 // OnWebstoreParseFailure. 288 // OnWebstoreParseFailure.
260 return RespondLater(); 289 return RespondLater();
261 } 290 }
262 291
263 void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess( 292 template<typename Params>
293 void
294 WebstorePrivateFunctionWithPermissionPrompt<Params>::OnWebstoreParseSuccess(
264 const std::string& id, 295 const std::string& id,
265 const SkBitmap& icon, 296 const SkBitmap& icon,
266 base::DictionaryValue* parsed_manifest) { 297 base::DictionaryValue* parsed_manifest) {
267 CHECK_EQ(params_->details.id, id); 298 CHECK_EQ(params_->details.id, id);
268 CHECK(parsed_manifest); 299 CHECK(parsed_manifest);
269 icon_ = icon; 300 icon_ = icon;
270 parsed_manifest_.reset(parsed_manifest); 301 parsed_manifest_.reset(parsed_manifest);
271 302
272 std::string localized_name = params_->details.localized_name ? 303 std::string localized_name = params_->details.localized_name ?
273 *params_->details.localized_name : std::string(); 304 *params_->details.localized_name : std::string();
274 305
275 std::string error; 306 std::string error;
276 dummy_extension_ = ExtensionInstallPrompt::GetLocalizedExtensionForDisplay( 307 dummy_extension_ = ExtensionInstallPrompt::GetLocalizedExtensionForDisplay(
277 parsed_manifest_.get(), 308 parsed_manifest_.get(),
278 Extension::FROM_WEBSTORE, 309 Extension::FROM_WEBSTORE,
279 id, 310 id,
280 localized_name, 311 localized_name,
281 std::string(), 312 std::string(),
282 &error); 313 &error);
283 314
284 if (!dummy_extension_.get()) { 315 if (!dummy_extension_.get()) {
285 OnWebstoreParseFailure(params_->details.id, 316 OnWebstoreParseFailure(params_->details.id,
286 WebstoreInstallHelper::Delegate::MANIFEST_ERROR, 317 WebstoreInstallHelper::Delegate::MANIFEST_ERROR,
287 kInvalidManifestError); 318 kInvalidManifestError);
288 return; 319 return;
289 } 320 }
290 321
291 content::WebContents* web_contents = GetAssociatedWebContents(); 322 content::WebContents* web_contents = GetAssociatedWebContents();
292 if (!web_contents) // The browser window has gone away. 323 if (!web_contents) {
324 // The browser window has gone away.
325 Respond(BuildResponse(api::webstore_private::RESULT_USER_CANCELLED,
326 kUserCancelledError));
327 // Matches the AddRef in Run().
328 Release();
293 return; 329 return;
330 }
294 install_prompt_.reset(new ExtensionInstallPrompt(web_contents)); 331 install_prompt_.reset(new ExtensionInstallPrompt(web_contents));
295 install_prompt_->ConfirmWebstoreInstall( 332 ShowPrompt(install_prompt_.get());
296 this,
297 dummy_extension_.get(),
298 &icon_,
299 ExtensionInstallPrompt::GetDefaultShowDialogCallback());
300 // Control flow finishes up in InstallUIProceed or InstallUIAbort. 333 // Control flow finishes up in InstallUIProceed or InstallUIAbort.
301 } 334 }
302 335
303 void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseFailure( 336 template<typename Params>
337 void
338 WebstorePrivateFunctionWithPermissionPrompt<Params>::OnWebstoreParseFailure(
304 const std::string& id, 339 const std::string& id,
305 WebstoreInstallHelper::Delegate::InstallHelperResultCode result, 340 WebstoreInstallHelper::Delegate::InstallHelperResultCode result,
306 const std::string& error_message) { 341 const std::string& error_message) {
307 CHECK_EQ(params_->details.id, id); 342 CHECK_EQ(params_->details.id, id);
308 343
309 // Map from WebstoreInstallHelper's result codes to ours. 344 Respond(BuildResponse(WebstoreInstallHelperResultToApiResult(result),
310 api::webstore_private::Result api_result = 345 error_message));
311 api::webstore_private::RESULT_NONE;
312 switch (result) {
313 case WebstoreInstallHelper::Delegate::UNKNOWN_ERROR:
314 api_result = api::webstore_private::RESULT_UNKNOWN_ERROR;
315 break;
316 case WebstoreInstallHelper::Delegate::ICON_ERROR:
317 api_result = api::webstore_private::RESULT_ICON_ERROR;
318 break;
319 case WebstoreInstallHelper::Delegate::MANIFEST_ERROR:
320 api_result = api::webstore_private::RESULT_MANIFEST_ERROR;
321 break;
322 }
323 DCHECK_NE(api_result, api::webstore_private::RESULT_NONE);
324 Respond(BuildResponseForError(api_result, error_message));
325 346
326 // Matches the AddRef in Run(). 347 // Matches the AddRef in Run().
327 Release(); 348 Release();
328 } 349 }
329 350
330 void WebstorePrivateBeginInstallWithManifest3Function::InstallUIProceed() { 351 template<typename Params>
352 void WebstorePrivateFunctionWithPermissionPrompt<Params>::InstallUIProceed() {
353 InstallUIProceedHook();
354
355 Respond(BuildResponse(api::webstore_private::RESULT_SUCCESS, std::string()));
356
357 // Matches the AddRef in Run().
358 Release();
359 }
360
361 template<typename Params>
362 void WebstorePrivateFunctionWithPermissionPrompt<Params>::InstallUIAbort(
363 bool user_initiated) {
364 InstallUIAbortHook(user_initiated);
365
366 Respond(BuildResponse(api::webstore_private::RESULT_USER_CANCELLED,
367 kUserCancelledError));
368
369 // Matches the AddRef in Run().
370 Release();
371 }
372
373 WebstorePrivateBeginInstallWithManifest3Function::
374 WebstorePrivateBeginInstallWithManifest3Function() : chrome_details_(this) {
375 }
376
377 WebstorePrivateBeginInstallWithManifest3Function::
378 ~WebstorePrivateBeginInstallWithManifest3Function() {
379 }
380
381 ExtensionFunction::ResponseValue
382 WebstorePrivateBeginInstallWithManifest3Function::RunExtraForResponse() {
383 InstallTracker* tracker = InstallTracker::Get(browser_context());
384 DCHECK(tracker);
385 if (util::IsExtensionInstalledPermanently(params().details.id,
386 browser_context()) ||
387 tracker->GetActiveInstall(params().details.id)) {
388 return BuildResponse(api::webstore_private::RESULT_ALREADY_INSTALLED,
389 kAlreadyInstalledError);
390 }
391 ActiveInstallData install_data(params().details.id);
392 scoped_active_install_.reset(new ScopedActiveInstall(tracker, install_data));
393 return ExtensionFunction::ResponseValue();
394 }
395
396 void WebstorePrivateBeginInstallWithManifest3Function::InstallUIProceedHook() {
331 // This gets cleared in CrxInstaller::ConfirmInstall(). TODO(asargent) - in 397 // This gets cleared in CrxInstaller::ConfirmInstall(). TODO(asargent) - in
332 // the future we may also want to add time-based expiration, where a whitelist 398 // the future we may also want to add time-based expiration, where a whitelist
333 // entry is only valid for some number of minutes. 399 // entry is only valid for some number of minutes.
334 scoped_ptr<WebstoreInstaller::Approval> approval( 400 scoped_ptr<WebstoreInstaller::Approval> approval(
335 WebstoreInstaller::Approval::CreateWithNoInstallPrompt( 401 WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
336 chrome_details_.GetProfile(), 402 chrome_details_.GetProfile(),
337 params_->details.id, 403 params().details.id,
338 parsed_manifest_.Pass(), 404 PassParsedManifest(),
339 false)); 405 false));
340 approval->use_app_installed_bubble = params_->details.app_install_bubble; 406 approval->use_app_installed_bubble = params().details.app_install_bubble;
341 approval->enable_launcher = params_->details.enable_launcher; 407 approval->enable_launcher = params().details.enable_launcher;
342 // If we are enabling the launcher, we should not show the app list in order 408 // If we are enabling the launcher, we should not show the app list in order
343 // to train the user to open it themselves at least once. 409 // to train the user to open it themselves at least once.
344 approval->skip_post_install_ui = params_->details.enable_launcher; 410 approval->skip_post_install_ui = params().details.enable_launcher;
345 approval->dummy_extension = dummy_extension_; 411 approval->dummy_extension = dummy_extension();
346 approval->installing_icon = gfx::ImageSkia::CreateFrom1xBitmap(icon_); 412 approval->installing_icon = gfx::ImageSkia::CreateFrom1xBitmap(icon());
347 approval->authuser = authuser_; 413 if (params().details.authuser)
414 approval->authuser = *params().details.authuser;
348 g_pending_approvals.Get().PushApproval(approval.Pass()); 415 g_pending_approvals.Get().PushApproval(approval.Pass());
349 416
350 DCHECK(scoped_active_install_.get()); 417 DCHECK(scoped_active_install_.get());
351 scoped_active_install_->CancelDeregister(); 418 scoped_active_install_->CancelDeregister();
352 419
353 Respond(BuildResponseForSuccess());
354
355 // The Permissions_Install histogram is recorded from the ExtensionService 420 // The Permissions_Install histogram is recorded from the ExtensionService
356 // for all extension installs, so we only need to record the web store 421 // for all extension installs, so we only need to record the web store
357 // specific histogram here. 422 // specific histogram here.
358 ExtensionService::RecordPermissionMessagesHistogram( 423 ExtensionService::RecordPermissionMessagesHistogram(
359 dummy_extension_.get(), "Extensions.Permissions_WebStoreInstall2"); 424 dummy_extension().get(), "Extensions.Permissions_WebStoreInstall2");
360
361 // Matches the AddRef in Run().
362 Release();
363 } 425 }
364 426
365 void WebstorePrivateBeginInstallWithManifest3Function::InstallUIAbort( 427 void WebstorePrivateBeginInstallWithManifest3Function::InstallUIAbortHook(
366 bool user_initiated) { 428 bool user_initiated) {
367 Respond(BuildResponseForError(
368 api::webstore_private::RESULT_USER_CANCELLED,
369 kUserCancelledError));
370
371 // The web store install histograms are a subset of the install histograms. 429 // The web store install histograms are a subset of the install histograms.
372 // We need to record both histograms here since CrxInstaller::InstallUIAbort 430 // We need to record both histograms here since CrxInstaller::InstallUIAbort
373 // is never called for web store install cancellations. 431 // is never called for web store install cancellations.
374 std::string histogram_name = 432 std::string histogram_name =
375 user_initiated ? "Extensions.Permissions_WebStoreInstallCancel2" 433 user_initiated ? "Extensions.Permissions_WebStoreInstallCancel2"
376 : "Extensions.Permissions_WebStoreInstallAbort2"; 434 : "Extensions.Permissions_WebStoreInstallAbort2";
377 ExtensionService::RecordPermissionMessagesHistogram(dummy_extension_.get(), 435 ExtensionService::RecordPermissionMessagesHistogram(dummy_extension().get(),
378 histogram_name.c_str()); 436 histogram_name.c_str());
379 437
380 histogram_name = user_initiated ? "Extensions.Permissions_InstallCancel2" 438 histogram_name = user_initiated ? "Extensions.Permissions_InstallCancel2"
381 : "Extensions.Permissions_InstallAbort2"; 439 : "Extensions.Permissions_InstallAbort2";
382 ExtensionService::RecordPermissionMessagesHistogram(dummy_extension_.get(), 440 ExtensionService::RecordPermissionMessagesHistogram(dummy_extension().get(),
383 histogram_name.c_str()); 441 histogram_name.c_str());
384
385 // Matches the AddRef in Run().
386 Release();
387 } 442 }
388 443
389 ExtensionFunction::ResponseValue 444 void WebstorePrivateBeginInstallWithManifest3Function::ShowPrompt(
390 WebstorePrivateBeginInstallWithManifest3Function::BuildResponseForSuccess() { 445 ExtensionInstallPrompt* install_prompt) {
391 // The web store expects an empty string on success, so don't use 446 install_prompt->ConfirmWebstoreInstall(
392 // RESULT_SUCCESS here. 447 this, dummy_extension().get(), &icon(),
393 return ArgumentList(BeginInstallWithManifest3::Results::Create( 448 ExtensionInstallPrompt::GetDefaultShowDialogCallback());
394 api::webstore_private::RESULT_EMPTY_STRING));
395 } 449 }
396 450
397 ExtensionFunction::ResponseValue 451 scoped_ptr<base::ListValue>
398 WebstorePrivateBeginInstallWithManifest3Function::BuildResponseForError( 452 WebstorePrivateBeginInstallWithManifest3Function::CreateResults(
399 api::webstore_private::Result result, const std::string& error) { 453 api::webstore_private::Result result) const {
400 return ErrorWithArguments(BeginInstallWithManifest3::Results::Create(result), 454 return BeginInstallWithManifest3::Results::Create(result);
401 error);
402 } 455 }
403 456
404 WebstorePrivateCompleteInstallFunction:: 457 WebstorePrivateCompleteInstallFunction::
405 WebstorePrivateCompleteInstallFunction() : chrome_details_(this) {} 458 WebstorePrivateCompleteInstallFunction() : chrome_details_(this) {}
406 459
407 WebstorePrivateCompleteInstallFunction:: 460 WebstorePrivateCompleteInstallFunction::
408 ~WebstorePrivateCompleteInstallFunction() {} 461 ~WebstorePrivateCompleteInstallFunction() {}
409 462
410 ExtensionFunction::ResponseAction 463 ExtensionFunction::ResponseAction
411 WebstorePrivateCompleteInstallFunction::Run() { 464 WebstorePrivateCompleteInstallFunction::Run() {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 // Matches the AddRef in Run(). 562 // Matches the AddRef in Run().
510 Release(); 563 Release();
511 } 564 }
512 565
513 void WebstorePrivateCompleteInstallFunction::OnInstallSuccess( 566 void WebstorePrivateCompleteInstallFunction::OnInstallSuccess(
514 const std::string& id) { 567 const std::string& id) {
515 if (test_webstore_installer_delegate) 568 if (test_webstore_installer_delegate)
516 test_webstore_installer_delegate->OnExtensionInstallSuccess(id); 569 test_webstore_installer_delegate->OnExtensionInstallSuccess(id);
517 } 570 }
518 571
572 WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
573 WebstorePrivateShowPermissionPromptForDelegatedInstallFunction() {
574 }
575
576 WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::
577 ~WebstorePrivateShowPermissionPromptForDelegatedInstallFunction() {
578 }
579
580 void WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::ShowPrompt(
581 ExtensionInstallPrompt* install_prompt) {
582 install_prompt->ConfirmPermissionsForDelegatedInstall(
583 this, dummy_extension().get(), params().details.delegated_user, &icon());
584 }
585
586 scoped_ptr<base::ListValue>
587 WebstorePrivateShowPermissionPromptForDelegatedInstallFunction::CreateResults(
588 api::webstore_private::Result result) const {
589 return ShowPermissionPromptForDelegatedInstall::Results::Create(result);
590 }
591
519 WebstorePrivateEnableAppLauncherFunction:: 592 WebstorePrivateEnableAppLauncherFunction::
520 WebstorePrivateEnableAppLauncherFunction() : chrome_details_(this) {} 593 WebstorePrivateEnableAppLauncherFunction() : chrome_details_(this) {}
521 594
522 WebstorePrivateEnableAppLauncherFunction:: 595 WebstorePrivateEnableAppLauncherFunction::
523 ~WebstorePrivateEnableAppLauncherFunction() {} 596 ~WebstorePrivateEnableAppLauncherFunction() {}
524 597
525 ExtensionFunction::ResponseAction 598 ExtensionFunction::ResponseAction
526 WebstorePrivateEnableAppLauncherFunction::Run() { 599 WebstorePrivateEnableAppLauncherFunction::Run() {
527 AppListService* app_list_service = AppListService::Get( 600 AppListService* app_list_service = AppListService::Get(
528 GetHostDesktopTypeForWebContents( 601 GetHostDesktopTypeForWebContents(
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 WebstorePrivateGetEphemeralAppsEnabledFunction:: 762 WebstorePrivateGetEphemeralAppsEnabledFunction::
690 ~WebstorePrivateGetEphemeralAppsEnabledFunction() {} 763 ~WebstorePrivateGetEphemeralAppsEnabledFunction() {}
691 764
692 ExtensionFunction::ResponseAction 765 ExtensionFunction::ResponseAction
693 WebstorePrivateGetEphemeralAppsEnabledFunction::Run() { 766 WebstorePrivateGetEphemeralAppsEnabledFunction::Run() {
694 return RespondNow(ArgumentList(GetEphemeralAppsEnabled::Results::Create( 767 return RespondNow(ArgumentList(GetEphemeralAppsEnabled::Results::Create(
695 EphemeralAppLauncher::IsFeatureEnabled()))); 768 EphemeralAppLauncher::IsFeatureEnabled())));
696 } 769 }
697 770
698 } // namespace extensions 771 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698