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

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

Issue 290733006: remove oauth from extension install dialog (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 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) 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/extension_install_prompt.h" 5 #include "chrome/browser/extensions/extension_install_prompt.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/prefs/pref_service.h" 11 #include "base/prefs/pref_service.h"
12 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/string_util.h" 13 #include "base/strings/string_util.h"
14 #include "base/strings/stringprintf.h" 14 #include "base/strings/stringprintf.h"
15 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
16 #include "chrome/browser/extensions/bundle_installer.h" 16 #include "chrome/browser/extensions/bundle_installer.h"
17 #include "chrome/browser/extensions/extension_install_ui.h" 17 #include "chrome/browser/extensions/extension_install_ui.h"
18 #include "chrome/browser/extensions/extension_util.h" 18 #include "chrome/browser/extensions/extension_util.h"
19 #include "chrome/browser/extensions/image_loader.h" 19 #include "chrome/browser/extensions/image_loader.h"
20 #include "chrome/browser/profiles/profile.h" 20 #include "chrome/browser/profiles/profile.h"
21 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
22 #include "chrome/browser/ui/browser.h" 21 #include "chrome/browser/ui/browser.h"
23 #include "chrome/browser/ui/browser_window.h" 22 #include "chrome/browser/ui/browser_window.h"
24 #include "chrome/common/chrome_switches.h" 23 #include "chrome/common/chrome_switches.h"
25 #include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h"
26 #include "chrome/common/pref_names.h" 24 #include "chrome/common/pref_names.h"
27 #include "components/signin/core/browser/profile_oauth2_token_service.h"
28 #include "content/public/browser/web_contents.h" 25 #include "content/public/browser/web_contents.h"
29 #include "extensions/browser/extension_prefs.h" 26 #include "extensions/browser/extension_prefs.h"
30 #include "extensions/browser/extension_util.h" 27 #include "extensions/browser/extension_util.h"
31 #include "extensions/common/constants.h" 28 #include "extensions/common/constants.h"
32 #include "extensions/common/extension.h" 29 #include "extensions/common/extension.h"
33 #include "extensions/common/extension_icon_set.h" 30 #include "extensions/common/extension_icon_set.h"
34 #include "extensions/common/extension_resource.h" 31 #include "extensions/common/extension_resource.h"
35 #include "extensions/common/feature_switch.h" 32 #include "extensions/common/feature_switch.h"
36 #include "extensions/common/manifest.h" 33 #include "extensions/common/manifest.h"
37 #include "extensions/common/manifest_constants.h" 34 #include "extensions/common/manifest_constants.h"
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO, 111 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
115 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO, 112 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
116 IDS_EXTENSION_PROMPT_THESE_WILL_HAVE_ACCESS_TO, 113 IDS_EXTENSION_PROMPT_THESE_WILL_HAVE_ACCESS_TO,
117 IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO, 114 IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO,
118 IDS_EXTENSION_PROMPT_WANTS_ACCESS_TO, 115 IDS_EXTENSION_PROMPT_WANTS_ACCESS_TO,
119 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO, 116 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
120 IDS_EXTENSION_PROMPT_CAN_ACCESS, 117 IDS_EXTENSION_PROMPT_CAN_ACCESS,
121 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO, 118 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
122 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO, 119 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
123 }; 120 };
124 static const int kOAuthHeaderIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
125 IDS_EXTENSION_PROMPT_OAUTH_HEADER,
126 0, // Inline installs don't show OAuth permissions.
127 0, // Bundle installs don't show OAuth permissions.
128 IDS_EXTENSION_PROMPT_OAUTH_REENABLE_HEADER,
129 IDS_EXTENSION_PROMPT_OAUTH_PERMISSIONS_HEADER,
130 0,
131 0,
132 IDS_EXTENSION_PROMPT_OAUTH_HEADER,
133 IDS_EXTENSION_PROMPT_OAUTH_HEADER,
134 };
135 121
136 // Size of extension icon in top left of dialog. 122 // Size of extension icon in top left of dialog.
137 const int kIconSize = 69; 123 const int kIconSize = 69;
138 124
139 // Returns pixel size under maximal scale factor for the icon whose device 125 // Returns pixel size under maximal scale factor for the icon whose device
140 // independent size is |size_in_dip| 126 // independent size is |size_in_dip|
141 int GetSizeForMaxScaleFactor(int size_in_dip) { 127 int GetSizeForMaxScaleFactor(int size_in_dip) {
142 return static_cast<int>(size_in_dip * gfx::ImageSkia::GetMaxSupportedScale()); 128 return static_cast<int>(size_in_dip * gfx::ImageSkia::GetMaxSupportedScale());
143 } 129 }
144 130
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 } 214 }
229 215
230 void ExtensionInstallPrompt::Prompt::SetIsShowingDetails( 216 void ExtensionInstallPrompt::Prompt::SetIsShowingDetails(
231 DetailsType type, 217 DetailsType type,
232 size_t index, 218 size_t index,
233 bool is_showing_details) { 219 bool is_showing_details) {
234 switch (type) { 220 switch (type) {
235 case PERMISSIONS_DETAILS: 221 case PERMISSIONS_DETAILS:
236 is_showing_details_for_permissions_[index] = is_showing_details; 222 is_showing_details_for_permissions_[index] = is_showing_details;
237 break; 223 break;
238 case OAUTH_DETAILS:
239 is_showing_details_for_oauth_[index] = is_showing_details;
240 break;
241 case RETAINED_FILES_DETAILS: 224 case RETAINED_FILES_DETAILS:
242 is_showing_details_for_retained_files_ = is_showing_details; 225 is_showing_details_for_retained_files_ = is_showing_details;
243 break; 226 break;
244 } 227 }
245 } 228 }
246 229
247 void ExtensionInstallPrompt::Prompt::SetOAuthIssueAdvice(
248 const IssueAdviceInfo& issue_advice) {
249 is_showing_details_for_oauth_.clear();
250 for (size_t i = 0; i < issue_advice.size(); ++i)
251 is_showing_details_for_oauth_.push_back(false);
252
253 oauth_issue_advice_ = issue_advice;
254 }
255
256 void ExtensionInstallPrompt::Prompt::SetUserNameFromProfile(Profile* profile) {
257 // |profile| can be NULL in unit tests.
258 if (profile) {
259 oauth_user_name_ = base::UTF8ToUTF16(profile->GetPrefs()->GetString(
260 prefs::kGoogleServicesUsername));
261 } else {
262 oauth_user_name_.clear();
263 }
264 }
265
266 void ExtensionInstallPrompt::Prompt::SetWebstoreData( 230 void ExtensionInstallPrompt::Prompt::SetWebstoreData(
267 const std::string& localized_user_count, 231 const std::string& localized_user_count,
268 bool show_user_count, 232 bool show_user_count,
269 double average_rating, 233 double average_rating,
270 int rating_count) { 234 int rating_count) {
271 CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT); 235 CHECK(type_ == INLINE_INSTALL_PROMPT || type_ == EXTERNAL_INSTALL_PROMPT);
272 localized_user_count_ = localized_user_count; 236 localized_user_count_ = localized_user_count;
273 show_user_count_ = show_user_count; 237 show_user_count_ = show_user_count;
274 average_rating_ = average_rating; 238 average_rating_ = average_rating;
275 rating_count_ = rating_count; 239 rating_count_ = rating_count;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 CHECK(HasAbortButtonLabel()); 333 CHECK(HasAbortButtonLabel());
370 if (ShouldShowExplanationText()) 334 if (ShouldShowExplanationText())
371 return experiment_->GetCancelButtonText(); 335 return experiment_->GetCancelButtonText();
372 return l10n_util::GetStringUTF16(kAbortButtonIds[type_]); 336 return l10n_util::GetStringUTF16(kAbortButtonIds[type_]);
373 } 337 }
374 338
375 base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading() const { 339 base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading() const {
376 return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]); 340 return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]);
377 } 341 }
378 342
379 base::string16 ExtensionInstallPrompt::Prompt::GetOAuthHeading() const {
380 return l10n_util::GetStringFUTF16(kOAuthHeaderIds[type_], oauth_user_name_);
381 }
382
383 base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const { 343 base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const {
384 const int kRetainedFilesMessageIDs[6] = { 344 const int kRetainedFilesMessageIDs[6] = {
385 IDS_EXTENSION_PROMPT_RETAINED_FILES_DEFAULT, 345 IDS_EXTENSION_PROMPT_RETAINED_FILES_DEFAULT,
386 IDS_EXTENSION_PROMPT_RETAINED_FILE_SINGULAR, 346 IDS_EXTENSION_PROMPT_RETAINED_FILE_SINGULAR,
387 IDS_EXTENSION_PROMPT_RETAINED_FILES_ZERO, 347 IDS_EXTENSION_PROMPT_RETAINED_FILES_ZERO,
388 IDS_EXTENSION_PROMPT_RETAINED_FILES_TWO, 348 IDS_EXTENSION_PROMPT_RETAINED_FILES_TWO,
389 IDS_EXTENSION_PROMPT_RETAINED_FILES_FEW, 349 IDS_EXTENSION_PROMPT_RETAINED_FILES_FEW,
390 IDS_EXTENSION_PROMPT_RETAINED_FILES_MANY, 350 IDS_EXTENSION_PROMPT_RETAINED_FILES_MANY,
391 }; 351 };
392 std::vector<int> message_ids; 352 std::vector<int> message_ids;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 CHECK_LT(index, details_.size()); 424 CHECK_LT(index, details_.size());
465 return details_[index]; 425 return details_[index];
466 } 426 }
467 427
468 bool ExtensionInstallPrompt::Prompt::GetIsShowingDetails( 428 bool ExtensionInstallPrompt::Prompt::GetIsShowingDetails(
469 DetailsType type, size_t index) const { 429 DetailsType type, size_t index) const {
470 switch (type) { 430 switch (type) {
471 case PERMISSIONS_DETAILS: 431 case PERMISSIONS_DETAILS:
472 CHECK_LT(index, is_showing_details_for_permissions_.size()); 432 CHECK_LT(index, is_showing_details_for_permissions_.size());
473 return is_showing_details_for_permissions_[index]; 433 return is_showing_details_for_permissions_[index];
474 case OAUTH_DETAILS:
475 CHECK_LT(index, is_showing_details_for_oauth_.size());
476 return is_showing_details_for_oauth_[index];
477 case RETAINED_FILES_DETAILS: 434 case RETAINED_FILES_DETAILS:
478 return is_showing_details_for_retained_files_; 435 return is_showing_details_for_retained_files_;
479 } 436 }
480 return false; 437 return false;
481 } 438 }
482 439
483 size_t ExtensionInstallPrompt::Prompt::GetOAuthIssueCount() const {
484 return oauth_issue_advice_.size();
485 }
486
487 const IssueAdviceInfoEntry& ExtensionInstallPrompt::Prompt::GetOAuthIssue(
488 size_t index) const {
489 CHECK_LT(index, oauth_issue_advice_.size());
490 return oauth_issue_advice_[index];
491 }
492
493 size_t ExtensionInstallPrompt::Prompt::GetRetainedFileCount() const { 440 size_t ExtensionInstallPrompt::Prompt::GetRetainedFileCount() const {
494 return retained_files_.size(); 441 return retained_files_.size();
495 } 442 }
496 443
497 base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFile(size_t index) 444 base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFile(size_t index)
498 const { 445 const {
499 CHECK_LT(index, retained_files_.size()); 446 CHECK_LT(index, retained_files_.size());
500 return retained_files_[index].AsUTF16Unsafe(); 447 return retained_files_[index].AsUTF16Unsafe();
501 } 448 }
502 449
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 return Extension::Create( 490 return Extension::Create(
544 base::FilePath(), 491 base::FilePath(),
545 Manifest::INTERNAL, 492 Manifest::INTERNAL,
546 localized_manifest.get() ? *localized_manifest.get() : *manifest, 493 localized_manifest.get() ? *localized_manifest.get() : *manifest,
547 flags, 494 flags,
548 id, 495 id,
549 error); 496 error);
550 } 497 }
551 498
552 ExtensionInstallPrompt::ExtensionInstallPrompt(content::WebContents* contents) 499 ExtensionInstallPrompt::ExtensionInstallPrompt(content::WebContents* contents)
553 : OAuth2TokenService::Consumer("extensions_install"), 500 : ui_loop_(base::MessageLoop::current()),
554 record_oauth2_grant_(false),
555 ui_loop_(base::MessageLoop::current()),
556 extension_(NULL), 501 extension_(NULL),
557 bundle_(NULL), 502 bundle_(NULL),
558 install_ui_(ExtensionInstallUI::Create(ProfileForWebContents(contents))), 503 install_ui_(ExtensionInstallUI::Create(ProfileForWebContents(contents))),
559 show_params_(contents), 504 show_params_(contents),
560 delegate_(NULL), 505 delegate_(NULL),
561 prompt_(UNSET_PROMPT_TYPE) { 506 prompt_(UNSET_PROMPT_TYPE) {}
562 prompt_.SetUserNameFromProfile(install_ui_->profile());
563 }
564 507
565 ExtensionInstallPrompt::ExtensionInstallPrompt( 508 ExtensionInstallPrompt::ExtensionInstallPrompt(
566 Profile* profile, 509 Profile* profile,
567 gfx::NativeWindow native_window, 510 gfx::NativeWindow native_window,
568 content::PageNavigator* navigator) 511 content::PageNavigator* navigator)
569 : OAuth2TokenService::Consumer("extensions_install"), 512 : ui_loop_(base::MessageLoop::current()),
570 record_oauth2_grant_(false),
571 ui_loop_(base::MessageLoop::current()),
572 extension_(NULL), 513 extension_(NULL),
573 bundle_(NULL), 514 bundle_(NULL),
574 install_ui_(ExtensionInstallUI::Create(profile)), 515 install_ui_(ExtensionInstallUI::Create(profile)),
575 show_params_(native_window, navigator), 516 show_params_(native_window, navigator),
576 delegate_(NULL), 517 delegate_(NULL),
577 prompt_(UNSET_PROMPT_TYPE) { 518 prompt_(UNSET_PROMPT_TYPE) {}
578 prompt_.SetUserNameFromProfile(install_ui_->profile());
579 }
580 519
581 ExtensionInstallPrompt::~ExtensionInstallPrompt() { 520 ExtensionInstallPrompt::~ExtensionInstallPrompt() {
582 } 521 }
583 522
584 void ExtensionInstallPrompt::ConfirmBundleInstall( 523 void ExtensionInstallPrompt::ConfirmBundleInstall(
585 extensions::BundleInstaller* bundle, 524 extensions::BundleInstaller* bundle,
586 const PermissionSet* permissions) { 525 const PermissionSet* permissions) {
587 DCHECK(ui_loop_ == base::MessageLoop::current()); 526 DCHECK(ui_loop_ == base::MessageLoop::current());
588 bundle_ = bundle; 527 bundle_ = bundle;
589 permissions_ = permissions; 528 permissions_ = permissions;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 const PermissionSet* permissions) { 630 const PermissionSet* permissions) {
692 DCHECK(ui_loop_ == base::MessageLoop::current()); 631 DCHECK(ui_loop_ == base::MessageLoop::current());
693 extension_ = extension; 632 extension_ = extension;
694 permissions_ = permissions; 633 permissions_ = permissions;
695 delegate_ = delegate; 634 delegate_ = delegate;
696 prompt_.set_type(PERMISSIONS_PROMPT); 635 prompt_.set_type(PERMISSIONS_PROMPT);
697 636
698 LoadImageIfNeeded(); 637 LoadImageIfNeeded();
699 } 638 }
700 639
701 void ExtensionInstallPrompt::ConfirmIssueAdvice(
702 Delegate* delegate,
703 const Extension* extension,
704 const IssueAdviceInfo& issue_advice) {
705 DCHECK(ui_loop_ == base::MessageLoop::current());
706 extension_ = extension;
707 delegate_ = delegate;
708 prompt_.set_type(PERMISSIONS_PROMPT);
709
710 record_oauth2_grant_ = true;
711 prompt_.SetOAuthIssueAdvice(issue_advice);
712
713 LoadImageIfNeeded();
714 }
715
716 void ExtensionInstallPrompt::ReviewPermissions( 640 void ExtensionInstallPrompt::ReviewPermissions(
717 Delegate* delegate, 641 Delegate* delegate,
718 const Extension* extension, 642 const Extension* extension,
719 const std::vector<base::FilePath>& retained_file_paths) { 643 const std::vector<base::FilePath>& retained_file_paths) {
720 DCHECK(ui_loop_ == base::MessageLoop::current()); 644 DCHECK(ui_loop_ == base::MessageLoop::current());
721 extension_ = extension; 645 extension_ = extension;
722 permissions_ = extension->GetActivePermissions(); 646 permissions_ = extension->GetActivePermissions();
723 prompt_.set_retained_files(retained_file_paths); 647 prompt_.set_retained_files(retained_file_paths);
724 delegate_ = delegate; 648 delegate_ = delegate;
725 prompt_.set_type(POST_INSTALL_PERMISSIONS_PROMPT); 649 prompt_.set_type(POST_INSTALL_PERMISSIONS_PROMPT);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
774 // Load the icon whose pixel size is large enough to be displayed under 698 // Load the icon whose pixel size is large enough to be displayed under
775 // maximal supported scale factor. UI code will scale the icon down if needed. 699 // maximal supported scale factor. UI code will scale the icon down if needed.
776 // TODO(tbarzic): We should use IconImage here and load the required bitmap 700 // TODO(tbarzic): We should use IconImage here and load the required bitmap
777 // lazily. 701 // lazily.
778 int pixel_size = GetSizeForMaxScaleFactor(kIconSize); 702 int pixel_size = GetSizeForMaxScaleFactor(kIconSize);
779 extensions::ImageLoader::Get(install_ui_->profile())->LoadImageAsync( 703 extensions::ImageLoader::Get(install_ui_->profile())->LoadImageAsync(
780 extension_, image, gfx::Size(pixel_size, pixel_size), 704 extension_, image, gfx::Size(pixel_size, pixel_size),
781 base::Bind(&ExtensionInstallPrompt::OnImageLoaded, AsWeakPtr())); 705 base::Bind(&ExtensionInstallPrompt::OnImageLoaded, AsWeakPtr()));
782 } 706 }
783 707
784 void ExtensionInstallPrompt::OnGetTokenSuccess(
785 const OAuth2TokenService::Request* request,
786 const std::string& access_token,
787 const base::Time& expiration_time) {
788 DCHECK_EQ(login_token_request_.get(), request);
789 login_token_request_.reset();
790
791 const extensions::OAuth2Info& oauth2_info =
792 extensions::OAuth2Info::GetOAuth2Info(extension_);
793
794 token_flow_.reset(new OAuth2MintTokenFlow(
795 install_ui_->profile()->GetRequestContext(),
796 this,
797 OAuth2MintTokenFlow::Parameters(
798 access_token,
799 extension_->id(),
800 oauth2_info.client_id,
801 oauth2_info.scopes,
802 OAuth2MintTokenFlow::MODE_ISSUE_ADVICE)));
803 token_flow_->Start();
804 }
805
806 void ExtensionInstallPrompt::OnGetTokenFailure(
807 const OAuth2TokenService::Request* request,
808 const GoogleServiceAuthError& error) {
809 DCHECK_EQ(login_token_request_.get(), request);
810 login_token_request_.reset();
811 ShowConfirmation();
812 }
813
814 void ExtensionInstallPrompt::OnIssueAdviceSuccess(
815 const IssueAdviceInfo& advice_info) {
816 prompt_.SetOAuthIssueAdvice(advice_info);
817 record_oauth2_grant_ = true;
818 ShowConfirmation();
819 }
820
821 void ExtensionInstallPrompt::OnMintTokenFailure(
822 const GoogleServiceAuthError& error) {
823 ShowConfirmation();
824 }
825
826 void ExtensionInstallPrompt::ShowConfirmation() { 708 void ExtensionInstallPrompt::ShowConfirmation() {
827 if (prompt_.type() == INSTALL_PROMPT) 709 if (prompt_.type() == INSTALL_PROMPT)
828 prompt_.set_experiment(ExtensionInstallPromptExperiment::Find()); 710 prompt_.set_experiment(ExtensionInstallPromptExperiment::Find());
829 else 711 else
830 prompt_.set_experiment(ExtensionInstallPromptExperiment::ControlGroup()); 712 prompt_.set_experiment(ExtensionInstallPromptExperiment::ControlGroup());
831 713
832 if (permissions_.get() && 714 if (permissions_.get() &&
833 (!extension_ || 715 (!extension_ ||
834 !extensions::PermissionsData::ShouldSkipPermissionWarnings( 716 !extensions::PermissionsData::ShouldSkipPermissionWarnings(
835 extension_))) { 717 extension_))) {
(...skipping 30 matching lines...) Expand all
866 } 748 }
867 749
868 if (AutoConfirmPrompt(delegate_)) 750 if (AutoConfirmPrompt(delegate_))
869 return; 751 return;
870 752
871 if (show_dialog_callback_.is_null()) 753 if (show_dialog_callback_.is_null())
872 GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_); 754 GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_);
873 else 755 else
874 show_dialog_callback_.Run(show_params_, delegate_, prompt_); 756 show_dialog_callback_.Run(show_params_, delegate_, prompt_);
875 } 757 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698