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 "content/browser/web_contents/web_contents_view_gtk.h" | 5 #include "content/browser/web_contents/web_contents_view_gtk.h" |
6 | 6 |
7 #include <gdk/gdk.h> | 7 #include <gdk/gdk.h> |
8 #include <gdk/gdkkeysyms.h> | 8 #include <gdk/gdkkeysyms.h> |
9 #include <gtk/gtk.h> | 9 #include <gtk/gtk.h> |
10 | 10 |
(...skipping 13 matching lines...) Expand all Loading... |
24 #include "content/public/browser/web_contents_view_delegate.h" | 24 #include "content/public/browser/web_contents_view_delegate.h" |
25 #include "ui/base/gtk/gtk_expanded_container.h" | 25 #include "ui/base/gtk/gtk_expanded_container.h" |
26 #include "ui/gfx/image/image_skia.h" | 26 #include "ui/gfx/image/image_skia.h" |
27 #include "ui/gfx/point.h" | 27 #include "ui/gfx/point.h" |
28 #include "ui/gfx/rect.h" | 28 #include "ui/gfx/rect.h" |
29 #include "ui/gfx/size.h" | 29 #include "ui/gfx/size.h" |
30 #include "webkit/glue/webdropdata.h" | 30 #include "webkit/glue/webdropdata.h" |
31 | 31 |
32 using WebKit::WebDragOperation; | 32 using WebKit::WebDragOperation; |
33 using WebKit::WebDragOperationsMask; | 33 using WebKit::WebDragOperationsMask; |
34 using content::RenderWidgetHost; | |
35 using content::WebContents; | |
36 | 34 |
| 35 namespace content { |
37 namespace { | 36 namespace { |
38 | 37 |
39 // Called when the mouse leaves the widget. We notify our delegate. | 38 // Called when the mouse leaves the widget. We notify our delegate. |
40 gboolean OnLeaveNotify(GtkWidget* widget, GdkEventCrossing* event, | 39 gboolean OnLeaveNotify(GtkWidget* widget, GdkEventCrossing* event, |
41 WebContentsImpl* web_contents) { | 40 WebContentsImpl* web_contents) { |
42 if (web_contents->GetDelegate()) | 41 if (web_contents->GetDelegate()) |
43 web_contents->GetDelegate()->ContentsMouseEvent( | 42 web_contents->GetDelegate()->ContentsMouseEvent( |
44 web_contents, gfx::Point(event->x_root, event->y_root), false); | 43 web_contents, gfx::Point(event->x_root, event->y_root), false); |
45 return FALSE; | 44 return FALSE; |
46 } | 45 } |
47 | 46 |
48 // Called when the mouse moves within the widget. We notify our delegate. | 47 // Called when the mouse moves within the widget. We notify our delegate. |
49 gboolean OnMouseMove(GtkWidget* widget, GdkEventMotion* event, | 48 gboolean OnMouseMove(GtkWidget* widget, GdkEventMotion* event, |
50 WebContentsImpl* web_contents) { | 49 WebContentsImpl* web_contents) { |
51 if (web_contents->GetDelegate()) | 50 if (web_contents->GetDelegate()) |
52 web_contents->GetDelegate()->ContentsMouseEvent( | 51 web_contents->GetDelegate()->ContentsMouseEvent( |
53 web_contents, gfx::Point(event->x_root, event->y_root), true); | 52 web_contents, gfx::Point(event->x_root, event->y_root), true); |
54 return FALSE; | 53 return FALSE; |
55 } | 54 } |
56 | 55 |
57 // See tab_contents_view_views.cc for discussion of mouse scroll zooming. | 56 // See tab_contents_view_views.cc for discussion of mouse scroll zooming. |
58 gboolean OnMouseScroll(GtkWidget* widget, GdkEventScroll* event, | 57 gboolean OnMouseScroll(GtkWidget* widget, GdkEventScroll* event, |
59 WebContentsImpl* web_contents) { | 58 WebContentsImpl* web_contents) { |
60 if ((event->state & gtk_accelerator_get_default_mod_mask()) != | 59 if ((event->state & gtk_accelerator_get_default_mod_mask()) != |
61 GDK_CONTROL_MASK) { | 60 GDK_CONTROL_MASK) { |
62 return FALSE; | 61 return FALSE; |
63 } | 62 } |
64 | 63 |
65 content::WebContentsDelegate* delegate = web_contents->GetDelegate(); | 64 WebContentsDelegate* delegate = web_contents->GetDelegate(); |
66 if (!delegate) | 65 if (!delegate) |
67 return FALSE; | 66 return FALSE; |
68 | 67 |
69 if (!(event->direction == GDK_SCROLL_DOWN || | 68 if (!(event->direction == GDK_SCROLL_DOWN || |
70 event->direction == GDK_SCROLL_UP)) { | 69 event->direction == GDK_SCROLL_UP)) { |
71 return FALSE; | 70 return FALSE; |
72 } | 71 } |
73 | 72 |
74 delegate->ContentsZoomChange(event->direction == GDK_SCROLL_UP); | 73 delegate->ContentsZoomChange(event->direction == GDK_SCROLL_UP); |
75 return TRUE; | 74 return TRUE; |
76 } | 75 } |
77 | 76 |
78 } // namespace | 77 } // namespace |
79 | 78 |
80 namespace content { | |
81 | |
82 WebContentsView* CreateWebContentsView( | 79 WebContentsView* CreateWebContentsView( |
83 WebContentsImpl* web_contents, | 80 WebContentsImpl* web_contents, |
84 WebContentsViewDelegate* delegate, | 81 WebContentsViewDelegate* delegate, |
85 RenderViewHostDelegateView** render_view_host_delegate_view) { | 82 RenderViewHostDelegateView** render_view_host_delegate_view) { |
86 WebContentsViewGtk* rv = new WebContentsViewGtk(web_contents, delegate); | 83 WebContentsViewGtk* rv = new WebContentsViewGtk(web_contents, delegate); |
87 *render_view_host_delegate_view = rv; | 84 *render_view_host_delegate_view = rv; |
88 return rv; | 85 return rv; |
89 } | 86 } |
90 | 87 |
91 WebContentsViewGtk::WebContentsViewGtk( | 88 WebContentsViewGtk::WebContentsViewGtk( |
92 WebContentsImpl* web_contents, | 89 WebContentsImpl* web_contents, |
93 content::WebContentsViewDelegate* delegate) | 90 WebContentsViewDelegate* delegate) |
94 : web_contents_(web_contents), | 91 : web_contents_(web_contents), |
95 expanded_(gtk_expanded_container_new()), | 92 expanded_(gtk_expanded_container_new()), |
96 delegate_(delegate) { | 93 delegate_(delegate) { |
97 gtk_widget_set_name(expanded_.get(), "chrome-web-contents-view"); | 94 gtk_widget_set_name(expanded_.get(), "chrome-web-contents-view"); |
98 g_signal_connect(expanded_.get(), "size-allocate", | 95 g_signal_connect(expanded_.get(), "size-allocate", |
99 G_CALLBACK(OnSizeAllocateThunk), this); | 96 G_CALLBACK(OnSizeAllocateThunk), this); |
100 g_signal_connect(expanded_.get(), "child-size-request", | 97 g_signal_connect(expanded_.get(), "child-size-request", |
101 G_CALLBACK(OnChildSizeRequestThunk), this); | 98 G_CALLBACK(OnChildSizeRequestThunk), this); |
102 | 99 |
103 gtk_widget_show(expanded_.get()); | 100 gtk_widget_show(expanded_.get()); |
104 drag_source_.reset(new content::WebDragSourceGtk(web_contents)); | 101 drag_source_.reset(new WebDragSourceGtk(web_contents)); |
105 | 102 |
106 if (delegate_.get()) | 103 if (delegate_.get()) |
107 delegate_->Initialize(expanded_.get(), &focus_store_); | 104 delegate_->Initialize(expanded_.get(), &focus_store_); |
108 } | 105 } |
109 | 106 |
110 WebContentsViewGtk::~WebContentsViewGtk() { | 107 WebContentsViewGtk::~WebContentsViewGtk() { |
111 expanded_.Destroy(); | 108 expanded_.Destroy(); |
112 } | 109 } |
113 | 110 |
114 void WebContentsViewGtk::CreateView(const gfx::Size& initial_size) { | 111 void WebContentsViewGtk::CreateView(const gfx::Size& initial_size) { |
(...skipping 21 matching lines...) Expand all Loading... |
136 G_CALLBACK(OnLeaveNotify), web_contents_); | 133 G_CALLBACK(OnLeaveNotify), web_contents_); |
137 g_signal_connect(content_view, "motion-notify-event", | 134 g_signal_connect(content_view, "motion-notify-event", |
138 G_CALLBACK(OnMouseMove), web_contents_); | 135 G_CALLBACK(OnMouseMove), web_contents_); |
139 g_signal_connect(content_view, "scroll-event", | 136 g_signal_connect(content_view, "scroll-event", |
140 G_CALLBACK(OnMouseScroll), web_contents_); | 137 G_CALLBACK(OnMouseScroll), web_contents_); |
141 gtk_widget_add_events(content_view, GDK_LEAVE_NOTIFY_MASK | | 138 gtk_widget_add_events(content_view, GDK_LEAVE_NOTIFY_MASK | |
142 GDK_POINTER_MOTION_MASK); | 139 GDK_POINTER_MOTION_MASK); |
143 InsertIntoContentArea(content_view); | 140 InsertIntoContentArea(content_view); |
144 | 141 |
145 // Renderer target DnD. | 142 // Renderer target DnD. |
146 drag_dest_.reset(new content::WebDragDestGtk(web_contents_, content_view)); | 143 drag_dest_.reset(new WebDragDestGtk(web_contents_, content_view)); |
147 | 144 |
148 if (delegate_.get()) | 145 if (delegate_.get()) |
149 drag_dest_->set_delegate(delegate_->GetDragDestDelegate()); | 146 drag_dest_->set_delegate(delegate_->GetDragDestDelegate()); |
150 | 147 |
151 return view; | 148 return view; |
152 } | 149 } |
153 | 150 |
154 gfx::NativeView WebContentsViewGtk::GetNativeView() const { | 151 gfx::NativeView WebContentsViewGtk::GetNativeView() const { |
155 if (delegate_.get()) | 152 if (delegate_.get()) |
156 return delegate_->GetNativeView(); | 153 return delegate_->GetNativeView(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 void WebContentsViewGtk::SizeContents(const gfx::Size& size) { | 203 void WebContentsViewGtk::SizeContents(const gfx::Size& size) { |
207 // We don't need to manually set the size of of widgets in GTK+, but we do | 204 // We don't need to manually set the size of of widgets in GTK+, but we do |
208 // need to pass the sizing information on to the RWHV which will pass the | 205 // need to pass the sizing information on to the RWHV which will pass the |
209 // sizing information on to the renderer. | 206 // sizing information on to the renderer. |
210 requested_size_ = size; | 207 requested_size_ = size; |
211 RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); | 208 RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); |
212 if (rwhv) | 209 if (rwhv) |
213 rwhv->SetSize(size); | 210 rwhv->SetSize(size); |
214 } | 211 } |
215 | 212 |
216 void WebContentsViewGtk::RenderViewCreated(content::RenderViewHost* host) { | 213 void WebContentsViewGtk::RenderViewCreated(RenderViewHost* host) { |
217 } | 214 } |
218 | 215 |
219 void WebContentsViewGtk::Focus() { | 216 void WebContentsViewGtk::Focus() { |
220 if (web_contents_->ShowingInterstitialPage()) { | 217 if (web_contents_->ShowingInterstitialPage()) { |
221 web_contents_->GetInterstitialPage()->Focus(); | 218 web_contents_->GetInterstitialPage()->Focus(); |
222 } else if (delegate_.get()) { | 219 } else if (delegate_.get()) { |
223 delegate_->Focus(); | 220 delegate_->Focus(); |
224 } | 221 } |
225 } | 222 } |
226 | 223 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 if (gtk_widget_is_focus(widget)) | 311 if (gtk_widget_is_focus(widget)) |
315 return FALSE; | 312 return FALSE; |
316 | 313 |
317 gtk_widget_grab_focus(widget); | 314 gtk_widget_grab_focus(widget); |
318 bool reverse = focus == GTK_DIR_TAB_BACKWARD; | 315 bool reverse = focus == GTK_DIR_TAB_BACKWARD; |
319 web_contents_->FocusThroughTabTraversal(reverse); | 316 web_contents_->FocusThroughTabTraversal(reverse); |
320 return TRUE; | 317 return TRUE; |
321 } | 318 } |
322 | 319 |
323 void WebContentsViewGtk::ShowContextMenu( | 320 void WebContentsViewGtk::ShowContextMenu( |
324 const content::ContextMenuParams& params, | 321 const ContextMenuParams& params, |
325 content::ContextMenuSourceType type) { | 322 ContextMenuSourceType type) { |
326 if (delegate_.get()) | 323 if (delegate_.get()) |
327 delegate_->ShowContextMenu(params, type); | 324 delegate_->ShowContextMenu(params, type); |
328 else | 325 else |
329 DLOG(ERROR) << "Cannot show context menus without a delegate."; | 326 DLOG(ERROR) << "Cannot show context menus without a delegate."; |
330 } | 327 } |
331 | 328 |
332 void WebContentsViewGtk::ShowPopupMenu(const gfx::Rect& bounds, | 329 void WebContentsViewGtk::ShowPopupMenu(const gfx::Rect& bounds, |
333 int item_height, | 330 int item_height, |
334 double item_font_size, | 331 double item_font_size, |
335 int selected_item, | 332 int selected_item, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 // We manually tell our RWHV to resize the renderer content. This avoids | 378 // We manually tell our RWHV to resize the renderer content. This avoids |
382 // spurious resizes from GTK+. | 379 // spurious resizes from GTK+. |
383 RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); | 380 RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); |
384 if (rwhv) | 381 if (rwhv) |
385 rwhv->SetSize(size); | 382 rwhv->SetSize(size); |
386 if (web_contents_->GetInterstitialPage()) | 383 if (web_contents_->GetInterstitialPage()) |
387 web_contents_->GetInterstitialPage()->SetSize(size); | 384 web_contents_->GetInterstitialPage()->SetSize(size); |
388 } | 385 } |
389 | 386 |
390 } // namespace content | 387 } // namespace content |
OLD | NEW |