1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/login/login_prompt.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/utf_string_conversions.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/password_manager/password_manager.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_util.h"
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/views/login_view.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/resource_dispatcher_host.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request.h"
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/dialog_delegate.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing webkit_glue::PasswordForm;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ----------------------------------------------------------------------------
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LoginHandlerWin
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class simply forwards the authentication from the LoginView (on
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// the UI thread) to the net::URLRequest (on the I/O thread).
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class uses ref counting to ensure that it lives until all InvokeLaters
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// have been called.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass LoginHandlerWin : public LoginHandler,
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        public ConstrainedDialogDelegate {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  LoginHandlerWin(net::AuthChallengeInfo* auth_info, net::URLRequest* request)
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : LoginHandler(auth_info, request) {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // LoginModelObserver implementation.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnAutofillDataAvailable(const std::wstring& username,
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       const std::wstring& password) OVERRIDE {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Nothing to do here since LoginView takes care of autofil for win.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // views::DialogDelegate methods:
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual std::wstring GetDialogButtonLabel(
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      MessageBoxFlags::DialogButton button) const OVERRIDE {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (button == MessageBoxFlags::DIALOGBUTTON_OK)
473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      return l10n_util::GetStringUTF16(IDS_LOGIN_DIALOG_OK_BUTTON_LABEL);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return DialogDelegate::GetDialogButtonLabel(button);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual std::wstring GetWindowTitle() const OVERRIDE {
523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    return l10n_util::GetStringUTF16(IDS_LOGIN_DIALOG_TITLE);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void WindowClosing() OVERRIDE {
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TabContents* tab = GetTabContentsForLogin();
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (tab)
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab->render_view_host()->set_ignore_input_events(false);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Reference is no longer valid.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SetDialog(NULL);
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CancelAuth();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void DeleteDelegate() OVERRIDE {
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The constrained window is going to delete itself; clear our pointer.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SetDialog(NULL);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SetModel(NULL);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ReleaseSoon();
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool Cancel() OVERRIDE {
79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CancelAuth();
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool Accept() OVERRIDE {
86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SetAuth(login_view_->GetUsername(), login_view_->GetPassword());
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual views::View* GetInitiallyFocusedView() OVERRIDE {
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return login_view_->GetInitiallyFocusedView();
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual views::View* GetContentsView() OVERRIDE {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return login_view_;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // LoginHandler:
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void BuildViewForPasswordManager(
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      PasswordManager* manager,
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const string16& explanation) OVERRIDE {
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Create a new LoginView and set the model for it.  The model
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // (password manager) is owned by the view's parent TabContents,
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // so natural destruction order means we don't have to worry about
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // disassociating the model from the view, because the view will
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // be deleted before the password manager.
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    login_view_ = new LoginView(UTF16ToWideHack(explanation), manager);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Scary thread safety note: This can potentially be called *after* SetAuth
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // or CancelAuth (say, if the request was cancelled before the UI thread got
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // control).  However, that's OK since any UI interaction in those functions
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // will occur via an InvokeLater on the UI thread, which is guaranteed
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // to happen after this is called (since this was InvokeLater'd first).
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SetDialog(GetTabContentsForLogin()->CreateConstrainedDialog(this));
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotifyAuthNeeded();
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<LoginHandlerWin>;
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class LoginPrompt;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~LoginHandlerWin() {}
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The LoginView that contains the user's login information
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoginView* login_view_;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(LoginHandlerWin);
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLoginHandler* LoginHandler::Create(net::AuthChallengeInfo* auth_info,
13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                   net::URLRequest* request) {
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new LoginHandlerWin(auth_info, request);
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
140