summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorerg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-17 16:48:11 +0000
committererg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-17 16:48:11 +0000
commiteffb25df8e23ffc027fefe0b271a47e16f7a6240 (patch)
tree702bf48cc9c0a6a404312872715f6d4715b0655e /chrome/browser
parentdf0c05c6f4164d3903da86334cd0004970d97c5b (diff)
downloadchromium_src-effb25df8e23ffc027fefe0b271a47e16f7a6240.zip
chromium_src-effb25df8e23ffc027fefe0b271a47e16f7a6240.tar.gz
chromium_src-effb25df8e23ffc027fefe0b271a47e16f7a6240.tar.bz2
Remove the windows specific bits from login_prompt.cc and make LoginPromptWin conform to a general cross platform interface.
(Also tightens the interface for ConstrainedWindows a bit more) Review URL: http://codereview.chromium.org/125217 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18623 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/download/download_request_dialog_delegate_win.cc2
-rwxr-xr-x[-rw-r--r--]chrome/browser/login_prompt.cc301
-rw-r--r--chrome/browser/login_prompt.h31
-rw-r--r--chrome/browser/login_prompt_win.cc292
-rw-r--r--chrome/browser/tab_contents/constrained_window.h2
-rw-r--r--chrome/browser/tab_contents/tab_contents.cc5
-rw-r--r--chrome/browser/tab_contents/tab_contents.h3
-rw-r--r--chrome/browser/views/constrained_window_impl.cc12
-rw-r--r--chrome/browser/views/constrained_window_impl.h5
9 files changed, 339 insertions, 314 deletions
diff --git a/chrome/browser/download/download_request_dialog_delegate_win.cc b/chrome/browser/download/download_request_dialog_delegate_win.cc
index cbecc7b..6129af6 100644
--- a/chrome/browser/download/download_request_dialog_delegate_win.cc
+++ b/chrome/browser/download/download_request_dialog_delegate_win.cc
@@ -26,7 +26,7 @@ DownloadRequestDialogDelegateWin::DownloadRequestDialogDelegateWin(
MessageBoxFlags::kIsConfirmMessageBox,
l10n_util::GetString(IDS_MULTI_DOWNLOAD_WARNING),
std::wstring());
- window_ = tab->CreateConstrainedDialog(this, message_view_);
+ window_ = tab->CreateConstrainedDialog(this);
}
void DownloadRequestDialogDelegateWin::CloseWindow() {
diff --git a/chrome/browser/login_prompt.cc b/chrome/browser/login_prompt.cc
index dbed8aa..b897378 100644..100755
--- a/chrome/browser/login_prompt.cc
+++ b/chrome/browser/login_prompt.cc
@@ -13,26 +13,19 @@
#include "chrome/browser/renderer_host/render_process_host.h"
#include "chrome/browser/renderer_host/resource_dispatcher_host.h"
#include "chrome/browser/tab_contents/constrained_window.h"
-#include "chrome/browser/tab_contents/navigation_controller.h"
-#include "chrome/browser/tab_contents/tab_util.h"
#include "chrome/browser/tab_contents/tab_contents.h"
-#include "chrome/browser/views/login_view.h"
#include "chrome/common/chrome_switches.h"
-#include "chrome/common/notification_service.h"
#include "grit/generated_resources.h"
#include "net/base/auth.h"
#include "net/url_request/url_request.h"
-#include "views/window/dialog_delegate.h"
-using namespace std;
-using views::LoginView;
using webkit_glue::PasswordForm;
class LoginHandlerImpl;
// Helper to remove the ref from an URLRequest to the LoginHandler.
// Should only be called from the IO thread, since it accesses an URLRequest.
-static void ResetLoginHandlerForRequest(URLRequest* request) {
+void ResetLoginHandlerForRequest(URLRequest* request) {
ResourceDispatcherHost::ExtraRequestInfo* info =
ResourceDispatcherHost::ExtraInfoForRequest(request);
if (!info)
@@ -50,7 +43,6 @@ static void ResetLoginHandlerForRequest(URLRequest* request) {
//
// Be careful when changing this function, since you could make existing
// saved logins un-retrievable.
-
std::string GetSignonRealm(const GURL& url,
const net::AuthChallengeInfo& auth_info) {
std::string signon_realm;
@@ -67,262 +59,6 @@ std::string GetSignonRealm(const GURL& url,
}
// ----------------------------------------------------------------------------
-// LoginHandlerImpl
-
-// This class simply forwards the authentication from the LoginView (on
-// the UI thread) to the URLRequest (on the I/O thread).
-// This class uses ref counting to ensure that it lives until all InvokeLaters
-// have been called.
-class LoginHandlerImpl : public LoginHandler,
- public base::RefCountedThreadSafe<LoginHandlerImpl>,
- public views::DialogDelegate {
- public:
- LoginHandlerImpl(URLRequest* request, MessageLoop* ui_loop)
- : dialog_(NULL),
- handled_auth_(false),
- request_(request),
- request_loop_(MessageLoop::current()),
- ui_loop_(ui_loop),
- password_manager_(NULL) {
- DCHECK(request_) << "LoginHandler constructed with NULL request";
-
- AddRef(); // matched by ReleaseLater.
- if (!tab_util::GetTabContentsID(request_, &render_process_host_id_,
- &tab_contents_id_)) {
- NOTREACHED();
- }
- }
-
- ~LoginHandlerImpl() {
- }
-
- // Initialize the UI part of the LoginHandler.
- // Scary thread safety note: This can potentially be called *after* SetAuth
- // or CancelAuth (say, if the request was cancelled before the UI thread got
- // control). However, that's OK since any UI interaction in those functions
- // will occur via an InvokeLater on the UI thread, which is guaranteed
- // to happen after this is called (since this was InvokeLater'd first).
- void InitWithDialog(ConstrainedWindow* dlg) {
- DCHECK(MessageLoop::current() == ui_loop_);
- dialog_ = dlg;
- SendNotifications();
- }
-
- // Returns the TabContents that needs authentication.
- TabContents* GetTabContentsForLogin() {
- DCHECK(MessageLoop::current() == ui_loop_);
-
- return tab_util::GetTabContentsByID(render_process_host_id_,
- tab_contents_id_);
- }
-
- void set_login_view(LoginView* login_view) {
- login_view_ = login_view;
- }
-
- void set_password_form(const PasswordForm& form) {
- password_form_ = form;
- }
-
- void set_password_manager(PasswordManager* password_manager) {
- password_manager_ = password_manager;
- }
-
- // views::DialogDelegate methods:
- virtual std::wstring GetDialogButtonLabel(
- MessageBoxFlags::DialogButton button) const {
- if (button == MessageBoxFlags::DIALOGBUTTON_OK)
- return l10n_util::GetString(IDS_LOGIN_DIALOG_OK_BUTTON_LABEL);
- return DialogDelegate::GetDialogButtonLabel(button);
- }
- virtual std::wstring GetWindowTitle() const {
- return l10n_util::GetString(IDS_LOGIN_DIALOG_TITLE);
- }
- virtual void WindowClosing() {
- DCHECK(MessageLoop::current() == ui_loop_);
-
- // Reference is no longer valid.
- dialog_ = NULL;
-
- if (!WasAuthHandled(true)) {
- request_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &LoginHandlerImpl::CancelAuthDeferred));
- SendNotifications();
- }
- }
- virtual void DeleteDelegate() {
- // Delete this object once all InvokeLaters have been called.
- request_loop_->ReleaseSoon(FROM_HERE, this);
- }
- virtual bool Cancel() {
- DCHECK(MessageLoop::current() == ui_loop_);
- DCHECK(dialog_) << "LoginHandler invoked without being attached";
- CancelAuth();
- return true;
- }
- virtual bool Accept() {
- DCHECK(MessageLoop::current() == ui_loop_);
- DCHECK(dialog_) << "LoginHandler invoked without being attached";
- SetAuth(login_view_->GetUsername(), login_view_->GetPassword());
- return true;
- }
- virtual views::View* GetContentsView() {
- return login_view_;
- }
-
- // LoginHandler:
- virtual void SetAuth(const std::wstring& username,
- const std::wstring& password) {
- if (WasAuthHandled(true))
- return;
-
- // Tell the password manager the credentials were submitted / accepted.
- if (password_manager_) {
- password_form_.username_value = username;
- password_form_.password_value = password;
- password_manager_->ProvisionallySavePassword(password_form_);
- }
-
- ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &LoginHandlerImpl::CloseContentsDeferred));
- ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &LoginHandlerImpl::SendNotifications));
- request_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &LoginHandlerImpl::SetAuthDeferred, username, password));
- }
-
- virtual void CancelAuth() {
- if (WasAuthHandled(true))
- return;
-
- ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &LoginHandlerImpl::CloseContentsDeferred));
- ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &LoginHandlerImpl::SendNotifications));
- request_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &LoginHandlerImpl::CancelAuthDeferred));
- }
-
- virtual void OnRequestCancelled() {
- DCHECK(MessageLoop::current() == request_loop_) <<
- "Why is OnRequestCancelled called from the UI thread?";
-
- // Reference is no longer valid.
- request_ = NULL;
-
- // Give up on auth if the request was cancelled.
- CancelAuth();
- }
-
- private:
-
- // Calls SetAuth from the request_loop.
- void SetAuthDeferred(const std::wstring& username,
- const std::wstring& password) {
- DCHECK(MessageLoop::current() == request_loop_);
-
- if (request_) {
- request_->SetAuth(username, password);
- ResetLoginHandlerForRequest(request_);
- }
- }
-
- // Calls CancelAuth from the request_loop.
- void CancelAuthDeferred() {
- DCHECK(MessageLoop::current() == request_loop_);
-
- if (request_) {
- request_->CancelAuth();
- // Verify that CancelAuth does destroy the request via our delegate.
- DCHECK(request_ != NULL);
- ResetLoginHandlerForRequest(request_);
- }
- }
-
- // Closes the view_contents from the UI loop.
- void CloseContentsDeferred() {
- DCHECK(MessageLoop::current() == ui_loop_);
-
- // The hosting ConstrainedWindow may have been freed.
- if (dialog_)
- dialog_->CloseConstrainedWindow();
- }
-
- // Returns whether authentication had been handled (SetAuth or CancelAuth).
- // If |set_handled| is true, it will mark authentication as handled.
- bool WasAuthHandled(bool set_handled) {
- AutoLock lock(handled_auth_lock_);
- bool was_handled = handled_auth_;
- if (set_handled)
- handled_auth_ = true;
- return was_handled;
- }
-
- // Notify observers that authentication is needed or received. The automation
- // proxy uses this for testing.
- void SendNotifications() {
- DCHECK(MessageLoop::current() == ui_loop_);
-
- NotificationService* service = NotificationService::current();
- TabContents* requesting_contents = GetTabContentsForLogin();
- if (!requesting_contents)
- return;
-
- NavigationController* controller = &requesting_contents->controller();
-
- if (!WasAuthHandled(false)) {
- LoginNotificationDetails details(this);
- service->Notify(NotificationType::AUTH_NEEDED,
- Source<NavigationController>(controller),
- Details<LoginNotificationDetails>(&details));
- } else {
- service->Notify(NotificationType::AUTH_SUPPLIED,
- Source<NavigationController>(controller),
- NotificationService::NoDetails());
- }
- }
-
- // True if we've handled auth (SetAuth or CancelAuth has been called).
- bool handled_auth_;
- Lock handled_auth_lock_;
-
- // The ConstrainedWindow that is hosting our LoginView.
- // This should only be accessed on the ui_loop_.
- ConstrainedWindow* dialog_;
-
- // The MessageLoop of the thread that the ChromeViewContents lives in.
- MessageLoop* ui_loop_;
-
- // The request that wants login data.
- // This should only be accessed on the request_loop_.
- URLRequest* request_;
-
- // The MessageLoop of the thread that the URLRequest lives in.
- MessageLoop* request_loop_;
-
- // The LoginView that contains the user's login information
- LoginView* login_view_;
-
- // The PasswordForm sent to the PasswordManager. This is so we can refer to it
- // when later notifying the password manager if the credentials were accepted
- // or rejected.
- // This should only be accessed on the ui_loop_.
- PasswordForm password_form_;
-
- // Points to the password manager owned by the TabContents requesting auth.
- // Can be null if the TabContents is not a TabContents.
- // This should only be accessed on the ui_loop_.
- PasswordManager* password_manager_;
-
- // Cached from the URLRequest, in case it goes NULL on us.
- int render_process_host_id_;
- int tab_contents_id_;
-
- DISALLOW_EVIL_CONSTRUCTORS(LoginHandlerImpl);
-};
-
-
-// ----------------------------------------------------------------------------
// LoginDialogTask
// This task is run on the UI thread and creates a constrained window with
@@ -330,7 +66,7 @@ class LoginHandlerImpl : public LoginHandler,
// which then routes it to the URLRequest on the I/O thread.
class LoginDialogTask : public Task {
public:
- LoginDialogTask(net::AuthChallengeInfo* auth_info, LoginHandlerImpl* handler)
+ LoginDialogTask(net::AuthChallengeInfo* auth_info, LoginHandler* handler)
: auth_info_(auth_info), handler_(handler) {
}
virtual ~LoginDialogTask() {
@@ -343,31 +79,22 @@ class LoginDialogTask : public Task {
return;
}
- wstring explanation = auth_info_->realm.empty() ?
- l10n_util::GetStringF(IDS_LOGIN_DIALOG_DESCRIPTION_NO_REALM,
- auth_info_->host_and_port) :
- l10n_util::GetStringF(IDS_LOGIN_DIALOG_DESCRIPTION,
- auth_info_->host_and_port,
- auth_info_->realm);
- LoginView* view = new LoginView(explanation);
-
// Tell the password manager to look for saved passwords.
PasswordManager* password_manager =
parent_contents->GetPasswordManager();
- // Set the model for the login view. The model (password manager) is owned
- // by the view's parent TabContents, so natural destruction order means we
- // don't have to worry about calling SetModel(NULL), because the view will
- // be deleted before the password manager.
- view->SetModel(password_manager);
std::vector<PasswordForm> v;
MakeInputForPasswordManager(parent_contents->GetURL(), &v);
password_manager->PasswordFormsSeen(v);
- handler_->set_password_manager(password_manager);
+ handler_->SetPasswordManager(password_manager);
- handler_->set_login_view(view);
- ConstrainedWindow* dialog =
- parent_contents->CreateConstrainedDialog(handler_, view);
- handler_->InitWithDialog(dialog);
+ std::wstring explanation = auth_info_->realm.empty() ?
+ l10n_util::GetStringF(IDS_LOGIN_DIALOG_DESCRIPTION_NO_REALM,
+ auth_info_->host_and_port) :
+ l10n_util::GetStringF(IDS_LOGIN_DIALOG_DESCRIPTION,
+ auth_info_->host_and_port,
+ auth_info_->realm);
+ handler_->BuildViewForPasswordManager(password_manager,
+ explanation);
}
private:
@@ -388,7 +115,7 @@ class LoginDialogTask : public Task {
dialog_form.signon_realm = GetSignonRealm(dialog_form.origin, *auth_info_);
password_manager_input->push_back(dialog_form);
// Set the password form for the handler (by copy).
- handler_->set_password_form(dialog_form);
+ handler_->SetPasswordForm(dialog_form);
}
// Info about who/where/what is asking for authentication.
@@ -396,7 +123,7 @@ class LoginDialogTask : public Task {
// Where to send the authentication when obtained.
// This is owned by the ResourceDispatcherHost that invoked us.
- LoginHandlerImpl* handler_;
+ LoginHandler* handler_;
DISALLOW_EVIL_CONSTRUCTORS(LoginDialogTask);
};
@@ -407,7 +134,7 @@ class LoginDialogTask : public Task {
LoginHandler* CreateLoginPrompt(net::AuthChallengeInfo* auth_info,
URLRequest* request,
MessageLoop* ui_loop) {
- LoginHandlerImpl* handler = new LoginHandlerImpl(request, ui_loop);
+ LoginHandler* handler = LoginHandler::Create(request, ui_loop);
ui_loop->PostTask(FROM_HERE, new LoginDialogTask(auth_info, handler));
return handler;
}
diff --git a/chrome/browser/login_prompt.h b/chrome/browser/login_prompt.h
index b10ec57..5027409 100644
--- a/chrome/browser/login_prompt.h
+++ b/chrome/browser/login_prompt.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_LOGIN_PROMPT_H__
-#define CHROME_BROWSER_LOGIN_PROMPT_H__
+#ifndef CHROME_BROWSER_LOGIN_PROMPT_H_
+#define CHROME_BROWSER_LOGIN_PROMPT_H_
#include <string>
@@ -13,8 +13,14 @@ namespace net {
class AuthChallengeInfo;
}
+namespace webkit_glue {
+struct PasswordForm;
+}
+
+class ConstrainedWindow;
class GURL;
class MessageLoop;
+class PasswordManager;
class TabContents;
class URLRequest;
@@ -24,6 +30,22 @@ class URLRequest;
// a thread safe manner.
class LoginHandler {
public:
+ // Builds the platform specific LoginHandler. Used from within
+ // CreateLoginPrompt() which creates tasks.
+ static LoginHandler* Create(URLRequest* request, MessageLoop* ui_loop);
+
+ // Initializes the underlying platform specific view.
+ virtual void BuildViewForPasswordManager(PasswordManager* manager,
+ std::wstring explanation) = 0;
+
+ // Sets information about the authentication type (|form|) and the
+ // |password_manager| for this profile.
+ virtual void SetPasswordForm(const webkit_glue::PasswordForm& form) = 0;
+ virtual void SetPasswordManager(PasswordManager* password_manager) = 0;
+
+ // Returns the TabContents that needs authentication.
+ virtual TabContents* GetTabContentsForLogin() = 0;
+
// Resend the request with authentication credentials.
// This function can be called from either thread.
virtual void SetAuth(const std::wstring& username,
@@ -66,9 +88,12 @@ LoginHandler* CreateLoginPrompt(net::AuthChallengeInfo* auth_info,
URLRequest* request,
MessageLoop* ui_loop);
+// Helper to remove the ref from an URLRequest to the LoginHandler.
+// Should only be called from the IO thread, since it accesses an URLRequest.
+void ResetLoginHandlerForRequest(URLRequest* request);
// Get the signon_realm under which the identity should be saved.
std::string GetSignonRealm(const GURL& url,
const net::AuthChallengeInfo& auth_info);
-#endif // CHROME_BROWSER_LOGIN_PROMPT_H__
+#endif // CHROME_BROWSER_LOGIN_PROMPT_H_
diff --git a/chrome/browser/login_prompt_win.cc b/chrome/browser/login_prompt_win.cc
new file mode 100644
index 0000000..4437737
--- /dev/null
+++ b/chrome/browser/login_prompt_win.cc
@@ -0,0 +1,292 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/login_prompt.h"
+
+#include "app/l10n_util.h"
+#include "base/message_loop.h"
+#include "chrome/browser/password_manager/password_manager.h"
+#include "chrome/browser/tab_contents/navigation_controller.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/tab_contents/tab_util.h"
+#include "chrome/browser/views/login_view.h"
+#include "chrome/common/notification_service.h"
+#include "grit/generated_resources.h"
+#include "net/url_request/url_request.h"
+#include "views/window/dialog_delegate.h"
+
+using views::LoginView;
+using webkit_glue::PasswordForm;
+
+// ----------------------------------------------------------------------------
+// LoginHandlerWin
+
+// This class simply forwards the authentication from the LoginView (on
+// the UI thread) to the URLRequest (on the I/O thread).
+// This class uses ref counting to ensure that it lives until all InvokeLaters
+// have been called.
+class LoginHandlerWin : public LoginHandler,
+ public base::RefCountedThreadSafe<LoginHandlerWin>,
+ public views::DialogDelegate {
+ public:
+ LoginHandlerWin(URLRequest* request, MessageLoop* ui_loop)
+ : dialog_(NULL),
+ handled_auth_(false),
+ request_(request),
+ request_loop_(MessageLoop::current()),
+ ui_loop_(ui_loop),
+ password_manager_(NULL) {
+ DCHECK(request_) << "LoginHandler constructed with NULL request";
+
+ AddRef(); // matched by ReleaseLater.
+ if (!tab_util::GetTabContentsID(request_, &render_process_host_id_,
+ &tab_contents_id_)) {
+ NOTREACHED();
+ }
+ }
+
+ ~LoginHandlerWin() {
+ }
+
+ void set_login_view(LoginView* login_view) {
+ login_view_ = login_view;
+ }
+
+ // views::DialogDelegate methods:
+ virtual std::wstring GetDialogButtonLabel(
+ MessageBoxFlags::DialogButton button) const {
+ if (button == MessageBoxFlags::DIALOGBUTTON_OK)
+ return l10n_util::GetString(IDS_LOGIN_DIALOG_OK_BUTTON_LABEL);
+ return DialogDelegate::GetDialogButtonLabel(button);
+ }
+ virtual std::wstring GetWindowTitle() const {
+ return l10n_util::GetString(IDS_LOGIN_DIALOG_TITLE);
+ }
+ virtual void WindowClosing() {
+ DCHECK(MessageLoop::current() == ui_loop_);
+
+ // Reference is no longer valid.
+ dialog_ = NULL;
+
+ if (!WasAuthHandled(true)) {
+ request_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &LoginHandlerWin::CancelAuthDeferred));
+ SendNotifications();
+ }
+ }
+ virtual void DeleteDelegate() {
+ // Delete this object once all InvokeLaters have been called.
+ request_loop_->ReleaseSoon(FROM_HERE, this);
+ }
+ virtual bool Cancel() {
+ DCHECK(MessageLoop::current() == ui_loop_);
+ DCHECK(dialog_) << "LoginHandler invoked without being attached";
+ CancelAuth();
+ return true;
+ }
+ virtual bool Accept() {
+ DCHECK(MessageLoop::current() == ui_loop_);
+ DCHECK(dialog_) << "LoginHandler invoked without being attached";
+ SetAuth(login_view_->GetUsername(), login_view_->GetPassword());
+ return true;
+ }
+ virtual views::View* GetContentsView() {
+ return login_view_;
+ }
+
+ // LoginHandler:
+
+ virtual void BuildViewForPasswordManager(PasswordManager* manager,
+ std::wstring explanation) {
+ DCHECK(MessageLoop::current() == ui_loop_);
+
+ LoginView* view = new LoginView(explanation);
+
+ // Set the model for the login view. The model (password manager) is owned
+ // by the view's parent TabContents, so natural destruction order means we
+ // don't have to worry about calling SetModel(NULL), because the view will
+ // be deleted before the password manager.
+ view->SetModel(manager);
+
+ set_login_view(view);
+
+ // Scary thread safety note: This can potentially be called *after* SetAuth
+ // or CancelAuth (say, if the request was cancelled before the UI thread got
+ // control). However, that's OK since any UI interaction in those functions
+ // will occur via an InvokeLater on the UI thread, which is guaranteed
+ // to happen after this is called (since this was InvokeLater'd first).
+ dialog_ = GetTabContentsForLogin()->CreateConstrainedDialog(this);
+ SendNotifications();
+ }
+
+ virtual void SetPasswordForm(const webkit_glue::PasswordForm& form) {
+ password_form_ = form;
+ }
+
+ virtual void SetPasswordManager(PasswordManager* password_manager) {
+ password_manager_ = password_manager;
+ }
+
+ virtual TabContents* GetTabContentsForLogin() {
+ DCHECK(MessageLoop::current() == ui_loop_);
+
+ return tab_util::GetTabContentsByID(render_process_host_id_,
+ tab_contents_id_);
+ }
+
+ virtual void SetAuth(const std::wstring& username,
+ const std::wstring& password) {
+ if (WasAuthHandled(true))
+ return;
+
+ // Tell the password manager the credentials were submitted / accepted.
+ if (password_manager_) {
+ password_form_.username_value = username;
+ password_form_.password_value = password;
+ password_manager_->ProvisionallySavePassword(password_form_);
+ }
+
+ ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &LoginHandlerWin::CloseContentsDeferred));
+ ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &LoginHandlerWin::SendNotifications));
+ request_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &LoginHandlerWin::SetAuthDeferred, username, password));
+ }
+
+ virtual void CancelAuth() {
+ if (WasAuthHandled(true))
+ return;
+
+ ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &LoginHandlerWin::CloseContentsDeferred));
+ ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &LoginHandlerWin::SendNotifications));
+ request_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &LoginHandlerWin::CancelAuthDeferred));
+ }
+
+ virtual void OnRequestCancelled() {
+ DCHECK(MessageLoop::current() == request_loop_) <<
+ "Why is OnRequestCancelled called from the UI thread?";
+
+ // Reference is no longer valid.
+ request_ = NULL;
+
+ // Give up on auth if the request was cancelled.
+ CancelAuth();
+ }
+
+ private:
+ friend class LoginPrompt;
+
+ // Calls SetAuth from the request_loop.
+ void SetAuthDeferred(const std::wstring& username,
+ const std::wstring& password) {
+ DCHECK(MessageLoop::current() == request_loop_);
+
+ if (request_) {
+ request_->SetAuth(username, password);
+ ResetLoginHandlerForRequest(request_);
+ }
+ }
+
+ // Calls CancelAuth from the request_loop.
+ void CancelAuthDeferred() {
+ DCHECK(MessageLoop::current() == request_loop_);
+
+ if (request_) {
+ request_->CancelAuth();
+ // Verify that CancelAuth does destroy the request via our delegate.
+ DCHECK(request_ != NULL);
+ ResetLoginHandlerForRequest(request_);
+ }
+ }
+
+ // Closes the view_contents from the UI loop.
+ void CloseContentsDeferred() {
+ DCHECK(MessageLoop::current() == ui_loop_);
+
+ // The hosting ConstrainedWindow may have been freed.
+ if (dialog_)
+ dialog_->CloseConstrainedWindow();
+ }
+
+ // Returns whether authentication had been handled (SetAuth or CancelAuth).
+ // If |set_handled| is true, it will mark authentication as handled.
+ bool WasAuthHandled(bool set_handled) {
+ AutoLock lock(handled_auth_lock_);
+ bool was_handled = handled_auth_;
+ if (set_handled)
+ handled_auth_ = true;
+ return was_handled;
+ }
+
+ // Notify observers that authentication is needed or received. The automation
+ // proxy uses this for testing.
+ void SendNotifications() {
+ DCHECK(MessageLoop::current() == ui_loop_);
+
+ NotificationService* service = NotificationService::current();
+ TabContents* requesting_contents = GetTabContentsForLogin();
+ if (!requesting_contents)
+ return;
+
+ NavigationController* controller = &requesting_contents->controller();
+
+ if (!WasAuthHandled(false)) {
+ LoginNotificationDetails details(this);
+ service->Notify(NotificationType::AUTH_NEEDED,
+ Source<NavigationController>(controller),
+ Details<LoginNotificationDetails>(&details));
+ } else {
+ service->Notify(NotificationType::AUTH_SUPPLIED,
+ Source<NavigationController>(controller),
+ NotificationService::NoDetails());
+ }
+ }
+
+ // True if we've handled auth (SetAuth or CancelAuth has been called).
+ bool handled_auth_;
+ Lock handled_auth_lock_;
+
+ // The ConstrainedWindow that is hosting our LoginView.
+ // This should only be accessed on the ui_loop_.
+ ConstrainedWindow* dialog_;
+
+ // The MessageLoop of the thread that the ChromeViewContents lives in.
+ MessageLoop* ui_loop_;
+
+ // The request that wants login data.
+ // This should only be accessed on the request_loop_.
+ URLRequest* request_;
+
+ // The MessageLoop of the thread that the URLRequest lives in.
+ MessageLoop* request_loop_;
+
+ // The LoginView that contains the user's login information
+ LoginView* login_view_;
+
+ // The PasswordForm sent to the PasswordManager. This is so we can refer to it
+ // when later notifying the password manager if the credentials were accepted
+ // or rejected.
+ // This should only be accessed on the ui_loop_.
+ PasswordForm password_form_;
+
+ // Points to the password manager owned by the TabContents requesting auth.
+ // Can be null if the TabContents is not a TabContents.
+ // This should only be accessed on the ui_loop_.
+ PasswordManager* password_manager_;
+
+ // Cached from the URLRequest, in case it goes NULL on us.
+ int render_process_host_id_;
+ int tab_contents_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(LoginHandlerWin);
+};
+
+// static
+LoginHandler* LoginHandler::Create(URLRequest* request, MessageLoop* ui_loop) {
+ return new LoginHandlerWin(request, ui_loop);
+}
diff --git a/chrome/browser/tab_contents/constrained_window.h b/chrome/browser/tab_contents/constrained_window.h
index eb30363..35679a5 100644
--- a/chrome/browser/tab_contents/constrained_window.h
+++ b/chrome/browser/tab_contents/constrained_window.h
@@ -36,8 +36,6 @@ class ConstrainedWindow {
// within the constraining TabContents.
static ConstrainedWindow* CreateConstrainedDialog(
TabContents* owner,
- const gfx::Rect& initial_bounds,
- views::View* contents_view,
views::WindowDelegate* window_delegate);
// Closes the Constrained Window.
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index bd4e803..bb3a80f 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -741,11 +741,10 @@ void TabContents::CreateShortcut() {
#if defined(OS_WIN)
ConstrainedWindow* TabContents::CreateConstrainedDialog(
- views::WindowDelegate* window_delegate,
- views::View* contents_view) {
+ views::WindowDelegate* window_delegate) {
ConstrainedWindow* window =
ConstrainedWindow::CreateConstrainedDialog(
- this, gfx::Rect(), contents_view, window_delegate);
+ this, window_delegate);
child_windows_.push_back(window);
return window;
}
diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h
index ddf42b5..609e154 100644
--- a/chrome/browser/tab_contents/tab_contents.h
+++ b/chrome/browser/tab_contents/tab_contents.h
@@ -330,8 +330,7 @@ class TabContents : public PageNavigator,
// is sized according to the preferred size of the content_view, and centered
// within the contents.
ConstrainedWindow* CreateConstrainedDialog(
- views::WindowDelegate* window_delegate,
- views::View* contents_view);
+ views::WindowDelegate* window_delegate);
#endif
// Adds a new tab or window with the given already-created contents
diff --git a/chrome/browser/views/constrained_window_impl.cc b/chrome/browser/views/constrained_window_impl.cc
index 4ff891e..75f3771 100644
--- a/chrome/browser/views/constrained_window_impl.cc
+++ b/chrome/browser/views/constrained_window_impl.cc
@@ -626,18 +626,13 @@ ConstrainedWindowImpl::ConstrainedWindowImpl(
: WindowWin(window_delegate),
owner_(owner) {
GetNonClientView()->SetFrameView(CreateFrameViewForWindow());
- Init();
-}
-void ConstrainedWindowImpl::Init() {
focus_restoration_disabled_ = false;
set_window_style(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION |
WS_THICKFRAME | WS_SYSMENU);
set_focus_on_creation(false);
-}
-void ConstrainedWindowImpl::InitAsDialog(const gfx::Rect& initial_bounds) {
- WindowWin::Init(owner_->GetNativeView(), initial_bounds);
+ WindowWin::Init(owner_->GetNativeView(), gfx::Rect());
ActivateConstrainedWindow();
}
@@ -720,17 +715,12 @@ void ConstrainedWindowImpl::OnWindowPosChanged(WINDOWPOS* window_pos) {
SetMsgHandled(FALSE);
}
-///////////////////////////////////////////////////////////////////////////////
-// ConstrainedWindow, public:
// static
ConstrainedWindow* ConstrainedWindow::CreateConstrainedDialog(
TabContents* parent,
- const gfx::Rect& initial_bounds,
- views::View* contents_view,
views::WindowDelegate* window_delegate) {
ConstrainedWindowImpl* window = new ConstrainedWindowImpl(parent,
window_delegate);
- window->InitAsDialog(initial_bounds);
return window;
}
diff --git a/chrome/browser/views/constrained_window_impl.h b/chrome/browser/views/constrained_window_impl.h
index 2f3c32e..1afd658 100644
--- a/chrome/browser/views/constrained_window_impl.h
+++ b/chrome/browser/views/constrained_window_impl.h
@@ -53,11 +53,6 @@ class ConstrainedWindowImpl : public ConstrainedWindow,
// ConstrainedWindow.
ConstrainedWindowImpl(TabContents* owner,
views::WindowDelegate* window_delegate);
- void Init();
-
- // Initialize the Constrained Window as a Constrained Dialog containing a
- // views::View client area.
- void InitAsDialog(const gfx::Rect& initial_bounds);
// Moves this window to the front of the Z-order and registers us with the
// focus manager.