| Index: content/browser/web_contents/web_contents_view_gtk.cc
|
| diff --git a/content/browser/web_contents/web_contents_view_gtk.cc b/content/browser/web_contents/web_contents_view_gtk.cc
|
| deleted file mode 100644
|
| index 1e77e9f62eb87a16388ad19130f869c290bf65b5..0000000000000000000000000000000000000000
|
| --- a/content/browser/web_contents/web_contents_view_gtk.cc
|
| +++ /dev/null
|
| @@ -1,421 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/browser/web_contents/web_contents_view_gtk.h"
|
| -
|
| -#include <gdk/gdk.h>
|
| -#include <gdk/gdkkeysyms.h>
|
| -#include <gtk/gtk.h>
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "build/build_config.h"
|
| -#include "content/browser/frame_host/interstitial_page_impl.h"
|
| -#include "content/browser/renderer_host/render_view_host_factory.h"
|
| -#include "content/browser/renderer_host/render_view_host_impl.h"
|
| -#include "content/browser/renderer_host/render_widget_host_view_gtk.h"
|
| -#include "content/browser/web_contents/web_contents_impl.h"
|
| -#include "content/browser/web_contents/web_drag_dest_gtk.h"
|
| -#include "content/browser/web_contents/web_drag_source_gtk.h"
|
| -#include "content/public/browser/web_contents_delegate.h"
|
| -#include "content/public/browser/web_contents_view_delegate.h"
|
| -#include "content/public/common/drop_data.h"
|
| -#include "ui/base/gtk/gtk_expanded_container.h"
|
| -#include "ui/gfx/image/image_skia.h"
|
| -#include "ui/gfx/point.h"
|
| -#include "ui/gfx/rect.h"
|
| -#include "ui/gfx/size.h"
|
| -
|
| -using blink::WebDragOperation;
|
| -using blink::WebDragOperationsMask;
|
| -
|
| -namespace content {
|
| -namespace {
|
| -
|
| -// Called when the mouse leaves the widget. We notify our delegate.
|
| -gboolean OnLeaveNotify(GtkWidget* widget, GdkEventCrossing* event,
|
| - WebContentsImpl* web_contents) {
|
| - if (web_contents->GetDelegate())
|
| - web_contents->GetDelegate()->ContentsMouseEvent(
|
| - web_contents, gfx::Point(event->x_root, event->y_root), false);
|
| - return FALSE;
|
| -}
|
| -
|
| -// Called when the mouse moves within the widget. We notify our delegate.
|
| -gboolean OnMouseMove(GtkWidget* widget, GdkEventMotion* event,
|
| - WebContentsImpl* web_contents) {
|
| - if (web_contents->GetDelegate())
|
| - web_contents->GetDelegate()->ContentsMouseEvent(
|
| - web_contents, gfx::Point(event->x_root, event->y_root), true);
|
| - return FALSE;
|
| -}
|
| -
|
| -// See tab_contents_view_views.cc for discussion of mouse scroll zooming.
|
| -gboolean OnMouseScroll(GtkWidget* widget, GdkEventScroll* event,
|
| - WebContentsImpl* web_contents) {
|
| - if ((event->state & gtk_accelerator_get_default_mod_mask()) !=
|
| - GDK_CONTROL_MASK) {
|
| - return FALSE;
|
| - }
|
| -
|
| - WebContentsDelegate* delegate = web_contents->GetDelegate();
|
| - if (!delegate)
|
| - return FALSE;
|
| -
|
| - if (!(event->direction == GDK_SCROLL_DOWN ||
|
| - event->direction == GDK_SCROLL_UP)) {
|
| - return FALSE;
|
| - }
|
| -
|
| - delegate->ContentsZoomChange(event->direction == GDK_SCROLL_UP);
|
| - return TRUE;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -WebContentsViewPort* CreateWebContentsView(
|
| - WebContentsImpl* web_contents,
|
| - WebContentsViewDelegate* delegate,
|
| - RenderViewHostDelegateView** render_view_host_delegate_view) {
|
| - WebContentsViewGtk* rv = new WebContentsViewGtk(web_contents, delegate);
|
| - *render_view_host_delegate_view = rv;
|
| - return rv;
|
| -}
|
| -
|
| -WebContentsViewGtk::WebContentsViewGtk(
|
| - WebContentsImpl* web_contents,
|
| - WebContentsViewDelegate* delegate)
|
| - : web_contents_(web_contents),
|
| - expanded_(gtk_expanded_container_new()),
|
| - delegate_(delegate) {
|
| - gtk_widget_set_name(expanded_.get(), "chrome-web-contents-view");
|
| - g_signal_connect(expanded_.get(), "size-allocate",
|
| - G_CALLBACK(OnSizeAllocateThunk), this);
|
| - g_signal_connect(expanded_.get(), "child-size-request",
|
| - G_CALLBACK(OnChildSizeRequestThunk), this);
|
| -
|
| - gtk_widget_show(expanded_.get());
|
| - drag_source_.reset(new WebDragSourceGtk(web_contents));
|
| -
|
| - if (delegate_)
|
| - delegate_->Initialize(expanded_.get(), &focus_store_);
|
| -}
|
| -
|
| -WebContentsViewGtk::~WebContentsViewGtk() {
|
| - expanded_.Destroy();
|
| -}
|
| -
|
| -gfx::NativeView WebContentsViewGtk::GetNativeView() const {
|
| - if (delegate_)
|
| - return delegate_->GetNativeView();
|
| -
|
| - return expanded_.get();
|
| -}
|
| -
|
| -gfx::NativeView WebContentsViewGtk::GetContentNativeView() const {
|
| - RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
|
| - if (!rwhv)
|
| - return NULL;
|
| - return rwhv->GetNativeView();
|
| -}
|
| -
|
| -gfx::NativeWindow WebContentsViewGtk::GetTopLevelNativeWindow() const {
|
| - GtkWidget* window = gtk_widget_get_ancestor(GetNativeView(), GTK_TYPE_WINDOW);
|
| - return window ? GTK_WINDOW(window) : NULL;
|
| -}
|
| -
|
| -void WebContentsViewGtk::GetContainerBounds(gfx::Rect* out) const {
|
| - // This is used for positioning the download shelf arrow animation,
|
| - // as well as sizing some other widgets in Windows. In GTK the size is
|
| - // managed for us, so it appears to be only used for the download shelf
|
| - // animation.
|
| - int x = 0;
|
| - int y = 0;
|
| - GdkWindow* expanded_window = gtk_widget_get_window(expanded_.get());
|
| - if (expanded_window)
|
| - gdk_window_get_origin(expanded_window, &x, &y);
|
| -
|
| - GtkAllocation allocation;
|
| - gtk_widget_get_allocation(expanded_.get(), &allocation);
|
| - out->SetRect(x + allocation.x, y + allocation.y,
|
| - requested_size_.width(), requested_size_.height());
|
| -}
|
| -
|
| -void WebContentsViewGtk::OnTabCrashed(base::TerminationStatus status,
|
| - int error_code) {
|
| -}
|
| -
|
| -void WebContentsViewGtk::Focus() {
|
| - if (web_contents_->ShowingInterstitialPage()) {
|
| - web_contents_->GetInterstitialPage()->Focus();
|
| - } else if (delegate_) {
|
| - delegate_->Focus();
|
| - }
|
| -}
|
| -
|
| -void WebContentsViewGtk::SetInitialFocus() {
|
| - if (web_contents_->FocusLocationBarByDefault())
|
| - web_contents_->SetFocusToLocationBar(false);
|
| - else
|
| - Focus();
|
| -}
|
| -
|
| -void WebContentsViewGtk::StoreFocus() {
|
| - focus_store_.Store(GetNativeView());
|
| -}
|
| -
|
| -void WebContentsViewGtk::RestoreFocus() {
|
| - if (focus_store_.widget())
|
| - gtk_widget_grab_focus(focus_store_.widget());
|
| - else
|
| - SetInitialFocus();
|
| -}
|
| -
|
| -DropData* WebContentsViewGtk::GetDropData() const {
|
| - if (!drag_dest_)
|
| - return NULL;
|
| - return drag_dest_->current_drop_data();
|
| -}
|
| -
|
| -gfx::Rect WebContentsViewGtk::GetViewBounds() const {
|
| - gfx::Rect rect;
|
| - GdkWindow* window = gtk_widget_get_window(GetNativeView());
|
| - if (!window) {
|
| - rect.SetRect(0, 0, requested_size_.width(), requested_size_.height());
|
| - return rect;
|
| - }
|
| - int x = 0, y = 0, w, h;
|
| - gdk_window_get_geometry(window, &x, &y, &w, &h, NULL);
|
| - rect.SetRect(x, y, w, h);
|
| - return rect;
|
| -}
|
| -
|
| -void WebContentsViewGtk::CreateView(
|
| - const gfx::Size& initial_size, gfx::NativeView context) {
|
| - requested_size_ = initial_size;
|
| -}
|
| -
|
| -RenderWidgetHostView* WebContentsViewGtk::CreateViewForWidget(
|
| - RenderWidgetHost* render_widget_host) {
|
| - if (render_widget_host->GetView()) {
|
| - // During testing, the view will already be set up in most cases to the
|
| - // test view, so we don't want to clobber it with a real one. To verify that
|
| - // this actually is happening (and somebody isn't accidentally creating the
|
| - // view twice), we check for the RVH Factory, which will be set when we're
|
| - // making special ones (which go along with the special views).
|
| - DCHECK(RenderViewHostFactory::has_factory());
|
| - return render_widget_host->GetView();
|
| - }
|
| -
|
| - RenderWidgetHostView* view =
|
| - RenderWidgetHostView::CreateViewForWidget(render_widget_host);
|
| - view->InitAsChild(NULL);
|
| - gfx::NativeView content_view = view->GetNativeView();
|
| - g_signal_connect(content_view, "focus", G_CALLBACK(OnFocusThunk), this);
|
| - g_signal_connect(content_view, "leave-notify-event",
|
| - G_CALLBACK(OnLeaveNotify), web_contents_);
|
| - g_signal_connect(content_view, "motion-notify-event",
|
| - G_CALLBACK(OnMouseMove), web_contents_);
|
| - g_signal_connect(content_view, "scroll-event",
|
| - G_CALLBACK(OnMouseScroll), web_contents_);
|
| - gtk_widget_add_events(content_view, GDK_LEAVE_NOTIFY_MASK |
|
| - GDK_POINTER_MOTION_MASK);
|
| - InsertIntoContentArea(content_view);
|
| -
|
| - if (render_widget_host->IsRenderView()) {
|
| - RenderViewHost* rvh = RenderViewHost::From(render_widget_host);
|
| - // If |rvh| is already the current render view host for the web contents, we
|
| - // need to initialize |drag_dest_| for drags to be properly handled.
|
| - // Otherwise, |drag_dest_| will be updated in RenderViewSwappedIn. The
|
| - // reason we can't simply check that this isn't a swapped-out view is
|
| - // because there are navigations that create non-swapped-out views that may
|
| - // never be displayed, e.g. a navigation that becomes a download.
|
| - if (rvh == web_contents_->GetRenderViewHost()) {
|
| - UpdateDragDest(rvh);
|
| - }
|
| - }
|
| -
|
| - return view;
|
| -}
|
| -
|
| -RenderWidgetHostView* WebContentsViewGtk::CreateViewForPopupWidget(
|
| - RenderWidgetHost* render_widget_host) {
|
| - return RenderWidgetHostViewPort::CreateViewForWidget(render_widget_host);
|
| -}
|
| -
|
| -void WebContentsViewGtk::SetPageTitle(const base::string16& title) {
|
| - // Set the window name to include the page title so it's easier to spot
|
| - // when debugging (e.g. via xwininfo -tree).
|
| - gfx::NativeView content_view = GetContentNativeView();
|
| - if (content_view) {
|
| - GdkWindow* content_window = gtk_widget_get_window(content_view);
|
| - if (content_window) {
|
| - gdk_window_set_title(content_window, base::UTF16ToUTF8(title).c_str());
|
| - }
|
| - }
|
| -}
|
| -
|
| -void WebContentsViewGtk::SizeContents(const gfx::Size& size) {
|
| - // We don't need to manually set the size of of widgets in GTK+, but we do
|
| - // need to pass the sizing information on to the RWHV which will pass the
|
| - // sizing information on to the renderer.
|
| - requested_size_ = size;
|
| - RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
|
| - if (rwhv)
|
| - rwhv->SetSize(size);
|
| -}
|
| -
|
| -void WebContentsViewGtk::RenderViewCreated(RenderViewHost* host) {
|
| -}
|
| -
|
| -void WebContentsViewGtk::RenderViewSwappedIn(RenderViewHost* host) {
|
| - UpdateDragDest(host);
|
| -}
|
| -
|
| -void WebContentsViewGtk::SetOverscrollControllerEnabled(bool enabled) {
|
| -}
|
| -
|
| -WebContents* WebContentsViewGtk::web_contents() {
|
| - return web_contents_;
|
| -}
|
| -
|
| -void WebContentsViewGtk::UpdateDragCursor(WebDragOperation operation) {
|
| - if (!drag_dest_)
|
| - return;
|
| - drag_dest_->UpdateDragStatus(operation);
|
| -}
|
| -
|
| -void WebContentsViewGtk::GotFocus() {
|
| - // This is only used in the views FocusManager stuff but it bleeds through
|
| - // all subclasses. http://crbug.com/21875
|
| -}
|
| -
|
| -// This is called when the renderer asks us to take focus back (i.e., it has
|
| -// iterated past the last focusable element on the page).
|
| -void WebContentsViewGtk::TakeFocus(bool reverse) {
|
| - if (!web_contents_->GetDelegate())
|
| - return;
|
| - if (!web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse) &&
|
| - GetTopLevelNativeWindow()) {
|
| - gtk_widget_child_focus(GTK_WIDGET(GetTopLevelNativeWindow()),
|
| - reverse ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD);
|
| - }
|
| -}
|
| -
|
| -void WebContentsViewGtk::InsertIntoContentArea(GtkWidget* widget) {
|
| - gtk_container_add(GTK_CONTAINER(expanded_.get()), widget);
|
| -}
|
| -
|
| -void WebContentsViewGtk::UpdateDragDest(RenderViewHost* host) {
|
| - // Drag-and-drop is entirely managed by BrowserPluginGuest for guest
|
| - // processes in a largely platform independent way. WebDragDestGtk
|
| - // will result in spurious messages being sent to the guest process which
|
| - // will violate assumptions.
|
| - if (host->GetProcess() && host->GetProcess()->IsGuest()) {
|
| - DCHECK(!drag_dest_);
|
| - return;
|
| - }
|
| -
|
| - gfx::NativeView content_view = host->GetView()->GetNativeView();
|
| -
|
| - // If the host is already used by the drag_dest_, there's no point in deleting
|
| - // the old one to create an identical copy.
|
| - if (drag_dest_.get() && drag_dest_->widget() == content_view)
|
| - return;
|
| -
|
| - // Clear the currently connected drag drop signals by deleting the old
|
| - // drag_dest_ before creating the new one.
|
| - drag_dest_.reset();
|
| - // Create the new drag_dest_.
|
| - drag_dest_.reset(new WebDragDestGtk(web_contents_, content_view));
|
| -
|
| - if (delegate_)
|
| - drag_dest_->set_delegate(delegate_->GetDragDestDelegate());
|
| -}
|
| -
|
| -// Called when the content view gtk widget is tabbed to, or after the call to
|
| -// gtk_widget_child_focus() in TakeFocus(). We return true
|
| -// and grab focus if we don't have it. The call to
|
| -// FocusThroughTabTraversal(bool) forwards the "move focus forward" effect to
|
| -// webkit.
|
| -gboolean WebContentsViewGtk::OnFocus(GtkWidget* widget,
|
| - GtkDirectionType focus) {
|
| - // Give our view wrapper first chance at this event.
|
| - if (delegate_) {
|
| - gboolean return_value = FALSE;
|
| - if (delegate_->OnNativeViewFocusEvent(widget, focus, &return_value))
|
| - return return_value;
|
| - }
|
| -
|
| - // If we already have focus, let the next widget have a shot at it. We will
|
| - // reach this situation after the call to gtk_widget_child_focus() in
|
| - // TakeFocus().
|
| - if (gtk_widget_is_focus(widget))
|
| - return FALSE;
|
| -
|
| - gtk_widget_grab_focus(widget);
|
| - bool reverse = focus == GTK_DIR_TAB_BACKWARD;
|
| - web_contents_->FocusThroughTabTraversal(reverse);
|
| - return TRUE;
|
| -}
|
| -
|
| -void WebContentsViewGtk::ShowContextMenu(RenderFrameHost* render_frame_host,
|
| - const ContextMenuParams& params) {
|
| - if (delegate_)
|
| - delegate_->ShowContextMenu(render_frame_host, params);
|
| - else
|
| - DLOG(ERROR) << "Cannot show context menus without a delegate.";
|
| -}
|
| -
|
| -// Render view DnD -------------------------------------------------------------
|
| -
|
| -void WebContentsViewGtk::StartDragging(const DropData& drop_data,
|
| - WebDragOperationsMask ops,
|
| - const gfx::ImageSkia& image,
|
| - const gfx::Vector2d& image_offset,
|
| - const DragEventSourceInfo& event_info) {
|
| - DCHECK(GetContentNativeView());
|
| -
|
| - RenderWidgetHostViewGtk* view_gtk = static_cast<RenderWidgetHostViewGtk*>(
|
| - web_contents_->GetRenderWidgetHostView());
|
| - if (!view_gtk || !view_gtk->GetLastMouseDown() ||
|
| - !drag_source_->StartDragging(drop_data, ops, view_gtk->GetLastMouseDown(),
|
| - *image.bitmap(), image_offset)) {
|
| - web_contents_->SystemDragEnded();
|
| - }
|
| -}
|
| -
|
| -// -----------------------------------------------------------------------------
|
| -
|
| -void WebContentsViewGtk::OnChildSizeRequest(GtkWidget* widget,
|
| - GtkWidget* child,
|
| - GtkRequisition* requisition) {
|
| - if (web_contents_->GetDelegate()) {
|
| - requisition->height +=
|
| - web_contents_->GetDelegate()->GetExtraRenderViewHeight();
|
| - }
|
| -}
|
| -
|
| -void WebContentsViewGtk::OnSizeAllocate(GtkWidget* widget,
|
| - GtkAllocation* allocation) {
|
| - int width = allocation->width;
|
| - int height = allocation->height;
|
| - // |delegate()| can be NULL here during browser teardown.
|
| - if (web_contents_->GetDelegate())
|
| - height += web_contents_->GetDelegate()->GetExtraRenderViewHeight();
|
| - gfx::Size size(width, height);
|
| - requested_size_ = size;
|
| -
|
| - // We manually tell our RWHV to resize the renderer content. This avoids
|
| - // spurious resizes from GTK+.
|
| - RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
|
| - if (rwhv)
|
| - rwhv->SetSize(size);
|
| - if (web_contents_->GetInterstitialPage())
|
| - web_contents_->GetInterstitialPage()->SetSize(size);
|
| -}
|
| -
|
| -} // namespace content
|
|
|