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