summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_install_prompt.cc
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-28 19:51:21 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-28 19:51:21 +0000
commitb70a2d931144ec3dfa9f505f37713da331114ede (patch)
tree176a55d4320830c099de5983cdf30b09d6036654 /chrome/browser/extensions/extension_install_prompt.cc
parentdc3a42fab2c94ca314816dc4f4a81a25dac21e5f (diff)
downloadchromium_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.cc74
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);
+}