| Index: chrome/browser/extensions/extension_install_prompt.cc
|
| diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc
|
| index 2254cddcf4e5009d4a534e996687e42b2af6fe30..43472bee0b80adecfbecc98b92307dcfe4a79ac5 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);
|
| +}
|
|
|