OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/login/login_prompt.h" | 5 #include "chrome/browser/ui/login/login_prompt.h" |
6 | 6 |
7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
8 | 8 |
9 #include "base/string16.h" | 9 #include "base/string16.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 using content::PasswordForm; | 29 using content::PasswordForm; |
30 using content::WebContents; | 30 using content::WebContents; |
31 | 31 |
32 // ---------------------------------------------------------------------------- | 32 // ---------------------------------------------------------------------------- |
33 // LoginHandlerGtk | 33 // LoginHandlerGtk |
34 | 34 |
35 // This class simply forwards the authentication from the LoginView (on | 35 // This class simply forwards the authentication from the LoginView (on |
36 // the UI thread) to the net::URLRequest (on the I/O thread). | 36 // the UI thread) to the net::URLRequest (on the I/O thread). |
37 // This class uses ref counting to ensure that it lives until all InvokeLaters | 37 // This class uses ref counting to ensure that it lives until all InvokeLaters |
38 // have been called. | 38 // have been called. |
39 class LoginHandlerGtk : public LoginHandler, | 39 class LoginHandlerGtk : public LoginHandler { |
40 public ConstrainedWindowGtkDelegate { | |
41 public: | 40 public: |
42 LoginHandlerGtk(net::AuthChallengeInfo* auth_info, net::URLRequest* request) | 41 LoginHandlerGtk(net::AuthChallengeInfo* auth_info, net::URLRequest* request) |
43 : LoginHandler(auth_info, request), | 42 : LoginHandler(auth_info, request), |
44 username_entry_(NULL), | 43 username_entry_(NULL), |
45 password_entry_(NULL), | 44 password_entry_(NULL), |
46 ok_(NULL), | 45 ok_(NULL), |
47 dialog_(NULL) { | 46 dialog_(NULL) { |
48 } | 47 } |
49 | 48 |
50 // LoginModelObserver implementation. | 49 // LoginModelObserver implementation. |
(...skipping 12 matching lines...) Expand all Loading... |
63 } | 62 } |
64 } | 63 } |
65 | 64 |
66 // LoginHandler: | 65 // LoginHandler: |
67 virtual void BuildViewForPasswordManager( | 66 virtual void BuildViewForPasswordManager( |
68 PasswordManager* manager, | 67 PasswordManager* manager, |
69 const string16& explanation) OVERRIDE { | 68 const string16& explanation) OVERRIDE { |
70 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 69 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
71 | 70 |
72 root_.Own(gtk_vbox_new(FALSE, ui::kContentAreaBorder)); | 71 root_.Own(gtk_vbox_new(FALSE, ui::kContentAreaBorder)); |
| 72 g_signal_connect(root_.get(), "destroy", G_CALLBACK(OnDestroyThunk), this); |
| 73 |
73 GtkWidget* label = gtk_label_new(UTF16ToUTF8(explanation).c_str()); | 74 GtkWidget* label = gtk_label_new(UTF16ToUTF8(explanation).c_str()); |
74 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | 75 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); |
75 gtk_box_pack_start(GTK_BOX(root_.get()), label, FALSE, FALSE, 0); | 76 gtk_box_pack_start(GTK_BOX(root_.get()), label, FALSE, FALSE, 0); |
76 | 77 |
77 username_entry_ = gtk_entry_new(); | 78 username_entry_ = gtk_entry_new(); |
78 gtk_entry_set_activates_default(GTK_ENTRY(username_entry_), TRUE); | 79 gtk_entry_set_activates_default(GTK_ENTRY(username_entry_), TRUE); |
79 | 80 |
80 password_entry_ = gtk_entry_new(); | 81 password_entry_ = gtk_entry_new(); |
81 gtk_entry_set_activates_default(GTK_ENTRY(password_entry_), TRUE); | 82 gtk_entry_set_activates_default(GTK_ENTRY(password_entry_), TRUE); |
82 gtk_entry_set_visibility(GTK_ENTRY(password_entry_), FALSE); | 83 gtk_entry_set_visibility(GTK_ENTRY(password_entry_), FALSE); |
(...skipping 26 matching lines...) Expand all Loading... |
109 SetModel(manager); | 110 SetModel(manager); |
110 | 111 |
111 // Scary thread safety note: This can potentially be called *after* SetAuth | 112 // Scary thread safety note: This can potentially be called *after* SetAuth |
112 // or CancelAuth (say, if the request was cancelled before the UI thread got | 113 // or CancelAuth (say, if the request was cancelled before the UI thread got |
113 // control). However, that's OK since any UI interaction in those functions | 114 // control). However, that's OK since any UI interaction in those functions |
114 // will occur via an InvokeLater on the UI thread, which is guaranteed | 115 // will occur via an InvokeLater on the UI thread, which is guaranteed |
115 // to happen after this is called (since this was InvokeLater'd first). | 116 // to happen after this is called (since this was InvokeLater'd first). |
116 WebContents* requesting_contents = GetWebContentsForLogin(); | 117 WebContents* requesting_contents = GetWebContentsForLogin(); |
117 DCHECK(requesting_contents); | 118 DCHECK(requesting_contents); |
118 | 119 |
119 dialog_ = CreateWebContentsModalDialogGtk(requesting_contents, this); | 120 dialog_ = CreateWebContentsModalDialogGtk(requesting_contents, |
| 121 root_.get(), |
| 122 username_entry_); |
120 | 123 |
121 WebContentsModalDialogManager* web_contents_modal_dialog_manager = | 124 WebContentsModalDialogManager* web_contents_modal_dialog_manager = |
122 WebContentsModalDialogManager::FromWebContents(requesting_contents); | 125 WebContentsModalDialogManager::FromWebContents(requesting_contents); |
123 web_contents_modal_dialog_manager->ShowDialog(dialog_); | 126 web_contents_modal_dialog_manager->ShowDialog(dialog_); |
124 | 127 |
125 NotifyAuthNeeded(); | 128 NotifyAuthNeeded(); |
126 } | 129 } |
127 | 130 |
128 virtual void CloseDialog() OVERRIDE { | 131 virtual void CloseDialog() OVERRIDE { |
129 // The hosting dialog may have been freed. | 132 // The hosting dialog may have been freed. |
130 if (dialog_) | 133 if (dialog_) |
131 gtk_widget_destroy(dialog_); | 134 gtk_widget_destroy(dialog_); |
132 } | 135 } |
133 | 136 |
134 // Overridden from ConstrainedWindowGtkDelegate: | |
135 virtual GtkWidget* GetWidgetRoot() OVERRIDE { | |
136 return root_.get(); | |
137 } | |
138 | |
139 virtual GtkWidget* GetFocusWidget() OVERRIDE { | |
140 return username_entry_; | |
141 } | |
142 | |
143 virtual void DeleteDelegate() OVERRIDE { | |
144 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
145 | |
146 // The constrained window is going to delete itself; clear our pointer. | |
147 dialog_ = NULL; | |
148 SetModel(NULL); | |
149 | |
150 ReleaseSoon(); | |
151 } | |
152 | |
153 protected: | 137 protected: |
154 virtual ~LoginHandlerGtk() { | 138 virtual ~LoginHandlerGtk() { |
155 root_.Destroy(); | 139 root_.Destroy(); |
156 } | 140 } |
157 | 141 |
158 private: | 142 private: |
159 friend class LoginPrompt; | 143 friend class LoginPrompt; |
160 | 144 |
161 CHROMEGTK_CALLBACK_0(LoginHandlerGtk, void, OnOKClicked); | 145 CHROMEGTK_CALLBACK_0(LoginHandlerGtk, void, OnOKClicked); |
162 CHROMEGTK_CALLBACK_0(LoginHandlerGtk, void, OnCancelClicked); | 146 CHROMEGTK_CALLBACK_0(LoginHandlerGtk, void, OnCancelClicked); |
163 CHROMEGTK_CALLBACK_1(LoginHandlerGtk, void, OnPromptHierarchyChanged, | 147 CHROMEGTK_CALLBACK_1(LoginHandlerGtk, void, OnPromptHierarchyChanged, |
164 GtkWidget*); | 148 GtkWidget*); |
| 149 CHROMEGTK_CALLBACK_0(LoginHandlerGtk, void, OnDestroy); |
165 | 150 |
166 // The GtkWidgets that form our visual hierarchy: | 151 // The GtkWidgets that form our visual hierarchy: |
167 // The root container we pass to our parent. | 152 // The root container we pass to our parent. |
168 ui::OwnedWidgetGtk root_; | 153 ui::OwnedWidgetGtk root_; |
169 | 154 |
170 // GtkEntry widgets that the user types into. | 155 // GtkEntry widgets that the user types into. |
171 GtkWidget* username_entry_; | 156 GtkWidget* username_entry_; |
172 GtkWidget* password_entry_; | 157 GtkWidget* password_entry_; |
173 GtkWidget* ok_; | 158 GtkWidget* ok_; |
174 | 159 |
(...skipping 23 matching lines...) Expand all Loading... |
198 // button the default action and mess with the focus. | 183 // button the default action and mess with the focus. |
199 gtk_widget_set_can_default(ok_, TRUE); | 184 gtk_widget_set_can_default(ok_, TRUE); |
200 gtk_widget_grab_default(ok_); | 185 gtk_widget_grab_default(ok_); |
201 } | 186 } |
202 | 187 |
203 // static | 188 // static |
204 LoginHandler* LoginHandler::Create(net::AuthChallengeInfo* auth_info, | 189 LoginHandler* LoginHandler::Create(net::AuthChallengeInfo* auth_info, |
205 net::URLRequest* request) { | 190 net::URLRequest* request) { |
206 return new LoginHandlerGtk(auth_info, request); | 191 return new LoginHandlerGtk(auth_info, request); |
207 } | 192 } |
| 193 |
| 194 void LoginHandlerGtk::OnDestroy(GtkWidget* widget) { |
| 195 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 196 |
| 197 // The web contents modal dialog is going to delete itself; clear our pointer. |
| 198 dialog_ = NULL; |
| 199 SetModel(NULL); |
| 200 |
| 201 ReleaseSoon(); |
| 202 } |
OLD | NEW |