OLD | NEW |
1 // Copyright 2014 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/ui/android/infobars/auto_login_prompter.h" | 5 #include "chrome/browser/ui/auto_login_prompter.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
11 #include "chrome/browser/google/google_url_tracker.h" | 11 #include "chrome/browser/google/google_url_tracker.h" |
12 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
13 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 13 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
14 #include "chrome/browser/signin/signin_manager.h" | 14 #include "chrome/browser/signin/signin_manager.h" |
15 #include "chrome/browser/signin/signin_manager_factory.h" | 15 #include "chrome/browser/signin/signin_manager_factory.h" |
16 #include "chrome/browser/tab_contents/tab_util.h" | 16 #include "chrome/browser/tab_contents/tab_util.h" |
17 #include "chrome/common/chrome_switches.h" | 17 #include "chrome/common/chrome_switches.h" |
18 #include "chrome/common/pref_names.h" | 18 #include "chrome/common/pref_names.h" |
19 #include "components/auto_login_parser/auto_login_parser.h" | 19 #include "components/auto_login_parser/auto_login_parser.h" |
20 #include "components/signin/core/profile_oauth2_token_service.h" | 20 #include "components/signin/core/profile_oauth2_token_service.h" |
21 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
22 #include "content/public/browser/web_contents.h" | 22 #include "content/public/browser/web_contents.h" |
23 #include "net/url_request/url_request.h" | 23 #include "net/url_request/url_request.h" |
24 #include "url/gurl.h" | 24 #include "url/gurl.h" |
25 | 25 |
26 using content::BrowserThread; | 26 using content::BrowserThread; |
27 using content::WebContents; | 27 using content::WebContents; |
28 | 28 |
| 29 namespace { |
| 30 |
| 31 #if !defined(OS_ANDROID) |
| 32 bool FetchUsernameThroughSigninManager(Profile* profile, std::string* output) { |
| 33 // In an incognito window these services are not available. |
| 34 SigninManagerBase* signin_manager = |
| 35 SigninManagerFactory::GetInstance()->GetForProfile(profile); |
| 36 if (!signin_manager) |
| 37 return false; |
| 38 |
| 39 ProfileOAuth2TokenService* token_service = |
| 40 ProfileOAuth2TokenServiceFactory::GetForProfile(profile); |
| 41 if (!token_service || !token_service->RefreshTokenIsAvailable( |
| 42 signin_manager->GetAuthenticatedAccountId())) { |
| 43 return false; |
| 44 } |
| 45 |
| 46 *output = signin_manager->GetAuthenticatedUsername(); |
| 47 return true; |
| 48 } |
| 49 #endif // !defined(OS_ANDROID) |
| 50 |
| 51 } // namespace |
| 52 |
29 AutoLoginPrompter::AutoLoginPrompter(WebContents* web_contents, | 53 AutoLoginPrompter::AutoLoginPrompter(WebContents* web_contents, |
30 const Params& params, | 54 const Params& params, |
31 const GURL& url) | 55 const GURL& url) |
32 : WebContentsObserver(web_contents), | 56 : WebContentsObserver(web_contents), |
33 params_(params), | 57 params_(params), |
34 url_(url), | 58 url_(url), |
35 infobar_shown_(false) { | 59 infobar_shown_(false) { |
36 if (!web_contents->IsLoading()) { | 60 if (!web_contents->IsLoading()) { |
37 // If the WebContents isn't loading a page, the load notification will never | 61 // If the WebContents isn't loading a page, the load notification will never |
38 // be triggered. Try adding the InfoBar now. | 62 // be triggered. Try adding the InfoBar now. |
39 AddInfoBarToWebContents(); | 63 AddInfoBarToWebContents(); |
40 } | 64 } |
41 } | 65 } |
42 | 66 |
43 AutoLoginPrompter::~AutoLoginPrompter() { | 67 AutoLoginPrompter::~AutoLoginPrompter() { |
44 } | 68 } |
45 | 69 |
46 // static | 70 // static |
47 void AutoLoginPrompter::ShowInfoBarIfPossible(net::URLRequest* request, | 71 void AutoLoginPrompter::ShowInfoBarIfPossible(net::URLRequest* request, |
48 int child_id, | 72 int child_id, |
49 int route_id) { | 73 int route_id) { |
| 74 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAutologin)) |
| 75 return; |
| 76 |
50 // See if the response contains the X-Auto-Login header. If so, this was | 77 // See if the response contains the X-Auto-Login header. If so, this was |
51 // a request for a login page, and the server is allowing the browser to | 78 // a request for a login page, and the server is allowing the browser to |
52 // suggest auto-login, if available. | 79 // suggest auto-login, if available. |
53 Params params; | 80 Params params; |
54 // Currently we only accept GAIA credentials in Chrome. | 81 // Currently we only accept GAIA credentials in Chrome. |
55 if (!auto_login_parser::ParserHeaderInResponse( | 82 if (!auto_login_parser::ParserHeaderInResponse( |
56 request, auto_login_parser::ONLY_GOOGLE_COM, ¶ms.header)) | 83 request, auto_login_parser::ONLY_GOOGLE_COM, ¶ms.header)) |
57 return; | 84 return; |
58 | 85 |
59 BrowserThread::PostTask( | 86 BrowserThread::PostTask( |
(...skipping 12 matching lines...) Expand all Loading... |
72 WebContents* web_contents = tab_util::GetWebContentsByID(child_id, route_id); | 99 WebContents* web_contents = tab_util::GetWebContentsByID(child_id, route_id); |
73 if (!web_contents) | 100 if (!web_contents) |
74 return; | 101 return; |
75 | 102 |
76 Profile* profile = | 103 Profile* profile = |
77 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 104 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
78 | 105 |
79 if (!profile->GetPrefs()->GetBoolean(prefs::kAutologinEnabled)) | 106 if (!profile->GetPrefs()->GetBoolean(prefs::kAutologinEnabled)) |
80 return; | 107 return; |
81 | 108 |
| 109 #if !defined(OS_ANDROID) |
| 110 // On Android, the username is fetched on the Java side from the |
| 111 // AccountManager provided by the platform. |
| 112 if (!FetchUsernameThroughSigninManager(profile, ¶ms.username)) |
| 113 return; |
| 114 #endif |
| 115 |
82 // Make sure that |account|, if specified, matches the logged in user. | 116 // Make sure that |account|, if specified, matches the logged in user. |
83 // However, |account| is usually empty. | 117 // However, |account| is usually empty. |
84 if (!params.username.empty() && !params.header.account.empty() && | 118 if (!params.username.empty() && !params.header.account.empty() && |
85 params.username != params.header.account) | 119 params.username != params.header.account) |
86 return; | 120 return; |
87 // We can't add the infobar just yet, since we need to wait for the tab to | 121 // We can't add the infobar just yet, since we need to wait for the tab to |
88 // finish loading. If we don't, the info bar appears and then disappears | 122 // finish loading. If we don't, the info bar appears and then disappears |
89 // immediately. Create an AutoLoginPrompter instance to listen for the | 123 // immediately. Create an AutoLoginPrompter instance to listen for the |
90 // relevant notifications; it will delete itself. | 124 // relevant notifications; it will delete itself. |
91 new AutoLoginPrompter(web_contents, params, url); | 125 new AutoLoginPrompter(web_contents, params, url); |
92 } | 126 } |
93 | 127 |
94 void AutoLoginPrompter::DidStopLoading( | 128 void AutoLoginPrompter::DidStopLoading( |
95 content::RenderViewHost* render_view_host) { | 129 content::RenderViewHost* render_view_host) { |
96 AddInfoBarToWebContents(); | 130 AddInfoBarToWebContents(); |
97 delete this; | 131 delete this; |
98 } | 132 } |
99 | 133 |
100 void AutoLoginPrompter::WebContentsDestroyed(WebContents* web_contents) { | 134 void AutoLoginPrompter::WebContentsDestroyed(WebContents* web_contents) { |
101 // The WebContents was destroyed before the navigation completed. | 135 // The WebContents was destroyed before the navigation completed. |
102 delete this; | 136 delete this; |
103 } | 137 } |
104 | 138 |
105 void AutoLoginPrompter::AddInfoBarToWebContents() { | 139 void AutoLoginPrompter::AddInfoBarToWebContents() { |
106 if (!infobar_shown_) | 140 if (!infobar_shown_) |
107 infobar_shown_ = AutoLoginInfoBarDelegate::Create(web_contents(), params_); | 141 infobar_shown_ = AutoLoginInfoBarDelegate::Create(web_contents(), params_); |
108 } | 142 } |
OLD | NEW |