| 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 e7380735c8ab8de3704296914546dbe211566042..8991a55f559ed3818aabdef68595fe93b53a6e70 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"
|
| @@ -101,6 +103,11 @@ void ExtensionInstallPrompt::Prompt::SetPermissions(
|
| permissions_ = permissions;
|
| }
|
|
|
| +void ExtensionInstallPrompt::Prompt::SetOAuthIssues(
|
| + const IssueAdviceInfo& issues) {
|
| + oauth_issues_ = issues;
|
| +}
|
| +
|
| void ExtensionInstallPrompt::Prompt::SetInlineInstallWebstoreData(
|
| const std::string& localized_user_count,
|
| double average_rating,
|
| @@ -208,6 +215,16 @@ string16 ExtensionInstallPrompt::Prompt::GetPermission(size_t index) const {
|
| IDS_EXTENSION_PERMISSION_LINE, permissions_[index]);
|
| }
|
|
|
| +size_t ExtensionInstallPrompt::Prompt::GetOAuthIssueCount() const {
|
| + return oauth_issues_.size();
|
| +}
|
| +
|
| +const IssueAdviceInfoEntry& ExtensionInstallPrompt::Prompt::GetOAuthIssue(
|
| + size_t index) const {
|
| + CHECK_LT(index, oauth_issues_.size());
|
| + return oauth_issues_[index];
|
| +}
|
| +
|
| // static
|
| scoped_refptr<Extension>
|
| ExtensionInstallPrompt::GetLocalizedExtensionForDisplay(
|
| @@ -246,6 +263,7 @@ ExtensionInstallPrompt::ExtensionInstallPrompt(Browser* browser)
|
| delegate_(NULL),
|
| prompt_(UNSET_PROMPT_TYPE),
|
| prompt_type_(UNSET_PROMPT_TYPE),
|
| + record_oauth2_grant_(false),
|
| ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)) {
|
| }
|
|
|
| @@ -261,7 +279,7 @@ void ExtensionInstallPrompt::ConfirmBundleInstall(
|
| delegate_ = bundle;
|
| prompt_type_ = BUNDLE_INSTALL_PROMPT;
|
|
|
| - ShowConfirmation();
|
| + FetchOAuthIssuesIfNeeded();
|
| }
|
|
|
| void ExtensionInstallPrompt::ConfirmInlineInstall(
|
| @@ -277,7 +295,7 @@ void ExtensionInstallPrompt::ConfirmInlineInstall(
|
| prompt_type_ = INLINE_INSTALL_PROMPT;
|
|
|
| SetIcon(icon);
|
| - ShowConfirmation();
|
| + FetchOAuthIssuesIfNeeded();
|
| }
|
|
|
| void ExtensionInstallPrompt::ConfirmWebstoreInstall(Delegate* delegate,
|
| @@ -365,13 +383,13 @@ void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image,
|
| const std::string& extension_id,
|
| int index) {
|
| SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap());
|
| - ShowConfirmation();
|
| + FetchOAuthIssuesIfNeeded();
|
| }
|
|
|
| void ExtensionInstallPrompt::LoadImageIfNeeded() {
|
| // Bundle install prompts do not have an icon.
|
| if (!icon_.empty()) {
|
| - ShowConfirmation();
|
| + FetchOAuthIssuesIfNeeded();
|
| return;
|
| }
|
|
|
| @@ -384,9 +402,54 @@ void ExtensionInstallPrompt::LoadImageIfNeeded() {
|
| ImageLoadingTracker::DONT_CACHE);
|
| }
|
|
|
| +void ExtensionInstallPrompt::FetchOAuthIssuesIfNeeded() {
|
| +#if !defined(TOOLKIT_GTK)
|
| + // TODO(estade): Displaying the OAuth issues is not yet implemented except
|
| + // on desktop linux.
|
| + ShowConfirmation();
|
| + return;
|
| +#else
|
| + const Extension::OAuth2Info& oauth2_info = extension_->oauth2_info();
|
| + if (oauth2_info.client_id.empty() ||
|
| + permissions_->scopes().empty() ||
|
| + prompt_type_ == BUNDLE_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_ = new OAuth2MintTokenFlow(
|
| + profile->GetRequestContext(),
|
| + this,
|
| + OAuth2MintTokenFlow::Parameters(
|
| + token_service->GetOAuth2LoginRefreshToken(),
|
| + extension_->id(),
|
| + oauth2_info.client_id,
|
| + scopes,
|
| + OAuth2MintTokenFlow::MODE_ISSUE_ADVICE));
|
| + token_flow_->Start();
|
| +#endif
|
| +}
|
| +
|
| +void ExtensionInstallPrompt::OnIssueAdviceSuccess(
|
| + const IssueAdviceInfo& advice_info) {
|
| + prompt_.SetOAuthIssues(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());
|
| + prompt_.set_type(prompt_type_);
|
|
|
| switch (prompt_type_) {
|
| case PERMISSIONS_PROMPT:
|
|
|