15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_LOGIN_LOGIN_PROMPT_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_LOGIN_LOGIN_PROMPT_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/browser/password_manager.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host_login_delegate.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHostDelegate; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationRegistrar; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AuthChallengeInfo; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpNetworkSession; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequest; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the base implementation for the OS-specific classes that route 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// authentication info to the net::URLRequest that needs it. These functions 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// must be implemented in a thread safe manner. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginHandler : public content::ResourceDispatcherHostLoginDelegate, 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public password_manager::LoginModelObserver, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginHandler(net::AuthChallengeInfo* auth_info, net::URLRequest* request); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builds the platform specific LoginHandler. Used from within 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CreateLoginPrompt() which creates tasks. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static LoginHandler* Create(net::AuthChallengeInfo* auth_info, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ResourceDispatcherHostLoginDelegate implementation: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRequestCancelled() OVERRIDE; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes the underlying platform specific view. 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void BuildViewForPasswordManager( 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch password_manager::PasswordManager* manager, 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& explanation) = 0; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets information about the authentication type (|form|) and the 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |password_manager| for this profile. 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void SetPasswordForm(const autofill::PasswordForm& form); 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SetPasswordManager(password_manager::PasswordManager* password_manager); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the WebContents that needs authentication. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* GetWebContentsForLogin() const; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resend the request with authentication credentials. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function can be called from either thread. 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetAuth(const base::string16& username, const base::string16& password); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Display the error page without asking for credentials again. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function can be called from either thread. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelAuth(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implements the content::NotificationObserver interface. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listens for AUTH_SUPPLIED and AUTH_CANCELLED notifications from other 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LoginHandlers so that this LoginHandler has the chance to dismiss itself 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if it was waiting for the same authentication. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Who/where/what asked for the authentication. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::AuthChallengeInfo* auth_info() const { return auth_info_.get(); } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether authentication had been handled (SetAuth or CancelAuth). 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WasAuthHandled() const; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~LoginHandler(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SetModel(password_manager::LoginModel* model); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers that authentication is needed. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyAuthNeeded(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Performs necessary cleanup before deletion. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReleaseSoon(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Closes the native dialog. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CloseDialog() = 0; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts observing notifications from other LoginHandlers. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddObservers(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stops observing notifications from other LoginHandlers. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveObservers(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers that authentication is supplied. 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void NotifyAuthSupplied(const base::string16& username, 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& password); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers that authentication is cancelled. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyAuthCancelled(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Marks authentication as handled and returns the previous handled 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool TestAndSetAuthHandled(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls SetAuth from the IO loop. 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetAuthDeferred(const base::string16& username, 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& password); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls CancelAuth from the IO loop. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelAuthDeferred(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closes the view_contents from the UI loop. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseContentsDeferred(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if we've handled auth (SetAuth or CancelAuth has been called). 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled_auth_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable base::Lock handled_auth_lock_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Who/where/what asked for the authentication. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::AuthChallengeInfo> auth_info_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The request that wants login data. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should only be accessed on the IO loop. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The HttpNetworkSession |request_| is associated with. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpNetworkSession* http_network_session_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The PasswordForm sent to the PasswordManager. This is so we can refer to it 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when later notifying the password manager if the credentials were accepted 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or rejected. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should only be accessed on the UI loop. 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) autofill::PasswordForm password_form_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Points to the password manager owned by the WebContents requesting auth. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should only be accessed on the UI loop. 145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch password_manager::PasswordManager* password_manager_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cached from the net::URLRequest, in case it goes NULL on us. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_host_id_; 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If not null, points to a model we need to notify of our own destruction 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so it doesn't try and access this when its too late. 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch password_manager::LoginModel* login_model_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observes other login handlers so this login handler can respond. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is only accessed on the UI thread. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::NotificationRegistrar> registrar_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Details to provide the content::NotificationObserver. Used by the automation 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// proxy for testing. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginNotificationDetails { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit LoginNotificationDetails(LoginHandler* handler) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : handler_(handler) {} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginHandler* handler() const { return handler_; } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginNotificationDetails() {} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginHandler* handler_; // Where to send the response. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LoginNotificationDetails); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Details to provide the NotificationObserver. Used by the automation proxy 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for testing and by other LoginHandlers to dismiss themselves when an 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// identical auth is supplied. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AuthSuppliedLoginNotificationDetails : public LoginNotificationDetails { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthSuppliedLoginNotificationDetails(LoginHandler* handler, 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& username, 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& password) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LoginNotificationDetails(handler), 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) username_(username), 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password_(password) {} 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& username() const { return username_; } 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& password() const { return password_; } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The username that was used for the authentication. 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 username_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The password that was used for the authentication. 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 password_; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AuthSuppliedLoginNotificationDetails); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prompts the user for their username and password. This is designed to 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be called on the background (I/O) thread, in response to 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// net::URLRequest::Delegate::OnAuthRequired. The prompt will be created 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on the main UI thread via a call to UI loop's InvokeLater, and will send the 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// credentials back to the net::URLRequest on the calling thread. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A LoginHandler object (which lives on the calling thread) is returned, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which can be used to set or cancel authentication programmatically. The 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// caller must invoke OnRequestCancelled() on this LoginHandler before 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destroying the net::URLRequest. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoginHandler* CreateLoginPrompt(net::AuthChallengeInfo* auth_info, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper to remove the ref from an net::URLRequest to the LoginHandler. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Should only be called from the IO thread, since it accesses an 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// net::URLRequest. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ResetLoginHandlerForRequest(net::URLRequest* request); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the signon_realm under which the identity should be saved. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetSignonRealm(const GURL& url, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::AuthChallengeInfo& auth_info); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_LOGIN_LOGIN_PROMPT_H_ 222