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/profiles/profile.h" 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/auto_login_parser/auto_login_parser.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/google/core/browser/google_url_tracker.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; 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using content::BrowserContext; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutoLoginPrompter::AutoLoginPrompter(WebContents* web_contents, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Params& params, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : WebContentsObserver(web_contents), 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params_(params), 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_(url), 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) infobar_shown_(false) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents->IsLoading()) { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the WebContents isn't loading a page, the load notification will never 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be triggered. Try adding the InfoBar now. 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddInfoBarToWebContents(); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutoLoginPrompter::~AutoLoginPrompter() { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutoLoginPrompter::ShowInfoBarIfPossible(net::URLRequest* request, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See if the response contains the X-Auto-Login header. If so, this was 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a request for a login page, and the server is allowing the browser to 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // suggest auto-login, if available. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Params params; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Currently we only accept GAIA credentials in Chrome. 56b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!auto_login_parser::ParserHeaderInResponse( 57b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) request, auto_login_parser::ONLY_GOOGLE_COM, ¶ms.header)) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShowInfoBarUIThread, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params, request->url(), child_id, route_id)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutoLoginPrompter::ShowInfoBarUIThread(Params params, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_id, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id) { 72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::UI); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = tab_util::GetWebContentsByID(child_id, route_id); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!web_contents) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BrowserContext* context = web_contents->GetBrowserContext(); 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (context->IsOffTheRecord()) 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(context); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!profile->GetPrefs()->GetBoolean(prefs::kAutologinEnabled)) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that |account|, if specified, matches the logged in user. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // However, |account| is usually empty. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params.username.empty() && !params.header.account.empty() && 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.username != params.header.account) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can't add the infobar just yet, since we need to wait for the tab to 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finish loading. If we don't, the info bar appears and then disappears 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately. Create an AutoLoginPrompter instance to listen for the 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // relevant notifications; it will delete itself. 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new AutoLoginPrompter(web_contents, params, url); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutoLoginPrompter::DidStopLoading( 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderViewHost* render_view_host) { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddInfoBarToWebContents(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void AutoLoginPrompter::WebContentsDestroyed() { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The WebContents was destroyed before the navigation completed. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutoLoginPrompter::AddInfoBarToWebContents() { 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!infobar_shown_) 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_shown_ = AutoLoginInfoBarDelegate::Create(web_contents(), params_); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 112