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

Side by Side Diff: chrome/browser/extensions/extension_webstore_private_api.cc

Issue 6992047: Change the web store private install API to accept a localized extension name. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/extension_webstore_private_api.h" 5 #include "chrome/browser/extensions/extension_webstore_private_api.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/scoped_temp_dir.h" 10 #include "base/scoped_temp_dir.h"
11 #include "base/string_util.h" 11 #include "base/string_util.h"
12 #include "base/values.h" 12 #include "base/values.h"
13 #include "chrome/browser/browser_process.h" 13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/extensions/crx_installer.h" 14 #include "chrome/browser/extensions/crx_installer.h"
15 #include "chrome/browser/extensions/extension_install_dialog.h" 15 #include "chrome/browser/extensions/extension_install_dialog.h"
16 #include "chrome/browser/extensions/extension_prefs.h" 16 #include "chrome/browser/extensions/extension_prefs.h"
17 #include "chrome/browser/extensions/extension_service.h" 17 #include "chrome/browser/extensions/extension_service.h"
18 #include "chrome/browser/net/gaia/token_service.h" 18 #include "chrome/browser/net/gaia/token_service.h"
19 #include "chrome/browser/profiles/profile_manager.h" 19 #include "chrome/browser/profiles/profile_manager.h"
20 #include "chrome/browser/sync/profile_sync_service.h" 20 #include "chrome/browser/sync/profile_sync_service.h"
21 #include "chrome/common/chrome_switches.h" 21 #include "chrome/common/chrome_switches.h"
22 #include "chrome/common/extensions/extension_constants.h" 22 #include "chrome/common/extensions/extension_constants.h"
23 #include "chrome/common/extensions/extension_error_utils.h" 23 #include "chrome/common/extensions/extension_error_utils.h"
24 #include "chrome/common/extensions/extension_l10n_util.h"
24 #include "chrome/common/net/gaia/gaia_constants.h" 25 #include "chrome/common/net/gaia/gaia_constants.h"
25 #include "content/browser/tab_contents/tab_contents.h" 26 #include "content/browser/tab_contents/tab_contents.h"
26 #include "content/common/notification_details.h" 27 #include "content/common/notification_details.h"
27 #include "content/common/notification_source.h" 28 #include "content/common/notification_source.h"
28 #include "content/common/notification_type.h" 29 #include "content/common/notification_type.h"
29 #include "grit/chromium_strings.h" 30 #include "grit/chromium_strings.h"
30 #include "grit/generated_resources.h" 31 #include "grit/generated_resources.h"
31 #include "net/base/escape.h" 32 #include "net/base/escape.h"
32 #include "ui/base/l10n/l10n_util.h" 33 #include "ui/base/l10n/l10n_util.h"
33 34
34 namespace { 35 namespace {
35 36
37 const char kIconDataKey[] = "iconData";
38 const char kIdKey[] = "id";
39 const char kLocalizedNameKey[] = "localizedName";
36 const char kLoginKey[] = "login"; 40 const char kLoginKey[] = "login";
41 const char kManifestKey[] = "manifest";
37 const char kTokenKey[] = "token"; 42 const char kTokenKey[] = "token";
43
38 const char kImageDecodeError[] = "Image decode failed"; 44 const char kImageDecodeError[] = "Image decode failed";
39 const char kInvalidIdError[] = "Invalid id"; 45 const char kInvalidIdError[] = "Invalid id";
40 const char kInvalidManifestError[] = "Invalid manifest"; 46 const char kInvalidManifestError[] = "Invalid manifest";
41 const char kNoPreviousBeginInstallError[] = 47 const char kNoPreviousBeginInstallError[] =
42 "* does not match a previous call to beginInstall"; 48 "* does not match a previous call to beginInstall";
43 const char kUserCancelledError[] = "User cancelled install"; 49 const char kUserCancelledError[] = "User cancelled install";
44 const char kUserGestureRequiredError[] = 50 const char kUserGestureRequiredError[] =
45 "This function must be called during a user gesture"; 51 "This function must be called during a user gesture";
46 52
47 ProfileSyncService* test_sync_service = NULL; 53 ProfileSyncService* test_sync_service = NULL;
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 SetResult(PERMISSION_DENIED); 291 SetResult(PERMISSION_DENIED);
286 return false; 292 return false;
287 } 293 }
288 294
289 if (!user_gesture() && !ignore_user_gesture_for_tests) { 295 if (!user_gesture() && !ignore_user_gesture_for_tests) {
290 SetResult(NO_GESTURE); 296 SetResult(NO_GESTURE);
291 error_ = kUserGestureRequiredError; 297 error_ = kUserGestureRequiredError;
292 return false; 298 return false;
293 } 299 }
294 300
295 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &id_)); 301 DictionaryValue* details = NULL;
302 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details));
303 CHECK(details);
304
305 // Read the id.
Matt Perry 2011/05/25 01:46:06 these comments can go - the code is self explanato
asargent_no_longer_on_chrome 2011/05/25 04:42:00 Done.
306 EXTENSION_FUNCTION_VALIDATE(details->GetString(kIdKey, &id_));
296 if (!Extension::IdIsValid(id_)) { 307 if (!Extension::IdIsValid(id_)) {
297 SetResult(INVALID_ID); 308 SetResult(INVALID_ID);
298 error_ = kInvalidIdError; 309 error_ = kInvalidIdError;
299 return false; 310 return false;
300 } 311 }
301 312
302 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &icon_data_)); 313 // Read the manifest.
303 EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &manifest_)); 314 EXTENSION_FUNCTION_VALIDATE(details->GetString(kManifestKey, &manifest_));
315
316 // Read the icon data.
317 if (details->HasKey(kIconDataKey))
318 EXTENSION_FUNCTION_VALIDATE(details->GetString(kIconDataKey, &icon_data_));
319
320 // Read the localized name.
321 if (details->HasKey(kLocalizedNameKey))
322 EXTENSION_FUNCTION_VALIDATE(details->GetString(kLocalizedNameKey,
323 &localized_name_));
304 324
305 scoped_refptr<SafeBeginInstallHelper> helper = 325 scoped_refptr<SafeBeginInstallHelper> helper =
306 new SafeBeginInstallHelper(this, icon_data_, manifest_); 326 new SafeBeginInstallHelper(this, icon_data_, manifest_);
307 // The helper will call us back via OnParseSucces or OnParseFailure. 327 // The helper will call us back via OnParseSucces or OnParseFailure.
308 helper->Start(); 328 helper->Start();
309 329
310 // Matched with a Release in OnSuccess/OnFailure. 330 // Matched with a Release in OnSuccess/OnFailure.
311 AddRef(); 331 AddRef();
312 332
313 // The response is sent asynchronously in OnSuccess/OnFailure. 333 // The response is sent asynchronously in OnSuccess/OnFailure.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 bool should_proceed) { 376 bool should_proceed) {
357 auto_confirm_for_tests = should_proceed ? PROCEED : ABORT; 377 auto_confirm_for_tests = should_proceed ? PROCEED : ABORT;
358 } 378 }
359 379
360 void BeginInstallWithManifestFunction::OnParseSuccess( 380 void BeginInstallWithManifestFunction::OnParseSuccess(
361 const SkBitmap& icon, DictionaryValue* parsed_manifest) { 381 const SkBitmap& icon, DictionaryValue* parsed_manifest) {
362 CHECK(parsed_manifest); 382 CHECK(parsed_manifest);
363 icon_ = icon; 383 icon_ = icon;
364 parsed_manifest_.reset(parsed_manifest); 384 parsed_manifest_.reset(parsed_manifest);
365 385
386 // If we were passed a localized name to use in the dialog, temporarily
387 // replace the name in |parsed_manifest| with it.
388 std::string original_name;
389 if (!localized_name_.empty()) {
390 if (!parsed_manifest->GetString(extension_manifest_keys::kName,
391 &original_name)) {
392 OnParseFailure(MANIFEST_ERROR, std::string(kInvalidManifestError));
393 return;
394 }
395 parsed_manifest->SetString(extension_manifest_keys::kName, localized_name_);
396 }
397
366 // Create a dummy extension and show the extension install confirmation 398 // Create a dummy extension and show the extension install confirmation
367 // dialog. 399 // dialog.
368 std::string init_errors; 400 std::string init_errors;
369 dummy_extension_ = Extension::Create( 401 dummy_extension_ = Extension::Create(
370 FilePath(), 402 FilePath(),
371 Extension::INTERNAL, 403 Extension::INTERNAL,
372 *static_cast<DictionaryValue*>(parsed_manifest_.get()), 404 *static_cast<DictionaryValue*>(parsed_manifest_.get()),
373 Extension::NO_FLAGS, 405 Extension::NO_FLAGS,
374 &init_errors); 406 &init_errors);
375 if (!dummy_extension_.get()) { 407 if (!dummy_extension_.get()) {
376 OnParseFailure(MANIFEST_ERROR, std::string(kInvalidManifestError)); 408 OnParseFailure(MANIFEST_ERROR, std::string(kInvalidManifestError));
377 return; 409 return;
378 } 410 }
411
412 // Restore the original name in |parsed_manifest| if we replaced it with a
413 // localized one, so that the whitelist entry will have the right value for
414 // comparison against the actual downloaded crx file's manifest.
415 if (!original_name.empty())
416 parsed_manifest_->SetString(extension_manifest_keys::kName, original_name);
Matt Perry 2011/05/25 01:46:06 This restoring feels a little dirty. How about ins
asargent_no_longer_on_chrome 2011/05/25 04:42:00 Done.
417
379 if (icon_.empty()) 418 if (icon_.empty())
380 icon_ = Extension::GetDefaultIcon(dummy_extension_->is_app()); 419 icon_ = Extension::GetDefaultIcon(dummy_extension_->is_app());
381 420
382 // In tests, we may have setup to proceed or abort without putting up the real 421 // In tests, we may have setup to proceed or abort without putting up the real
383 // confirmation dialog. 422 // confirmation dialog.
384 if (auto_confirm_for_tests != DO_NOT_SKIP) { 423 if (auto_confirm_for_tests != DO_NOT_SKIP) {
385 if (auto_confirm_for_tests == PROCEED) 424 if (auto_confirm_for_tests == PROCEED)
386 this->InstallUIProceed(); 425 this->InstallUIProceed();
387 else 426 else
388 this->InstallUIAbort(); 427 this->InstallUIAbort();
(...skipping 14 matching lines...) Expand all
403 ResultCode result_code, const std::string& error_message) { 442 ResultCode result_code, const std::string& error_message) {
404 SetResult(result_code); 443 SetResult(result_code);
405 error_ = error_message; 444 error_ = error_message;
406 SendResponse(false); 445 SendResponse(false);
407 446
408 // Matches the AddRef in RunImpl(). 447 // Matches the AddRef in RunImpl().
409 Release(); 448 Release();
410 } 449 }
411 450
412 void BeginInstallWithManifestFunction::InstallUIProceed() { 451 void BeginInstallWithManifestFunction::InstallUIProceed() {
413 CrxInstaller::SetWhitelistedManifest(id_, parsed_manifest_.release()); 452 CrxInstaller::WhitelistEntry* entry = new CrxInstaller::WhitelistEntry;
453 entry->parsed_manifest.reset(parsed_manifest_.release());
454 entry->localized_name = localized_name_;
455 CrxInstaller::SetWhitelistEntry(id_, entry);
414 SetResult(ERROR_NONE); 456 SetResult(ERROR_NONE);
415 SendResponse(true); 457 SendResponse(true);
416 458
417 // Matches the AddRef in RunImpl(). 459 // Matches the AddRef in RunImpl().
418 Release(); 460 Release();
419 } 461 }
420 462
421 void BeginInstallWithManifestFunction::InstallUIAbort() { 463 void BeginInstallWithManifestFunction::InstallUIAbort() {
422 error_ = std::string(kUserCancelledError); 464 error_ = std::string(kUserCancelledError);
423 SetResult(USER_CANCELLED); 465 SetResult(USER_CANCELLED);
424 SendResponse(false); 466 SendResponse(false);
425 467
426 // Matches the AddRef in RunImpl(). 468 // Matches the AddRef in RunImpl().
427 Release(); 469 Release();
428 } 470 }
429 471
430 bool CompleteInstallFunction::RunImpl() { 472 bool CompleteInstallFunction::RunImpl() {
431 if (!IsWebStoreURL(profile_, source_url())) 473 if (!IsWebStoreURL(profile_, source_url()))
432 return false; 474 return false;
433 475
434 std::string id; 476 std::string id;
435 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &id)); 477 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &id));
436 if (!Extension::IdIsValid(id)) { 478 if (!Extension::IdIsValid(id)) {
437 error_ = kInvalidIdError; 479 error_ = kInvalidIdError;
438 return false; 480 return false;
439 } 481 }
440 482
441 if (!CrxInstaller::IsIdWhitelisted(id) && 483 if (!CrxInstaller::IsIdWhitelisted(id) &&
442 !CrxInstaller::GetWhitelistedManifest(id)) { 484 !CrxInstaller::GetWhitelistEntry(id)) {
443 error_ = ExtensionErrorUtils::FormatErrorMessage( 485 error_ = ExtensionErrorUtils::FormatErrorMessage(
444 kNoPreviousBeginInstallError, id); 486 kNoPreviousBeginInstallError, id);
445 return false; 487 return false;
446 } 488 }
447 489
448 std::vector<std::string> params; 490 std::vector<std::string> params;
449 params.push_back("id=" + id); 491 params.push_back("id=" + id);
450 params.push_back("lang=" + g_browser_process->GetApplicationLocale()); 492 params.push_back("lang=" + g_browser_process->GetApplicationLocale());
451 params.push_back("uc"); 493 params.push_back("uc");
452 std::string url_string = Extension::GalleryUpdateUrl(true).spec(); 494 std::string url_string = Extension::GalleryUpdateUrl(true).spec();
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 } 649 }
608 650
609 DCHECK(waiting_for_token_); 651 DCHECK(waiting_for_token_);
610 652
611 result_.reset(CreateLoginResult(GetDefaultProfile(profile_))); 653 result_.reset(CreateLoginResult(GetDefaultProfile(profile_)));
612 SendResponse(true); 654 SendResponse(true);
613 655
614 // Matches the AddRef in RunImpl(). 656 // Matches the AddRef in RunImpl().
615 Release(); 657 Release();
616 } 658 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698