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/autofill/autofill_external_delegate_gtk.h" | 5 #include "chrome/browser/autofill/autofill_external_delegate_gtk.h" |
6 | 6 |
7 #include "chrome/browser/ui/gtk/autofill/autofill_popup_view_gtk.h" | 7 #include "chrome/browser/ui/gtk/autofill/autofill_popup_view_gtk.h" |
8 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 8 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
9 #include "content/public/browser/web_contents.h" | 9 #include "content/public/browser/web_contents.h" |
10 #include "content/public/browser/web_contents_view.h" | 10 #include "content/public/browser/web_contents_view.h" |
11 | 11 |
12 AutofillExternalDelegate* AutofillExternalDelegate::Create( | 12 AutofillExternalDelegate* AutofillExternalDelegate::Create( |
13 TabContentsWrapper* tab_contents_wrapper, | 13 TabContentsWrapper* tab_contents_wrapper, |
14 AutofillManager* autofill_manager) { | 14 AutofillManager* autofill_manager) { |
15 return new AutofillExternalDelegateGtk(tab_contents_wrapper, | 15 return new AutofillExternalDelegateGtk(tab_contents_wrapper, |
16 autofill_manager); | 16 autofill_manager); |
17 } | 17 } |
18 | 18 |
19 AutofillExternalDelegateGtk::AutofillExternalDelegateGtk( | 19 AutofillExternalDelegateGtk::AutofillExternalDelegateGtk( |
20 TabContentsWrapper* tab_contents_wrapper, | 20 TabContentsWrapper* tab_contents_wrapper, |
21 AutofillManager* autofill_manager) | 21 AutofillManager* autofill_manager) |
22 : AutofillExternalDelegate(tab_contents_wrapper, autofill_manager), | 22 : AutofillExternalDelegate(tab_contents_wrapper, autofill_manager), |
23 web_contents_(tab_contents_wrapper->web_contents()) { | 23 web_contents_(tab_contents_wrapper->web_contents()) { |
24 tab_native_view_ = web_contents_->GetView()->GetNativeView(); | 24 tab_native_view_ = web_contents_->GetView()->GetNativeView(); |
25 } | 25 } |
26 | 26 |
27 AutofillExternalDelegateGtk::~AutofillExternalDelegateGtk() { | 27 AutofillExternalDelegateGtk::~AutofillExternalDelegateGtk() { |
28 } | 28 } |
29 | 29 |
| 30 void AutofillExternalDelegateGtk::HideAutofillPopup() { |
| 31 if (!view_.get()) |
| 32 return; |
| 33 |
| 34 view_->Hide(); |
| 35 view_.reset(); |
| 36 |
| 37 GtkWidget* toplevel = gtk_widget_get_toplevel(tab_native_view_); |
| 38 g_signal_handler_disconnect(toplevel, event_handler_id_); |
| 39 } |
| 40 |
30 void AutofillExternalDelegateGtk::OnQueryPlatformSpecific( | 41 void AutofillExternalDelegateGtk::OnQueryPlatformSpecific( |
31 int query_id, | 42 int query_id, |
32 const webkit::forms::FormData& form, | 43 const webkit::forms::FormData& form, |
33 const webkit::forms::FormField& field, | 44 const webkit::forms::FormField& field, |
34 const gfx::Rect& bounds) { | 45 const gfx::Rect& bounds) { |
35 CreateViewIfNeeded(); | 46 CreateViewIfNeeded(); |
36 view_->set_element_bounds(bounds); | 47 view_->set_element_bounds(bounds); |
37 } | 48 } |
38 | 49 |
39 void AutofillExternalDelegateGtk::ApplyAutofillSuggestions( | 50 void AutofillExternalDelegateGtk::ApplyAutofillSuggestions( |
40 const std::vector<string16>& autofill_values, | 51 const std::vector<string16>& autofill_values, |
41 const std::vector<string16>& autofill_labels, | 52 const std::vector<string16>& autofill_labels, |
42 const std::vector<string16>& autofill_icons, | 53 const std::vector<string16>& autofill_icons, |
43 const std::vector<int>& autofill_unique_ids, | 54 const std::vector<int>& autofill_unique_ids, |
44 int separator_index) { | 55 int separator_index) { |
45 view_->Show(autofill_values, | 56 view_->Show(autofill_values, |
46 autofill_labels, | 57 autofill_labels, |
47 autofill_icons, | 58 autofill_icons, |
48 autofill_unique_ids, | 59 autofill_unique_ids, |
49 separator_index); | 60 separator_index); |
50 } | 61 } |
51 | 62 |
52 void AutofillExternalDelegateGtk::HideAutofillPopup() { | |
53 if (!view_.get()) | |
54 return; | |
55 | |
56 view_->Hide(); | |
57 view_.reset(); | |
58 | |
59 GtkWidget* toplevel = gtk_widget_get_toplevel(tab_native_view_); | |
60 g_signal_handler_disconnect(toplevel, event_handler_id_); | |
61 } | |
62 | |
63 void AutofillExternalDelegateGtk::CreateViewIfNeeded() { | 63 void AutofillExternalDelegateGtk::CreateViewIfNeeded() { |
64 if (view_.get()) | 64 if (view_.get()) |
65 return; | 65 return; |
66 | 66 |
67 view_.reset(new AutofillPopupViewGtk(web_contents_, | 67 view_.reset(new AutofillPopupViewGtk(web_contents_, |
| 68 this, |
68 tab_native_view_)); | 69 tab_native_view_)); |
69 | 70 |
70 GtkWidget* toplevel = gtk_widget_get_toplevel(tab_native_view_); | 71 GtkWidget* toplevel = gtk_widget_get_toplevel(tab_native_view_); |
71 if (!g_signal_handler_is_connected(toplevel, event_handler_id_)) { | 72 if (!g_signal_handler_is_connected(toplevel, event_handler_id_)) { |
72 event_handler_id_ = g_signal_connect( | 73 event_handler_id_ = g_signal_connect( |
73 toplevel, | 74 toplevel, |
74 "focus-out-event", | 75 "focus-out-event", |
75 G_CALLBACK(HandleViewFocusOutThunk), | 76 G_CALLBACK(HandleViewFocusOutThunk), |
76 this); | 77 this); |
77 } | 78 } |
78 } | 79 } |
79 | 80 |
80 gboolean AutofillExternalDelegateGtk::HandleViewFocusOut(GtkWidget* sender, | 81 gboolean AutofillExternalDelegateGtk::HandleViewFocusOut(GtkWidget* sender, |
81 GdkEventFocus* event) { | 82 GdkEventFocus* event) { |
82 HideAutofillPopup(); | 83 HideAutofillPopup(); |
83 | 84 |
84 return TRUE; | 85 return TRUE; |
85 } | 86 } |
OLD | NEW |