diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-28 19:51:21 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-28 19:51:21 +0000 |
commit | b70a2d931144ec3dfa9f505f37713da331114ede (patch) | |
tree | 176a55d4320830c099de5983cdf30b09d6036654 /chrome/browser/extensions/extension_install_prompt.cc | |
parent | dc3a42fab2c94ca314816dc4f4a81a25dac21e5f (diff) | |
download | chromium_src-b70a2d931144ec3dfa9f505f37713da331114ede.zip chromium_src-b70a2d931144ec3dfa9f505f37713da331114ede.tar.gz chromium_src-b70a2d931144ec3dfa9f505f37713da331114ede.tar.bz2 |
retry r144574 with read-after-free fix.
Modify experimental identity flow to display scope descriptions and details.
Only desktop Linux should be affected for now.
largely based on patch by jstritar
BUG=130206
TEST=manual
Review URL: https://chromiumcodereview.appspot.com/10706005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@144782 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/extension_install_prompt.cc')
-rw-r--r-- | chrome/browser/extensions/extension_install_prompt.cc | 74 |
1 files changed, 69 insertions, 5 deletions
diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc index 2254cdd..43472be 100644 --- a/chrome/browser/extensions/extension_install_prompt.cc +++ b/chrome/browser/extensions/extension_install_prompt.cc @@ -17,6 +17,8 @@ #include "chrome/browser/extensions/extension_install_dialog.h" #include "chrome/browser/extensions/extension_install_ui.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/signin/token_service.h" +#include "chrome/browser/signin/token_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/tab_contents/tab_contents.h" @@ -102,6 +104,11 @@ void ExtensionInstallPrompt::Prompt::SetPermissions( permissions_ = permissions; } +void ExtensionInstallPrompt::Prompt::SetOAuthIssueAdvice( + const IssueAdviceInfo& issue_advice) { + oauth_issue_advice_ = issue_advice; +} + void ExtensionInstallPrompt::Prompt::SetInlineInstallWebstoreData( const std::string& localized_user_count, double average_rating, @@ -209,6 +216,16 @@ string16 ExtensionInstallPrompt::Prompt::GetPermission(size_t index) const { IDS_EXTENSION_PERMISSION_LINE, permissions_[index]); } +size_t ExtensionInstallPrompt::Prompt::GetOAuthIssueCount() const { + return oauth_issue_advice_.size(); +} + +const IssueAdviceInfoEntry& ExtensionInstallPrompt::Prompt::GetOAuthIssue( + size_t index) const { + CHECK_LT(index, oauth_issue_advice_.size()); + return oauth_issue_advice_[index]; +} + // static scoped_refptr<Extension> ExtensionInstallPrompt::GetLocalizedExtensionForDisplay( @@ -240,7 +257,8 @@ scoped_refptr<Extension> } ExtensionInstallPrompt::ExtensionInstallPrompt(Browser* browser) - : browser_(browser), + : record_oauth2_grant_(ShouldAutomaticallyApproveScopes()), + browser_(browser), ui_loop_(MessageLoop::current()), extension_(NULL), install_ui_(ExtensionInstallUI::Create(browser)), @@ -262,7 +280,7 @@ void ExtensionInstallPrompt::ConfirmBundleInstall( delegate_ = bundle; prompt_type_ = BUNDLE_INSTALL_PROMPT; - ShowConfirmation(); + FetchOAuthIssueAdviceIfNeeded(); } void ExtensionInstallPrompt::ConfirmInlineInstall( @@ -278,7 +296,7 @@ void ExtensionInstallPrompt::ConfirmInlineInstall( prompt_type_ = INLINE_INSTALL_PROMPT; SetIcon(icon); - ShowConfirmation(); + FetchOAuthIssueAdviceIfNeeded(); } void ExtensionInstallPrompt::ConfirmWebstoreInstall(Delegate* delegate, @@ -366,13 +384,13 @@ void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image, const std::string& extension_id, int index) { SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap()); - ShowConfirmation(); + FetchOAuthIssueAdviceIfNeeded(); } void ExtensionInstallPrompt::LoadImageIfNeeded() { // Bundle install prompts do not have an icon. if (!icon_.empty()) { - ShowConfirmation(); + FetchOAuthIssueAdviceIfNeeded(); return; } @@ -385,6 +403,46 @@ void ExtensionInstallPrompt::LoadImageIfNeeded() { ImageLoadingTracker::DONT_CACHE); } +void ExtensionInstallPrompt::FetchOAuthIssueAdviceIfNeeded() { + const Extension::OAuth2Info& oauth2_info = extension_->oauth2_info(); + if (ShouldAutomaticallyApproveScopes() || + oauth2_info.client_id.empty() || + permissions_->scopes().empty() || + prompt_type_ == BUNDLE_INSTALL_PROMPT || + prompt_type_ == INLINE_INSTALL_PROMPT) { + ShowConfirmation(); + return; + } + + Profile* profile = install_ui_->browser()->profile(); + TokenService* token_service = TokenServiceFactory::GetForProfile(profile); + std::vector<std::string> scopes; + scopes.assign(permissions_->scopes().begin(), permissions_->scopes().end()); + + token_flow_.reset(new OAuth2MintTokenFlow( + profile->GetRequestContext(), + this, + OAuth2MintTokenFlow::Parameters( + token_service->GetOAuth2LoginRefreshToken(), + extension_->id(), + oauth2_info.client_id, + scopes, + OAuth2MintTokenFlow::MODE_ISSUE_ADVICE))); + token_flow_->Start(); +} + +void ExtensionInstallPrompt::OnIssueAdviceSuccess( + const IssueAdviceInfo& advice_info) { + prompt_.SetOAuthIssueAdvice(advice_info); + record_oauth2_grant_ = true; + ShowConfirmation(); +} + +void ExtensionInstallPrompt::OnMintTokenFailure( + const GoogleServiceAuthError& error) { + ShowConfirmation(); +} + void ExtensionInstallPrompt::ShowConfirmation() { prompt_.set_type(prompt_type_); prompt_.SetPermissions(permissions_->GetWarningMessages()); @@ -409,3 +467,9 @@ void ExtensionInstallPrompt::ShowConfirmation() { break; } } + +// static +bool ExtensionInstallPrompt::ShouldAutomaticallyApproveScopes() { + return !CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDemandUserScopeApproval); +} |