| 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 |