Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6437)

Unified Diff: chrome/browser/login_prompt_gtk.cc

Issue 995004: Factoring duplicate code from platform-specific LoginHandlers into a base ... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/login_prompt.cc ('k') | chrome/browser/login_prompt_mac.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/login_prompt_gtk.cc
===================================================================
--- chrome/browser/login_prompt_gtk.cc (revision 42281)
+++ chrome/browser/login_prompt_gtk.cc (working copy)
@@ -31,43 +31,20 @@
// This class uses ref counting to ensure that it lives until all InvokeLaters
// have been called.
class LoginHandlerGtk : public LoginHandler,
- public base::RefCountedThreadSafe<LoginHandlerGtk>,
- public ConstrainedWindowGtkDelegate,
- public LoginModelObserver {
+ public ConstrainedWindowGtkDelegate {
public:
- explicit LoginHandlerGtk(URLRequest* request)
- : handled_auth_(false),
- dialog_(NULL),
- request_(request),
- password_manager_(NULL),
- login_model_(NULL) {
- DCHECK(request_) << "LoginHandlerGtk constructed with NULL request";
-
- AddRef(); // matched by ReleaseLater.
- if (!ResourceDispatcherHost::RenderViewForRequest(request_,
- &render_process_host_id_,
- &tab_contents_id_)) {
- NOTREACHED();
- }
+ explicit LoginHandlerGtk(URLRequest* request) : LoginHandler(request) {
}
virtual ~LoginHandlerGtk() {
- if (login_model_)
- login_model_->SetObserver(NULL);
root_.Destroy();
}
- void SetModel(LoginModel* model) {
- if (login_model_)
- login_model_->SetObserver(NULL);
- login_model_ = model;
- if (login_model_)
- login_model_->SetObserver(this);
- }
-
// LoginModelObserver implementation.
virtual void OnAutofillDataAvailable(const std::wstring& username,
const std::wstring& password) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+
// NOTE: Would be nice to use gtk_entry_get_text_length, but it is fairly
// new and not always in our GTK version.
if (strlen(gtk_entry_get_text(GTK_ENTRY(username_entry_))) == 0) {
@@ -128,168 +105,29 @@
// 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);
+ SetDialog(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(ChromeThread::CurrentlyOn(ChromeThread::UI));
-
- 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 = WideToUTF16Hack(username);
- password_form_.password_value = WideToUTF16Hack(password);
- password_manager_->ProvisionallySavePassword(password_form_);
- }
-
- ChromeThread::PostTask(
- ChromeThread::UI, FROM_HERE,
- NewRunnableMethod(this, &LoginHandlerGtk::CloseContentsDeferred));
- ChromeThread::PostTask(
- ChromeThread::UI, FROM_HERE,
- NewRunnableMethod(this, &LoginHandlerGtk::SendNotifications));
- ChromeThread::PostTask(
- ChromeThread::IO, FROM_HERE,
- NewRunnableMethod(this, &LoginHandlerGtk::SetAuthDeferred, username,
- password));
- }
-
- virtual void CancelAuth() {
- if (WasAuthHandled(true))
- return;
-
- ChromeThread::PostTask(
- ChromeThread::UI, FROM_HERE,
- NewRunnableMethod(this, &LoginHandlerGtk::CloseContentsDeferred));
- ChromeThread::PostTask(
- ChromeThread::UI, FROM_HERE,
- NewRunnableMethod(this, &LoginHandlerGtk::SendNotifications));
- ChromeThread::PostTask(
- ChromeThread::IO, FROM_HERE,
- NewRunnableMethod(this, &LoginHandlerGtk::CancelAuthDeferred));
- }
-
- virtual void OnRequestCancelled() {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)) <<
- "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();
- }
-
// Overridden from ConstrainedWindowGtkDelegate:
virtual GtkWidget* GetWidgetRoot() {
return root_.get();
}
virtual void DeleteDelegate() {
- if (!WasAuthHandled(true)) {
- ChromeThread::PostTask(
- ChromeThread::IO, FROM_HERE,
- NewRunnableMethod(this, &LoginHandlerGtk::CancelAuthDeferred));
- ChromeThread::PostTask(
- ChromeThread::UI, FROM_HERE,
- NewRunnableMethod(this, &LoginHandlerGtk::SendNotifications));
- }
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
// The constrained window is going to delete itself; clear our pointer.
- dialog_ = NULL;
+ SetDialog(NULL);
SetModel(NULL);
- // Delete this object once all InvokeLaters have been called.
- ChromeThread::ReleaseSoon(ChromeThread::IO, FROM_HERE, this);
+ ReleaseSoon();
}
private:
friend class LoginPrompt;
- // Calls SetAuth from the IO loop.
- void SetAuthDeferred(const std::wstring& username,
- const std::wstring& password) {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
-
- if (request_) {
- request_->SetAuth(username, password);
- ResetLoginHandlerForRequest(request_);
- }
- }
-
- // Calls CancelAuth from the IO loop.
- void CancelAuthDeferred() {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
-
- 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(ChromeThread::CurrentlyOn(ChromeThread::UI));
-
- // 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(ChromeThread::CurrentlyOn(ChromeThread::UI));
-
- 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());
- }
- }
-
static void OnOKClicked(GtkButton *button, LoginHandlerGtk* handler) {
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
@@ -300,6 +138,7 @@
static void OnCancelClicked(GtkButton *button, LoginHandlerGtk* handler) {
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+
handler->CancelAuth();
}
@@ -307,6 +146,7 @@
GtkWidget* previous_toplevel,
LoginHandlerGtk* handler) {
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+
if (!GTK_WIDGET_TOPLEVEL(gtk_widget_get_toplevel(handler->ok_)))
return;
@@ -315,35 +155,8 @@
GTK_WIDGET_SET_FLAGS(handler->ok_, GTK_CAN_DEFAULT);
gtk_widget_grab_default(handler->ok_);
gtk_widget_grab_focus(handler->username_entry_);
-}
+ }
- // 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 request that wants login data.
- // This should only be accessed on the IO loop.
- URLRequest* request_;
-
- // 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_;
-
// The GtkWidgets that form our visual hierarchy:
// The root container we pass to our parent.
OwnedWidgetGtk root_;
@@ -353,10 +166,6 @@
GtkWidget* password_entry_;
GtkWidget* ok_;
- // If not null, points to a model we need to notify of our own destruction
- // so it doesn't try and access this when its too late.
- LoginModel* login_model_;
-
DISALLOW_COPY_AND_ASSIGN(LoginHandlerGtk);
};
« no previous file with comments | « chrome/browser/login_prompt.cc ('k') | chrome/browser/login_prompt_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698