auto_login_prompter.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/ui/android/infobars/auto_login_prompter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_url_tracker.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/auto_login_parser/auto_login_parser.h" 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h" 20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutoLoginPrompter::AutoLoginPrompter(WebContents* web_contents, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Params& params, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : WebContentsObserver(web_contents), 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params_(params), 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_(url), 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) infobar_shown_(false) { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents->IsLoading()) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the WebContents isn't loading a page, the load notification will never 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be triggered. Try adding the InfoBar now. 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddInfoBarToWebContents(); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutoLoginPrompter::~AutoLoginPrompter() { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutoLoginPrompter::ShowInfoBarIfPossible(net::URLRequest* request, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See if the response contains the X-Auto-Login header. If so, this was 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a request for a login page, and the server is allowing the browser to 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // suggest auto-login, if available. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Params params; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Currently we only accept GAIA credentials in Chrome. 55b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!auto_login_parser::ParserHeaderInResponse( 56b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) request, auto_login_parser::ONLY_GOOGLE_COM, ¶ms.header)) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShowInfoBarUIThread, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params, request->url(), child_id, route_id)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutoLoginPrompter::ShowInfoBarUIThread(Params params, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id) { 71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::UI); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = tab_util::GetWebContentsByID(child_id, route_id); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!web_contents) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!profile->GetPrefs()->GetBoolean(prefs::kAutologinEnabled)) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that |account|, if specified, matches the logged in user. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // However, |account| is usually empty. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params.username.empty() && !params.header.account.empty() && 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.username != params.header.account) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can't add the infobar just yet, since we need to wait for the tab to 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finish loading. If we don't, the info bar appears and then disappears 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately. Create an AutoLoginPrompter instance to listen for the 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // relevant notifications; it will delete itself. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new AutoLoginPrompter(web_contents, params, url); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutoLoginPrompter::DidStopLoading( 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderViewHost* render_view_host) { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddInfoBarToWebContents(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutoLoginPrompter::WebContentsDestroyed(WebContents* web_contents) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The WebContents was destroyed before the navigation completed. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutoLoginPrompter::AddInfoBarToWebContents() { 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!infobar_shown_) 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_shown_ = AutoLoginInfoBarDelegate::Create(web_contents(), params_); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 109