summaryrefslogtreecommitdiffstats
path: root/content/browser
diff options
context:
space:
mode:
authorerg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-10 22:20:52 +0000
committererg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-10 22:20:52 +0000
commitdcc2977772bdd296d8bfbcaedafd4441def78e3d (patch)
treecb0bdc148cff3f5a221b89ad2c055212d58bb976 /content/browser
parent404d9a54ceae52b741b3e173af12fb7fd21c8548 (diff)
downloadchromium_src-dcc2977772bdd296d8bfbcaedafd4441def78e3d.zip
chromium_src-dcc2977772bdd296d8bfbcaedafd4441def78e3d.tar.gz
chromium_src-dcc2977772bdd296d8bfbcaedafd4441def78e3d.tar.bz2
Delete the GTK+ port of Chrome.
BUG=297026 R=ben@chromium.org Review URL: https://codereview.chromium.org/231733005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@263101 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser')
-rw-r--r--content/browser/accessibility/accessibility_tree_formatter_gtk.cc111
-rw-r--r--content/browser/accessibility/browser_accessibility_gtk.cc518
-rw-r--r--content/browser/accessibility/browser_accessibility_gtk.h92
-rw-r--r--content/browser/accessibility/browser_accessibility_manager_gtk.cc82
-rw-r--r--content/browser/accessibility/browser_accessibility_manager_gtk.h48
-rw-r--r--content/browser/browser_main_loop.cc8
-rw-r--r--content/browser/frame_host/render_widget_host_view_guest.cc10
-rw-r--r--content/browser/frame_host/render_widget_host_view_guest.h9
-rw-r--r--content/browser/gpu/gpu_surface_tracker.cc52
-rw-r--r--content/browser/gpu/test_support_gpu.gypi5
-rw-r--r--content/browser/plugin_process_host.cc18
-rw-r--r--content/browser/plugin_process_host.h4
-rw-r--r--content/browser/power_save_blocker_x11.cc7
-rw-r--r--content/browser/renderer_host/backing_store_gtk.cc692
-rw-r--r--content/browser/renderer_host/backing_store_gtk.h107
-rw-r--r--content/browser/renderer_host/gtk_im_context_wrapper.cc665
-rw-r--r--content/browser/renderer_host/gtk_im_context_wrapper.h201
-rw-r--r--content/browser/renderer_host/gtk_key_bindings_handler.cc293
-rw-r--r--content/browser/renderer_host/gtk_key_bindings_handler.h132
-rw-r--r--content/browser/renderer_host/gtk_key_bindings_handler_unittest.cc226
-rw-r--r--content/browser/renderer_host/gtk_plugin_container.cc89
-rw-r--r--content/browser/renderer_host/gtk_plugin_container.h30
-rw-r--r--content/browser/renderer_host/gtk_plugin_container_manager.cc161
-rw-r--r--content/browser/renderer_host/gtk_plugin_container_manager.h58
-rw-r--r--content/browser/renderer_host/gtk_window_utils.cc89
-rw-r--r--content/browser/renderer_host/gtk_window_utils.h23
-rw-r--r--content/browser/renderer_host/input/web_input_event_builders_gtk.cc603
-rw-r--r--content/browser/renderer_host/input/web_input_event_builders_gtk.h44
-rw-r--r--content/browser/renderer_host/input/web_input_event_builders_gtk_unittest.cc171
-rw-r--r--content/browser/renderer_host/native_web_keyboard_event_gtk.cc75
-rw-r--r--content/browser/renderer_host/render_process_host_impl.cc13
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc16
-rw-r--r--content/browser/renderer_host/render_widget_host_view_base.cc7
-rw-r--r--content/browser/renderer_host/render_widget_host_view_gtk.cc1621
-rw-r--r--content/browser/renderer_host/render_widget_host_view_gtk.h341
-rw-r--r--content/browser/web_contents/drag_utils_gtk.cc38
-rw-r--r--content/browser/web_contents/drag_utils_gtk.h24
-rw-r--r--content/browser/web_contents/web_contents_view_gtk.cc421
-rw-r--r--content/browser/web_contents/web_contents_view_gtk.h141
-rw-r--r--content/browser/web_contents/web_drag_dest_gtk.cc345
-rw-r--r--content/browser/web_contents/web_drag_dest_gtk.h114
-rw-r--r--content/browser/web_contents/web_drag_source_gtk.cc388
-rw-r--r--content/browser/web_contents/web_drag_source_gtk.h109
43 files changed, 3 insertions, 8198 deletions
diff --git a/content/browser/accessibility/accessibility_tree_formatter_gtk.cc b/content/browser/accessibility/accessibility_tree_formatter_gtk.cc
deleted file mode 100644
index d244667..0000000
--- a/content/browser/accessibility/accessibility_tree_formatter_gtk.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2013 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/accessibility/accessibility_tree_formatter.h"
-
-#include <atk/atk.h>
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "content/browser/accessibility/browser_accessibility_gtk.h"
-
-namespace content {
-
-void AccessibilityTreeFormatter::AddProperties(const BrowserAccessibility& node,
- base::DictionaryValue* dict) {
- BrowserAccessibilityGtk* node_gtk =
- const_cast<BrowserAccessibility*>(&node)->ToBrowserAccessibilityGtk();
- AtkObject* atk_object = node_gtk->GetAtkObject();
- AtkRole role = atk_object_get_role(atk_object);
- if (role != ATK_ROLE_UNKNOWN)
- dict->SetString("role", atk_role_get_name(role));
- dict->SetString("name", atk_object_get_name(atk_object));
- dict->SetString("description", atk_object_get_description(atk_object));
- AtkStateSet* state_set =
- atk_object_ref_state_set(atk_object);
- base::ListValue* states = new base::ListValue;
- for (int i = ATK_STATE_INVALID; i < ATK_STATE_LAST_DEFINED; i++) {
- AtkStateType state_type = static_cast<AtkStateType>(i);
- if (atk_state_set_contains_state(state_set, state_type))
- states->AppendString(atk_state_type_get_name(state_type));
- }
- dict->Set("states", states);
- dict->SetInteger("id", node.GetId());
-}
-
-base::string16 AccessibilityTreeFormatter::ToString(
- const base::DictionaryValue& node,
- const base::string16& indent) {
- base::string16 line;
- std::string role_value;
- node.GetString("role", &role_value);
- if (!role_value.empty()) {
- WriteAttribute(true,
- base::StringPrintf("[%s]", role_value.c_str()), &line);
- }
-
- std::string name_value;
- node.GetString("name", &name_value);
- WriteAttribute(true, base::StringPrintf("name='%s'", name_value.c_str()),
- &line);
-
- std::string description_value;
- node.GetString("description", &description_value);
- WriteAttribute(false,
- base::StringPrintf("description='%s'",
- description_value.c_str()),
- &line);
-
- const base::ListValue* states_value;
- node.GetList("states", &states_value);
- for (base::ListValue::const_iterator it = states_value->begin();
- it != states_value->end();
- ++it) {
- std::string state_value;
- if ((*it)->GetAsString(&state_value))
- WriteAttribute(true, state_value, &line);
- }
-
- int id_value;
- node.GetInteger("id", &id_value);
- WriteAttribute(false,
- base::StringPrintf("id=%d", id_value),
- &line);
-
- return indent + line + base::ASCIIToUTF16("\n");
-}
-
-void AccessibilityTreeFormatter::Initialize() {}
-
-// static
-const base::FilePath::StringType
-AccessibilityTreeFormatter::GetActualFileSuffix() {
- return FILE_PATH_LITERAL("-actual-gtk.txt");
-}
-
-// static
-const base::FilePath::StringType
-AccessibilityTreeFormatter::GetExpectedFileSuffix() {
- return FILE_PATH_LITERAL("-expected-gtk.txt");
-}
-
-// static
-const std::string AccessibilityTreeFormatter::GetAllowEmptyString() {
- return "@GTK-ALLOW-EMPTY:";
-}
-
-// static
-const std::string AccessibilityTreeFormatter::GetAllowString() {
- return "@GTK-ALLOW:";
-}
-
-// static
-const std::string AccessibilityTreeFormatter::GetDenyString() {
- return "@GTK-DENY:";
-}
-
-}
diff --git a/content/browser/accessibility/browser_accessibility_gtk.cc b/content/browser/accessibility/browser_accessibility_gtk.cc
deleted file mode 100644
index 4ec1b89..0000000
--- a/content/browser/accessibility/browser_accessibility_gtk.cc
+++ /dev/null
@@ -1,518 +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/accessibility/browser_accessibility_gtk.h"
-
-#include <gtk/gtk.h>
-
-#include "base/strings/utf_string_conversions.h"
-#include "content/browser/accessibility/browser_accessibility_manager_gtk.h"
-#include "content/common/accessibility_messages.h"
-
-namespace content {
-
-static gpointer browser_accessibility_parent_class = NULL;
-
-static BrowserAccessibilityGtk* ToBrowserAccessibilityGtk(
- BrowserAccessibilityAtk* atk_object) {
- if (!atk_object)
- return NULL;
-
- return atk_object->m_object;
-}
-
-//
-// AtkComponent interface.
-//
-
-static BrowserAccessibilityGtk* ToBrowserAccessibilityGtk(
- AtkComponent* atk_object) {
- if (!IS_BROWSER_ACCESSIBILITY(atk_object))
- return NULL;
-
- return ToBrowserAccessibilityGtk(BROWSER_ACCESSIBILITY(atk_object));
-}
-
-static AtkObject* browser_accessibility_accessible_at_point(
- AtkComponent* component, gint x, gint y, AtkCoordType coord_type) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(component);
- if (!obj)
- return NULL;
-
- gfx::Point point(x, y);
- if (!obj->GetGlobalBoundsRect().Contains(point))
- return NULL;
-
- BrowserAccessibility* result = obj->BrowserAccessibilityForPoint(point);
- if (!result)
- return NULL;
-
- AtkObject* atk_result = result->ToBrowserAccessibilityGtk()->GetAtkObject();
- g_object_ref(atk_result);
- return atk_result;
-}
-
-static void browser_accessibility_get_extents(
- AtkComponent* component, gint* x, gint* y, gint* width, gint* height,
- AtkCoordType coord_type) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(component);
- if (!obj)
- return;
-
- gfx::Rect bounds = obj->GetGlobalBoundsRect();
- *x = bounds.x();
- *y = bounds.y();
- *width = bounds.width();
- *height = bounds.height();
-}
-
-static gboolean browser_accessibility_grab_focus(AtkComponent* component) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(component);
- if (!obj)
- return false;
-
- obj->manager()->SetFocus(obj, true);
- return true;
-}
-
-static void ComponentInterfaceInit(AtkComponentIface* iface) {
- iface->ref_accessible_at_point = browser_accessibility_accessible_at_point;
- iface->get_extents = browser_accessibility_get_extents;
- iface->grab_focus = browser_accessibility_grab_focus;
-}
-
-static const GInterfaceInfo ComponentInfo = {
- reinterpret_cast<GInterfaceInitFunc>(ComponentInterfaceInit), 0, 0
-};
-
-//
-// AtkValue interface.
-//
-
-static BrowserAccessibilityGtk* ToBrowserAccessibilityGtk(
- AtkValue* atk_object) {
- if (!IS_BROWSER_ACCESSIBILITY(atk_object))
- return NULL;
-
- return ToBrowserAccessibilityGtk(BROWSER_ACCESSIBILITY(atk_object));
-}
-
-static void browser_accessibility_get_current_value(
- AtkValue* atk_object, GValue* value) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return;
-
- float float_val;
- if (obj->GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE,
- &float_val)) {
- memset(value, 0, sizeof(*value));
- g_value_init(value, G_TYPE_FLOAT);
- g_value_set_float(value, float_val);
- }
-}
-
-static void browser_accessibility_get_minimum_value(
- AtkValue* atk_object, GValue* value) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return;
-
- float float_val;
- if (obj->GetFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE,
- &float_val)) {
- memset(value, 0, sizeof(*value));
- g_value_init(value, G_TYPE_FLOAT);
- g_value_set_float(value, float_val);
- }
-}
-
-static void browser_accessibility_get_maximum_value(
- AtkValue* atk_object, GValue* value) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return;
-
- float float_val;
- if (obj->GetFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE,
- &float_val)) {
- memset(value, 0, sizeof(*value));
- g_value_init(value, G_TYPE_FLOAT);
- g_value_set_float(value, float_val);
- }
-}
-
-static void browser_accessibility_get_minimum_increment(
- AtkValue* atk_object, GValue* value) {
- // TODO(dmazzoni): get the correct value from an <input type=range>.
- memset(value, 0, sizeof(*value));
- g_value_init(value, G_TYPE_FLOAT);
- g_value_set_float(value, 1.0);
-}
-
-static void ValueInterfaceInit(AtkValueIface* iface) {
- iface->get_current_value = browser_accessibility_get_current_value;
- iface->get_minimum_value = browser_accessibility_get_minimum_value;
- iface->get_maximum_value = browser_accessibility_get_maximum_value;
- iface->get_minimum_increment = browser_accessibility_get_minimum_increment;
-}
-
-static const GInterfaceInfo ValueInfo = {
- reinterpret_cast<GInterfaceInitFunc>(ValueInterfaceInit), 0, 0
-};
-
-//
-// AtkObject interface
-//
-
-static BrowserAccessibilityGtk* ToBrowserAccessibilityGtk(
- AtkObject* atk_object) {
- if (!IS_BROWSER_ACCESSIBILITY(atk_object))
- return NULL;
-
- return ToBrowserAccessibilityGtk(BROWSER_ACCESSIBILITY(atk_object));
-}
-
-static const gchar* browser_accessibility_get_name(AtkObject* atk_object) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return NULL;
-
- return obj->GetStringAttribute(ui::AX_ATTR_NAME).c_str();
-}
-
-static const gchar* browser_accessibility_get_description(
- AtkObject* atk_object) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return NULL;
-
- return obj->GetStringAttribute(
- ui::AX_ATTR_DESCRIPTION).c_str();
-}
-
-static AtkObject* browser_accessibility_get_parent(AtkObject* atk_object) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return NULL;
- if (obj->GetParent())
- return obj->GetParent()->ToBrowserAccessibilityGtk()->GetAtkObject();
-
- BrowserAccessibilityManagerGtk* manager =
- static_cast<BrowserAccessibilityManagerGtk*>(obj->manager());
- return gtk_widget_get_accessible(manager->parent_widget());
-}
-
-static gint browser_accessibility_get_n_children(AtkObject* atk_object) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return 0;
-
- return obj->PlatformChildCount();
-}
-
-static AtkObject* browser_accessibility_ref_child(
- AtkObject* atk_object, gint index) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return NULL;
-
- if (index < 0 || index >= static_cast<gint>(obj->PlatformChildCount()))
- return NULL;
-
- AtkObject* result =
- obj->InternalGetChild(index)->ToBrowserAccessibilityGtk()->GetAtkObject();
- g_object_ref(result);
- return result;
-}
-
-static gint browser_accessibility_get_index_in_parent(AtkObject* atk_object) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return 0;
- return obj->GetIndexInParent();
-}
-
-static AtkAttributeSet* browser_accessibility_get_attributes(
- AtkObject* atk_object) {
- return NULL;
-}
-
-static AtkRole browser_accessibility_get_role(AtkObject* atk_object) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return ATK_ROLE_INVALID;
- return obj->atk_role();
-}
-
-static AtkStateSet* browser_accessibility_ref_state_set(AtkObject* atk_object) {
- BrowserAccessibilityGtk* obj = ToBrowserAccessibilityGtk(atk_object);
- if (!obj)
- return NULL;
- AtkStateSet* state_set =
- ATK_OBJECT_CLASS(browser_accessibility_parent_class)->
- ref_state_set(atk_object);
- int32 state = obj->GetState();
-
- if (state & (1 << ui::AX_STATE_FOCUSABLE))
- atk_state_set_add_state(state_set, ATK_STATE_FOCUSABLE);
- if (obj->manager()->GetFocus(NULL) == obj)
- atk_state_set_add_state(state_set, ATK_STATE_FOCUSED);
- if (state & (1 << ui::AX_STATE_ENABLED))
- atk_state_set_add_state(state_set, ATK_STATE_ENABLED);
-
- return state_set;
-}
-
-static AtkRelationSet* browser_accessibility_ref_relation_set(
- AtkObject* atk_object) {
- AtkRelationSet* relation_set =
- ATK_OBJECT_CLASS(browser_accessibility_parent_class)
- ->ref_relation_set(atk_object);
- return relation_set;
-}
-
-//
-// The rest of the BrowserAccessibilityGtk code, not specific to one
-// of the Atk* interfaces.
-//
-
-static void browser_accessibility_init(AtkObject* atk_object, gpointer data) {
- if (ATK_OBJECT_CLASS(browser_accessibility_parent_class)->initialize) {
- ATK_OBJECT_CLASS(browser_accessibility_parent_class)->initialize(
- atk_object, data);
- }
-
- BROWSER_ACCESSIBILITY(atk_object)->m_object =
- reinterpret_cast<BrowserAccessibilityGtk*>(data);
-}
-
-static void browser_accessibility_finalize(GObject* atk_object) {
- G_OBJECT_CLASS(browser_accessibility_parent_class)->finalize(atk_object);
-}
-
-static void browser_accessibility_class_init(AtkObjectClass* klass) {
- GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
- browser_accessibility_parent_class = g_type_class_peek_parent(klass);
-
- gobject_class->finalize = browser_accessibility_finalize;
- klass->initialize = browser_accessibility_init;
- klass->get_name = browser_accessibility_get_name;
- klass->get_description = browser_accessibility_get_description;
- klass->get_parent = browser_accessibility_get_parent;
- klass->get_n_children = browser_accessibility_get_n_children;
- klass->ref_child = browser_accessibility_ref_child;
- klass->get_role = browser_accessibility_get_role;
- klass->ref_state_set = browser_accessibility_ref_state_set;
- klass->get_index_in_parent = browser_accessibility_get_index_in_parent;
- klass->get_attributes = browser_accessibility_get_attributes;
- klass->ref_relation_set = browser_accessibility_ref_relation_set;
-}
-
-GType browser_accessibility_get_type() {
- static volatile gsize type_volatile = 0;
-
- if (g_once_init_enter(&type_volatile)) {
- static const GTypeInfo tinfo = {
- sizeof(BrowserAccessibilityAtkClass),
- (GBaseInitFunc) 0,
- (GBaseFinalizeFunc) 0,
- (GClassInitFunc) browser_accessibility_class_init,
- (GClassFinalizeFunc) 0,
- 0, /* class data */
- sizeof(BrowserAccessibilityAtk), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) 0,
- 0 /* value table */
- };
-
- GType type = g_type_register_static(
- ATK_TYPE_OBJECT, "BrowserAccessibility", &tinfo, GTypeFlags(0));
- g_once_init_leave(&type_volatile, type);
- }
-
- return type_volatile;
-}
-
-static const char* GetUniqueAccessibilityTypeName(int interface_mask)
-{
- // 20 characters is enough for "Chrome%x" with any integer value.
- static char name[20];
- snprintf(name, sizeof(name), "Chrome%x", interface_mask);
- return name;
-}
-
-enum AtkInterfaces {
- ATK_ACTION_INTERFACE,
- ATK_COMPONENT_INTERFACE,
- ATK_DOCUMENT_INTERFACE,
- ATK_EDITABLE_TEXT_INTERFACE,
- ATK_HYPERLINK_INTERFACE,
- ATK_HYPERTEXT_INTERFACE,
- ATK_IMAGE_INTERFACE,
- ATK_SELECTION_INTERFACE,
- ATK_TABLE_INTERFACE,
- ATK_TEXT_INTERFACE,
- ATK_VALUE_INTERFACE,
-};
-
-static int GetInterfaceMaskFromObject(BrowserAccessibilityGtk* obj) {
- int interface_mask = 0;
-
- // Component interface is always supported.
- interface_mask |= 1 << ATK_COMPONENT_INTERFACE;
-
- int role = obj->GetRole();
- if (role == ui::AX_ROLE_PROGRESS_INDICATOR ||
- role == ui::AX_ROLE_SCROLL_BAR ||
- role == ui::AX_ROLE_SLIDER) {
- interface_mask |= 1 << ATK_VALUE_INTERFACE;
- }
-
- return interface_mask;
-}
-
-static GType GetAccessibilityTypeFromObject(BrowserAccessibilityGtk* obj) {
- static const GTypeInfo type_info = {
- sizeof(BrowserAccessibilityAtkClass),
- (GBaseInitFunc) 0,
- (GBaseFinalizeFunc) 0,
- (GClassInitFunc) 0,
- (GClassFinalizeFunc) 0,
- 0, /* class data */
- sizeof(BrowserAccessibilityAtk), /* instance size */
- 0, /* nb preallocs */
- (GInstanceInitFunc) 0,
- 0 /* value table */
- };
-
- int interface_mask = GetInterfaceMaskFromObject(obj);
- const char* atk_type_name = GetUniqueAccessibilityTypeName(interface_mask);
- GType type = g_type_from_name(atk_type_name);
- if (type)
- return type;
-
- type = g_type_register_static(BROWSER_ACCESSIBILITY_TYPE,
- atk_type_name,
- &type_info,
- GTypeFlags(0));
- if (interface_mask & (1 << ATK_COMPONENT_INTERFACE))
- g_type_add_interface_static(type, ATK_TYPE_COMPONENT, &ComponentInfo);
- if (interface_mask & (1 << ATK_VALUE_INTERFACE))
- g_type_add_interface_static(type, ATK_TYPE_VALUE, &ValueInfo);
-
- return type;
-}
-
-BrowserAccessibilityAtk* browser_accessibility_new(
- BrowserAccessibilityGtk* obj) {
- GType type = GetAccessibilityTypeFromObject(obj);
- AtkObject* atk_object = static_cast<AtkObject*>(g_object_new(type, 0));
-
- atk_object_initialize(atk_object, obj);
-
- return BROWSER_ACCESSIBILITY(atk_object);
-}
-
-void browser_accessibility_detach(BrowserAccessibilityAtk* atk_object) {
- atk_object->m_object = NULL;
-}
-
-// static
-BrowserAccessibility* BrowserAccessibility::Create() {
- return new BrowserAccessibilityGtk();
-}
-
-BrowserAccessibilityGtk* BrowserAccessibility::ToBrowserAccessibilityGtk() {
- return static_cast<BrowserAccessibilityGtk*>(this);
-}
-
-BrowserAccessibilityGtk::BrowserAccessibilityGtk()
- : atk_object_(NULL) {
-}
-
-BrowserAccessibilityGtk::~BrowserAccessibilityGtk() {
- browser_accessibility_detach(BROWSER_ACCESSIBILITY(atk_object_));
- if (atk_object_)
- g_object_unref(atk_object_);
-}
-
-AtkObject* BrowserAccessibilityGtk::GetAtkObject() const {
- if (!G_IS_OBJECT(atk_object_))
- return NULL;
- return atk_object_;
-}
-
-void BrowserAccessibilityGtk::PreInitialize() {
- BrowserAccessibility::PreInitialize();
- InitRoleAndState();
-
- if (atk_object_) {
- // If the object's role changes and that causes its
- // interface mask to change, we need to create a new
- // AtkObject for it.
- int interface_mask = GetInterfaceMaskFromObject(this);
- if (interface_mask != interface_mask_) {
- g_object_unref(atk_object_);
- atk_object_ = NULL;
- }
- }
-
- if (!atk_object_) {
- interface_mask_ = GetInterfaceMaskFromObject(this);
- atk_object_ = ATK_OBJECT(browser_accessibility_new(this));
- if (this->GetParent()) {
- atk_object_set_parent(
- atk_object_,
- this->GetParent()->ToBrowserAccessibilityGtk()->GetAtkObject());
- }
- }
-}
-
-bool BrowserAccessibilityGtk::IsNative() const {
- return true;
-}
-
-void BrowserAccessibilityGtk::InitRoleAndState() {
- switch(GetRole()) {
- case ui::AX_ROLE_DOCUMENT:
- case ui::AX_ROLE_ROOT_WEB_AREA:
- case ui::AX_ROLE_WEB_AREA:
- atk_role_ = ATK_ROLE_DOCUMENT_WEB;
- break;
- case ui::AX_ROLE_GROUP:
- case ui::AX_ROLE_DIV:
- atk_role_ = ATK_ROLE_SECTION;
- break;
- case ui::AX_ROLE_BUTTON:
- atk_role_ = ATK_ROLE_PUSH_BUTTON;
- break;
- case ui::AX_ROLE_CHECK_BOX:
- atk_role_ = ATK_ROLE_CHECK_BOX;
- break;
- case ui::AX_ROLE_COMBO_BOX:
- atk_role_ = ATK_ROLE_COMBO_BOX;
- break;
- case ui::AX_ROLE_LINK:
- atk_role_ = ATK_ROLE_LINK;
- break;
- case ui::AX_ROLE_RADIO_BUTTON:
- atk_role_ = ATK_ROLE_RADIO_BUTTON;
- break;
- case ui::AX_ROLE_STATIC_TEXT:
- atk_role_ = ATK_ROLE_TEXT;
- break;
- case ui::AX_ROLE_TEXT_AREA:
- atk_role_ = ATK_ROLE_ENTRY;
- break;
- case ui::AX_ROLE_TEXT_FIELD:
- atk_role_ = ATK_ROLE_ENTRY;
- break;
- default:
- atk_role_ = ATK_ROLE_UNKNOWN;
- break;
- }
-}
-
-} // namespace content
diff --git a/content/browser/accessibility/browser_accessibility_gtk.h b/content/browser/accessibility/browser_accessibility_gtk.h
deleted file mode 100644
index c8895e3..0000000
--- a/content/browser/accessibility/browser_accessibility_gtk.h
+++ /dev/null
@@ -1,92 +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.
-
-#ifndef CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_GTK_H_
-#define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_GTK_H_
-
-#include <atk/atk.h>
-
-#include "base/compiler_specific.h"
-#include "content/browser/accessibility/browser_accessibility.h"
-
-namespace content {
-
-class BrowserAccessibilityGtk;
-class BrowserAccessibilityManagerGtk;
-
-G_BEGIN_DECLS
-
-#define BROWSER_ACCESSIBILITY_TYPE (browser_accessibility_get_type())
-#define BROWSER_ACCESSIBILITY(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST( \
- (obj), BROWSER_ACCESSIBILITY_TYPE, BrowserAccessibilityAtk))
-#define BROWSER_ACCESSIBILITY_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST( \
- (klass), BROWSER_ACCESSIBILITY_TYPE, BrowserAccessibilityAtkClass))
-#define IS_BROWSER_ACCESSIBILITY(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj), BROWSER_ACCESSIBILITY_TYPE))
-#define IS_BROWSER_ACCESSIBILITY_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass), BROWSER_ACCESSIBILITY_TYPE))
-#define BROWSER_ACCESSIBILITY_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS( \
- (obj), BROWSER_ACCESSIBILITY_TYPE, BrowserAccessibilityAtkClass))
-
-typedef struct _BrowserAccessibilityAtk BrowserAccessibilityAtk;
-typedef struct _BrowserAccessibilityAtkClass BrowserAccessibilityAtkClass;
-
-struct _BrowserAccessibilityAtk {
- AtkObject parent;
- BrowserAccessibilityGtk* m_object;
-};
-
-struct _BrowserAccessibilityAtkClass {
- AtkObjectClass parent_class;
-};
-
-GType browser_accessibility_get_type (void) G_GNUC_CONST;
-
-BrowserAccessibilityAtk* browser_accessibility_new(
- BrowserAccessibilityGtk* object);
-
-BrowserAccessibilityGtk* browser_accessibility_get_object(
- BrowserAccessibilityAtk* atk_object);
-
-void browser_accessibility_detach (BrowserAccessibilityAtk* atk_object);
-
-AtkObject* browser_accessibility_get_focused_element(
- BrowserAccessibilityAtk* atk_object);
-
-G_END_DECLS
-
-class BrowserAccessibilityGtk : public BrowserAccessibility {
- public:
- BrowserAccessibilityGtk();
-
- virtual ~BrowserAccessibilityGtk();
-
- AtkObject* GetAtkObject() const;
-
- AtkRole atk_role() { return atk_role_; }
-
- // BrowserAccessibility methods.
- virtual void PreInitialize() OVERRIDE;
- virtual bool IsNative() const OVERRIDE;
-
- private:
- virtual void InitRoleAndState();
-
- // Give BrowserAccessibility::Create access to our constructor.
- friend class BrowserAccessibility;
-
- AtkObject* atk_object_;
- AtkRole atk_role_;
- int interface_mask_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityGtk);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_GTK_H_
diff --git a/content/browser/accessibility/browser_accessibility_manager_gtk.cc b/content/browser/accessibility/browser_accessibility_manager_gtk.cc
deleted file mode 100644
index 8748de5..0000000
--- a/content/browser/accessibility/browser_accessibility_manager_gtk.cc
+++ /dev/null
@@ -1,82 +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/accessibility/browser_accessibility_manager_gtk.h"
-
-#include "content/browser/accessibility/browser_accessibility_gtk.h"
-#include "content/common/accessibility_messages.h"
-
-namespace content {
-
-// static
-BrowserAccessibilityManager* BrowserAccessibilityManager::Create(
- const ui::AXNodeData& src,
- BrowserAccessibilityDelegate* delegate,
- BrowserAccessibilityFactory* factory) {
- return new BrowserAccessibilityManagerGtk(
- NULL,
- src,
- delegate,
- factory);
-}
-
-BrowserAccessibilityManagerGtk::BrowserAccessibilityManagerGtk(
- GtkWidget* parent_widget,
- const ui::AXNodeData& src,
- BrowserAccessibilityDelegate* delegate,
- BrowserAccessibilityFactory* factory)
- : BrowserAccessibilityManager(delegate, factory),
- parent_widget_(parent_widget) {
- Initialize(src);
-}
-
-BrowserAccessibilityManagerGtk::~BrowserAccessibilityManagerGtk() {
-}
-
-// static
-ui::AXNodeData BrowserAccessibilityManagerGtk::GetEmptyDocument() {
- ui::AXNodeData empty_document;
- empty_document.id = 0;
- empty_document.role = ui::AX_ROLE_ROOT_WEB_AREA;
- empty_document.state =
- 1 << ui::AX_STATE_READ_ONLY;
- return empty_document;
-}
-
-void BrowserAccessibilityManagerGtk::NotifyAccessibilityEvent(
- ui::AXEvent event_type,
- BrowserAccessibility* node) {
- if (!node->IsNative())
- return;
- AtkObject* atk_object = node->ToBrowserAccessibilityGtk()->GetAtkObject();
-
- switch (event_type) {
- case ui::AX_EVENT_CHILDREN_CHANGED:
- RecursivelySendChildrenChanged(GetRoot()->ToBrowserAccessibilityGtk());
- break;
- case ui::AX_EVENT_FOCUS:
- // Note: the focus-event was deprecated in ATK 2.9.4
- // See https://bugzilla.gnome.org/show_bug.cgi?id=649575#c8
- g_signal_emit_by_name(atk_object, "focus-event", true);
- break;
- default:
- break;
- }
-}
-
-void BrowserAccessibilityManagerGtk::RecursivelySendChildrenChanged(
- BrowserAccessibilityGtk* node) {
- AtkObject* atkObject = node->ToBrowserAccessibilityGtk()->GetAtkObject();
- for (unsigned int i = 0; i < node->InternalChildCount(); ++i) {
- BrowserAccessibilityGtk* child =
- node->InternalGetChild(i)->ToBrowserAccessibilityGtk();
- g_signal_emit_by_name(atkObject,
- "children-changed::add",
- i,
- child->GetAtkObject());
- RecursivelySendChildrenChanged(child);
- }
-}
-
-} // namespace content
diff --git a/content/browser/accessibility/browser_accessibility_manager_gtk.h b/content/browser/accessibility/browser_accessibility_manager_gtk.h
deleted file mode 100644
index 6349a81..0000000
--- a/content/browser/accessibility/browser_accessibility_manager_gtk.h
+++ /dev/null
@@ -1,48 +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.
-
-#ifndef CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_GTK_H_
-#define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_GTK_H_
-
-#include "content/browser/accessibility/browser_accessibility_manager.h"
-
-struct ViewHostMsg_AccessibilityNotification_Params;
-
-namespace content {
-class BrowserAccessibilityGtk;
-
-// Manages a tree of BrowserAccessibilityGtk objects.
-class CONTENT_EXPORT BrowserAccessibilityManagerGtk
- : public BrowserAccessibilityManager {
- public:
- BrowserAccessibilityManagerGtk(
- GtkWidget* parent_widget,
- const ui::AXNodeData& src,
- BrowserAccessibilityDelegate* delegate,
- BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory());
-
- virtual ~BrowserAccessibilityManagerGtk();
-
- static ui::AXNodeData GetEmptyDocument();
-
- // BrowserAccessibilityManager methods
- virtual void NotifyAccessibilityEvent(
- ui::AXEvent event_type, BrowserAccessibility* node) OVERRIDE;
-
- GtkWidget* parent_widget() { return parent_widget_; }
-
- private:
- void RecursivelySendChildrenChanged(BrowserAccessibilityGtk* node);
-
- GtkWidget* parent_widget_;
-
- // Give BrowserAccessibilityManager::Create access to our constructor.
- friend class BrowserAccessibilityManager;
-
- DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManagerGtk);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_GTK_H_
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index cb250c1..2a6b823 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -98,10 +98,6 @@
#include "content/browser/device_monitor_mac.h"
#endif
-#if defined(TOOLKIT_GTK)
-#include "ui/gfx/gtk_util.h"
-#endif
-
#if defined(OS_POSIX) && !defined(OS_MACOSX)
#include <sys/stat.h>
@@ -384,10 +380,6 @@ void BrowserMainLoop::EarlyInitialization() {
g_type_init();
#endif
-#if !defined(USE_AURA)
- gfx::GtkInitFromCommandLine(parsed_command_line_);
-#endif
-
SetUpGLibLogHandler();
#endif
diff --git a/content/browser/frame_host/render_widget_host_view_guest.cc b/content/browser/frame_host/render_widget_host_view_guest.cc
index be692c8..00dcd41 100644
--- a/content/browser/frame_host/render_widget_host_view_guest.cc
+++ b/content/browser/frame_host/render_widget_host_view_guest.cc
@@ -497,16 +497,6 @@ void RenderWidgetHostViewGuest::ShowDisambiguationPopup(
}
#endif // defined(OS_ANDROID)
-#if defined(TOOLKIT_GTK)
-GdkEventButton* RenderWidgetHostViewGuest::GetLastMouseDown() {
- return NULL;
-}
-
-gfx::NativeView RenderWidgetHostViewGuest::BuildInputMethodsGtkMenu() {
- return platform_view_->BuildInputMethodsGtkMenu();
-}
-#endif // defined(TOOLKIT_GTK)
-
#if defined(OS_WIN)
void RenderWidgetHostViewGuest::SetParentNativeViewAccessible(
gfx::NativeViewAccessible accessible_parent) {
diff --git a/content/browser/frame_host/render_widget_host_view_guest.h b/content/browser/frame_host/render_widget_host_view_guest.h
index 8413e30..930650d 100644
--- a/content/browser/frame_host/render_widget_host_view_guest.h
+++ b/content/browser/frame_host/render_widget_host_view_guest.h
@@ -18,10 +18,6 @@
#include "ui/gfx/rect.h"
#include "ui/gfx/vector2d_f.h"
-#if defined(TOOLKIT_GTK)
-#include "content/browser/renderer_host/gtk_plugin_container_manager.h"
-#endif // defined(TOOLKIT_GTK)
-
namespace content {
class RenderWidgetHost;
class RenderWidgetHostImpl;
@@ -149,11 +145,6 @@ class CONTENT_EXPORT RenderWidgetHostViewGuest
const SkBitmap& zoomed_bitmap) OVERRIDE;
#endif // defined(OS_ANDROID)
-#if defined(TOOLKIT_GTK)
- virtual GdkEventButton* GetLastMouseDown() OVERRIDE;
- virtual gfx::NativeView BuildInputMethodsGtkMenu() OVERRIDE;
-#endif // defined(TOOLKIT_GTK)
-
#if defined(OS_WIN)
virtual void SetParentNativeViewAccessible(
gfx::NativeViewAccessible accessible_parent) OVERRIDE;
diff --git a/content/browser/gpu/gpu_surface_tracker.cc b/content/browser/gpu/gpu_surface_tracker.cc
index 350e6f3..42ce146 100644
--- a/content/browser/gpu/gpu_surface_tracker.cc
+++ b/content/browser/gpu/gpu_surface_tracker.cc
@@ -10,57 +10,8 @@
#include "base/logging.h"
-#if defined(TOOLKIT_GTK)
-#include "base/bind.h"
-#include "content/public/browser/browser_thread.h"
-#include "ui/gfx/gtk_native_view_id_manager.h"
-#endif // defined(TOOLKIT_GTK)
-
namespace content {
-namespace {
-#if defined(TOOLKIT_GTK)
-
-void ReleasePermanentXIDDispatcher(
- const gfx::PluginWindowHandle& surface) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- GtkNativeViewManager* manager = GtkNativeViewManager::GetInstance();
- manager->ReleasePermanentXID(surface);
-}
-
-// Implementation of SurfaceRef that allows GTK to ref and unref the
-// surface with the GtkNativeViewManager.
-class SurfaceRefPluginWindow : public GpuSurfaceTracker::SurfaceRef {
- public:
- SurfaceRefPluginWindow(const gfx::PluginWindowHandle& surface_ref);
- private:
- virtual ~SurfaceRefPluginWindow();
- gfx::PluginWindowHandle surface_;
-};
-
-SurfaceRefPluginWindow::SurfaceRefPluginWindow(
- const gfx::PluginWindowHandle& surface)
- : surface_(surface) {
- if (surface_ != gfx::kNullPluginWindow) {
- GtkNativeViewManager* manager = GtkNativeViewManager::GetInstance();
- if (!manager->AddRefPermanentXID(surface_)) {
- LOG(ERROR) << "Surface " << surface << " cannot be referenced.";
- }
- }
-}
-
-SurfaceRefPluginWindow::~SurfaceRefPluginWindow() {
- if (surface_ != gfx::kNullPluginWindow) {
- BrowserThread::PostTask(BrowserThread::UI,
- FROM_HERE,
- base::Bind(&ReleasePermanentXIDDispatcher,
- surface_));
- }
-}
-#endif // defined(TOOLKIT_GTK)
-} // anonymous
-
GpuSurfaceTracker::GpuSurfaceTracker()
: next_surface_id_(1) {
GpuSurfaceLookup::InitInstance(this);
@@ -134,9 +85,6 @@ void GpuSurfaceTracker::SetSurfaceHandle(int surface_id,
DCHECK(surface_map_.find(surface_id) != surface_map_.end());
SurfaceInfo& info = surface_map_[surface_id];
info.handle = handle;
-#if defined(TOOLKIT_GTK)
- info.surface_ref = new SurfaceRefPluginWindow(handle.handle);
-#endif // defined(TOOLKIT_GTK)
}
gfx::GLSurfaceHandle GpuSurfaceTracker::GetSurfaceHandle(int surface_id) {
diff --git a/content/browser/gpu/test_support_gpu.gypi b/content/browser/gpu/test_support_gpu.gypi
index 4892e9a..742d53f 100644
--- a/content/browser/gpu/test_support_gpu.gypi
+++ b/content/browser/gpu/test_support_gpu.gypi
@@ -51,11 +51,6 @@
# See comments about "xcode_settings" elsewhere in this file.
'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-ObjC']},
}],
- ['toolkit_uses_gtk == 1', {
- 'dependencies': [
- '<(src_dir)/build/linux/system.gyp:gtk',
- ],
- }],
['toolkit_uses_gtk == 1 or chromeos==1 or (OS=="linux" and use_aura==1)', {
'dependencies': [
'<(src_dir)/build/linux/system.gyp:ssl',
diff --git a/content/browser/plugin_process_host.cc b/content/browser/plugin_process_host.cc
index b6d54b9..077f512 100644
--- a/content/browser/plugin_process_host.cc
+++ b/content/browser/plugin_process_host.cc
@@ -43,10 +43,6 @@
#include "ui/gfx/native_widget_types.h"
#include "ui/gl/gl_switches.h"
-#if defined(USE_X11)
-#include "ui/gfx/gtk_native_view_id_manager.h"
-#endif
-
#if defined(OS_MACOSX)
#include "base/mac/mac_util.h"
#include "content/common/plugin_carbon_interpose_constants_mac.h"
@@ -110,16 +106,6 @@ class PluginSandboxedProcessLauncherDelegate
DISALLOW_COPY_AND_ASSIGN(PluginSandboxedProcessLauncherDelegate);
};
-#if defined(TOOLKIT_GTK)
-void PluginProcessHost::OnMapNativeViewId(gfx::NativeViewId id,
- gfx::PluginWindowHandle* output) {
- *output = 0;
-#if !defined(USE_AURA)
- GtkNativeViewManager::GetInstance()->GetXIDForId(output, id);
-#endif
-}
-#endif // defined(TOOLKIT_GTK)
-
PluginProcessHost::PluginProcessHost()
#if defined(OS_MACOSX)
: plugin_cursor_visible_(true)
@@ -300,10 +286,6 @@ bool PluginProcessHost::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_HANDLER(PluginProcessHostMsg_PluginWindowDestroyed,
OnPluginWindowDestroyed)
#endif
-#if defined(TOOLKIT_GTK)
- IPC_MESSAGE_HANDLER(PluginProcessHostMsg_MapNativeViewId,
- OnMapNativeViewId)
-#endif
#if defined(OS_MACOSX)
IPC_MESSAGE_HANDLER(PluginProcessHostMsg_PluginSelectWindow,
OnPluginSelectWindow)
diff --git a/content/browser/plugin_process_host.h b/content/browser/plugin_process_host.h
index aaaf6dd..71c7580 100644
--- a/content/browser/plugin_process_host.h
+++ b/content/browser/plugin_process_host.h
@@ -133,10 +133,6 @@ class CONTENT_EXPORT PluginProcessHost : public BrowserChildProcessHostDelegate,
void OnPluginWindowDestroyed(HWND window, HWND parent);
#endif
-#if defined(USE_X11)
- void OnMapNativeViewId(gfx::NativeViewId id, gfx::PluginWindowHandle* output);
-#endif
-
#if defined(OS_MACOSX)
void OnPluginSelectWindow(uint32 window_id, gfx::Rect window_rect,
bool modal);
diff --git a/content/browser/power_save_blocker_x11.cc b/content/browser/power_save_blocker_x11.cc
index f55fac9..cecb232 100644
--- a/content/browser/power_save_blocker_x11.cc
+++ b/content/browser/power_save_blocker_x11.cc
@@ -22,6 +22,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/memory/singleton.h"
#include "base/message_loop/message_loop_proxy.h"
+#include "base/message_loop/message_pump_x11.h"
#include "base/nix/xdg_util.h"
#include "base/synchronization/lock.h"
#include "content/public/browser/browser_thread.h"
@@ -31,12 +32,6 @@
#include "dbus/object_proxy.h"
#include "ui/gfx/x/x11_types.h"
-#if defined(TOOLKIT_GTK)
-#include "base/message_loop/message_pump_gtk.h"
-#else
-#include "base/message_loop/message_pump_x11.h"
-#endif
-
namespace {
enum DBusAPI {
diff --git a/content/browser/renderer_host/backing_store_gtk.cc b/content/browser/renderer_host/backing_store_gtk.cc
deleted file mode 100644
index 147ee4d..0000000
--- a/content/browser/renderer_host/backing_store_gtk.cc
+++ /dev/null
@@ -1,692 +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/renderer_host/backing_store_gtk.h"
-
-#include <cairo-xlib.h>
-#include <gtk/gtk.h>
-#include <stdlib.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <X11/extensions/sync.h>
-
-#if defined(OS_OPENBSD) || defined(OS_FREEBSD)
-#include <sys/endian.h>
-#endif
-
-#include <algorithm>
-#include <limits>
-#include <queue>
-#include <utility>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/memory/singleton.h"
-#include "base/metrics/histogram.h"
-#include "base/time/time.h"
-#include "content/browser/renderer_host/render_process_host_impl.h"
-#include "skia/ext/platform_canvas.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/base/gtk/gtk_signal.h"
-#include "ui/base/x/x11_util_internal.h"
-#include "ui/gfx/rect.h"
-#include "ui/gfx/rect_conversions.h"
-#include "ui/gfx/x/x11_types.h"
-#include "ui/surface/transport_dib.h"
-
-namespace content {
-namespace {
-
-// Assume that somewhere along the line, someone will do width * height * 4
-// with signed numbers. If the maximum value is 2**31, then 2**31 / 4 =
-// 2**29 and floor(sqrt(2**29)) = 23170.
-
-// Max height and width for layers
-static const int kMaxVideoLayerSize = 23170;
-
-
-// X Backing Stores:
-//
-// Unlike Windows, where the backing store is kept in heap memory, we keep our
-// backing store in the X server, as a pixmap. Thus expose events just require
-// instructing the X server to copy from the backing store to the window.
-//
-// The backing store is in the same format as the visual which our main window
-// is using. Bitmaps from the renderer are uploaded to the X server, either via
-// shared memory or over the wire, and XRENDER is used to convert them to the
-// correct format for the backing store.
-
-// Destroys the image and the associated shared memory structures. This is a
-// helper function for code using shared memory.
-void DestroySharedImage(XDisplay* display,
- XImage* image,
- XShmSegmentInfo* shminfo) {
- XShmDetach(display, shminfo);
- XDestroyImage(image);
- shmdt(shminfo->shmaddr);
-}
-
-// So we don't don't want to call XSync(), which can block the UI loop for
-// ~100ms on first paint and is generally slow. We optionally use the
-// XSyncExtension to push a callback into the X11 event queue and get a
-// callback instead of blocking until the event queue is cleared.
-//
-// TODO(erg): If gfx::GetXDisplay() ever gets fixed to handle multiple Displays,
-// this must be modified to be per Display instead of a Singleton.
-class XSyncHandler {
- public:
- static XSyncHandler* GetInstance() {
- return Singleton<XSyncHandler>::get();
- }
-
- bool Enabled() {
- return loaded_extension_;
- }
-
- void PushPaintCounter(TransportDIB* dib,
- XDisplay* display,
- Picture picture,
- Pixmap pixmap,
- const base::Closure& completion_callback);
-
- private:
- friend struct DefaultSingletonTraits<XSyncHandler>;
-
- // A struct that has cleanup and callback tasks that were queued into the
- // future and are run on |g_backing_store_sync_alarm| firing.
- struct BackingStoreEvents {
- BackingStoreEvents(TransportDIB* dib, XDisplay* d, Picture pic, Pixmap pix,
- const base::Closure& c)
- : dib(dib),
- display(d),
- picture(pic),
- pixmap(pix),
- closure(c) {
- dib->IncreaseInFlightCounter();
- }
-
- TransportDIB* dib;
-
- // The display we're running on.
- XDisplay* display;
-
- // Data to delete.
- Picture picture;
- Pixmap pixmap;
-
- // Callback once everything else is done.
- base::Closure closure;
- };
-
- XSyncHandler();
- ~XSyncHandler();
-
- // An event filter notified about all XEvents. We then filter out XSync
- // events that are on counters that we made.
- CHROMEG_CALLBACK_1(XSyncHandler, GdkFilterReturn, OnEvent, GdkXEvent*,
- GdkEvent*);
-
- // Whether we successfully loaded XSyncExtension.
- bool loaded_extension_;
-
- // The event ids returned to us by XSyncQueryExtension().
- int xsync_event_base_;
- int xsync_error_base_;
-
- XSyncCounter backing_store_sync_counter_;
- XSyncAlarm backing_store_sync_alarm_;
-
- // A queue of pending paints that we clean up after as alarms fire.
- std::queue<BackingStoreEvents*> backing_store_events_;
-};
-
-void XSyncHandler::PushPaintCounter(TransportDIB* dib,
- XDisplay* display,
- Picture picture,
- Pixmap pixmap,
- const base::Closure& completion_callback) {
- backing_store_events_.push(new BackingStoreEvents(
- dib, display, picture, pixmap, completion_callback));
-
- // Push a change counter event into the X11 event queue that will trigger our
- // alarm when it is processed.
- XSyncValue value;
- XSyncIntToValue(&value, 1);
- XSyncChangeCounter(gfx::GetXDisplay(),
- backing_store_sync_counter_,
- value);
-}
-
-XSyncHandler::XSyncHandler()
- : loaded_extension_(false),
- xsync_event_base_(0),
- xsync_error_base_(0),
- backing_store_sync_counter_(0),
- backing_store_sync_alarm_(0) {
- XDisplay* display = gfx::GetXDisplay();
- if (XSyncQueryExtension(display,
- &xsync_event_base_,
- &xsync_error_base_)) {
- // Create our monotonically increasing counter.
- XSyncValue value;
- XSyncIntToValue(&value, 0);
- backing_store_sync_counter_ = XSyncCreateCounter(display, value);
-
- // Cerate our alarm that watches for changes to our counter.
- XSyncAlarmAttributes attributes;
- attributes.trigger.counter = backing_store_sync_counter_;
- backing_store_sync_alarm_ = XSyncCreateAlarm(display,
- XSyncCACounter,
- &attributes);
-
- // Add our filter to the message loop to handle alarm triggers.
- gdk_window_add_filter(NULL, &OnEventThunk, this);
-
- loaded_extension_ = true;
- }
-}
-
-XSyncHandler::~XSyncHandler() {
- if (loaded_extension_)
- gdk_window_remove_filter(NULL, &OnEventThunk, this);
-
- XSync(gfx::GetXDisplay(), False);
- while (!backing_store_events_.empty()) {
- // We delete the X11 resources we're holding onto. We don't run the
- // callbacks because we are shutting down.
- BackingStoreEvents* data = backing_store_events_.front();
- backing_store_events_.pop();
- XRenderFreePicture(data->display, data->picture);
- XFreePixmap(data->display, data->pixmap);
- data->dib->DecreaseInFlightCounter();
- delete data;
- }
-}
-
-GdkFilterReturn XSyncHandler::OnEvent(GdkXEvent* gdkxevent,
- GdkEvent* event) {
- XEvent* xevent = reinterpret_cast<XEvent*>(gdkxevent);
- if (xevent->type == xsync_event_base_ + XSyncAlarmNotify) {
- XSyncAlarmNotifyEvent* alarm_event =
- reinterpret_cast<XSyncAlarmNotifyEvent*>(xevent);
- if (alarm_event->alarm == backing_store_sync_alarm_) {
- if (alarm_event->counter_value.hi == 0 &&
- alarm_event->counter_value.lo == 0) {
- // We receive an event about the initial state of the counter during
- // alarm creation. We must ignore this event instead of responding to
- // it.
- return GDK_FILTER_REMOVE;
- }
-
- DCHECK(!backing_store_events_.empty());
- BackingStoreEvents* data = backing_store_events_.front();
- backing_store_events_.pop();
-
- // We are responsible for deleting all the data in the struct now that
- // we are finished with it.
- XRenderFreePicture(data->display, data->picture);
- XFreePixmap(data->display, data->pixmap);
-
- // Dispatch the closure we were given.
- data->closure.Run();
-
- data->dib->DecreaseInFlightCounter();
- delete data;
-
- return GDK_FILTER_REMOVE;
- }
- }
-
- return GDK_FILTER_CONTINUE;
-}
-
-} // namespace
-
-BackingStoreGtk::BackingStoreGtk(RenderWidgetHost* widget,
- const gfx::Size& size,
- void* visual,
- int depth)
- : BackingStore(widget, size),
- display_(gfx::GetXDisplay()),
- shared_memory_support_(ui::QuerySharedMemorySupport(display_)),
- use_render_(ui::QueryRenderSupport(display_)),
- visual_(visual),
- visual_depth_(depth),
- root_window_(ui::GetX11RootWindow()) {
-#if defined(OS_OPENBSD) || defined(OS_FREEBSD)
- COMPILE_ASSERT(_BYTE_ORDER == _LITTLE_ENDIAN, assumes_little_endian);
-#else
- COMPILE_ASSERT(__BYTE_ORDER == __LITTLE_ENDIAN, assumes_little_endian);
-#endif
-
- pixmap_ = XCreatePixmap(display_, root_window_,
- size.width(), size.height(), depth);
-
- if (use_render_) {
- picture_ = XRenderCreatePicture(
- display_, pixmap_,
- ui::GetRenderVisualFormat(display_,
- static_cast<Visual*>(visual)),
- 0, NULL);
- pixmap_bpp_ = 0;
- } else {
- picture_ = 0;
- pixmap_bpp_ = gfx::BitsPerPixelForPixmapDepth(display_, depth);
- }
-
- pixmap_gc_ = XCreateGC(display_, pixmap_, 0, NULL);
-}
-
-BackingStoreGtk::BackingStoreGtk(RenderWidgetHost* widget,
- const gfx::Size& size)
- : BackingStore(widget, size),
- display_(NULL),
- shared_memory_support_(ui::SHARED_MEMORY_NONE),
- use_render_(false),
- pixmap_bpp_(0),
- visual_(NULL),
- visual_depth_(-1),
- root_window_(0),
- pixmap_(0),
- picture_(0),
- pixmap_gc_(NULL) {
-}
-
-BackingStoreGtk::~BackingStoreGtk() {
- // In unit tests, display_ may be NULL.
- if (!display_)
- return;
-
- XRenderFreePicture(display_, picture_);
- XFreePixmap(display_, pixmap_);
- XFreeGC(display_, static_cast<GC>(pixmap_gc_));
-}
-
-size_t BackingStoreGtk::MemorySize() {
- if (!use_render_)
- return size().GetArea() * (pixmap_bpp_ / 8);
- else
- return size().GetArea() * 4;
-}
-
-void BackingStoreGtk::PaintRectWithoutXrender(
- TransportDIB* bitmap,
- const gfx::Rect& bitmap_rect,
- const std::vector<gfx::Rect>& copy_rects) {
- const int width = bitmap_rect.width();
- const int height = bitmap_rect.height();
- Pixmap pixmap = XCreatePixmap(display_, root_window_, width, height,
- visual_depth_);
-
- // Draw ARGB transport DIB onto our pixmap.
- gfx::PutARGBImage(display_, visual_, visual_depth_, pixmap,
- pixmap_gc_, static_cast<uint8*>(bitmap->memory()),
- width, height);
-
- for (size_t i = 0; i < copy_rects.size(); i++) {
- const gfx::Rect& copy_rect = copy_rects[i];
- XCopyArea(display_,
- pixmap, // src
- pixmap_, // dest
- static_cast<GC>(pixmap_gc_), // gc
- copy_rect.x() - bitmap_rect.x(), // src_x
- copy_rect.y() - bitmap_rect.y(), // src_y
- copy_rect.width(), // width
- copy_rect.height(), // height
- copy_rect.x(), // dest_x
- copy_rect.y()); // dest_y
- }
-
- XFreePixmap(display_, pixmap);
-}
-
-void BackingStoreGtk::PaintToBackingStore(
- RenderProcessHost* process,
- TransportDIB::Id bitmap,
- const gfx::Rect& bitmap_rect,
- const std::vector<gfx::Rect>& copy_rects,
- float scale_factor,
- const base::Closure& completion_callback,
- bool* scheduled_completion_callback) {
- *scheduled_completion_callback = false;
-
- if (!display_)
- return;
-
- if (bitmap_rect.IsEmpty())
- return;
-
- gfx::Rect pixel_bitmap_rect = gfx::ToEnclosedRect(
- gfx::ScaleRect(bitmap_rect, scale_factor));
- const int width = pixel_bitmap_rect.width();
- const int height = pixel_bitmap_rect.height();
-
- if (width <= 0 || width > kMaxVideoLayerSize ||
- height <= 0 || height > kMaxVideoLayerSize)
- return;
-
- TransportDIB* dib = process->GetTransportDIB(bitmap);
- if (!dib)
- return;
-
- if (!use_render_)
- return PaintRectWithoutXrender(dib, bitmap_rect, copy_rects);
-
- Picture picture;
- Pixmap pixmap;
-
- if (shared_memory_support_ == ui::SHARED_MEMORY_PIXMAP) {
- XShmSegmentInfo shminfo = {0};
- shminfo.shmseg = dib->MapToX(display_);
-
- // The NULL in the following is the |data| pointer: this is an artifact of
- // Xlib trying to be helpful, rather than just exposing the X protocol. It
- // assumes that we have the shared memory segment mapped into our memory,
- // which we don't, and it's trying to calculate an offset by taking the
- // difference between the |data| pointer and the address of the mapping in
- // |shminfo|. Since both are NULL, the offset will be calculated to be 0,
- // which is correct for us.
- pixmap = XShmCreatePixmap(display_, root_window_, NULL, &shminfo,
- width, height, 32);
- } else {
- // We don't have shared memory pixmaps. Fall back to creating a pixmap
- // ourselves and putting an image on it.
- pixmap = XCreatePixmap(display_, root_window_, width, height, 32);
- GC gc = XCreateGC(display_, pixmap, 0, NULL);
-
- if (shared_memory_support_ == ui::SHARED_MEMORY_PUTIMAGE) {
- const XID shmseg = dib->MapToX(display_);
-
- XShmSegmentInfo shminfo;
- memset(&shminfo, 0, sizeof(shminfo));
- shminfo.shmseg = shmseg;
- shminfo.shmaddr = static_cast<char*>(dib->memory());
-
- XImage* image = XShmCreateImage(display_, static_cast<Visual*>(visual_),
- 32, ZPixmap,
- shminfo.shmaddr, &shminfo,
- width, height);
-
- // This code path is important for performance and we have found that
- // different techniques work better on different platforms. See
- // http://code.google.com/p/chromium/issues/detail?id=44124.
- //
- // Checking for ARM is an approximation, but it seems to be a good one so
- // far.
-#if defined(ARCH_CPU_ARM_FAMILY)
- for (size_t i = 0; i < copy_rects.size(); i++) {
- const gfx::Rect& copy_rect = copy_rects[i];
- gfx::Rect pixel_copy_rect = gfx::ToEnclosedRect(
- gfx::ScaleRect(copy_rect, scale_factor));
- XShmPutImage(display_, pixmap, gc, image,
- pixel_copy_rect.x() - pixel_bitmap_rect.x(), /* source x */
- pixel_copy_rect.y() - pixel_bitmap_rect.y(), /* source y */
- pixel_copy_rect.x() - pixel_bitmap_rect.x(), /* dest x */
- pixel_copy_rect.y() - pixel_bitmap_rect.y(), /* dest y */
- pixel_copy_rect.width(), pixel_copy_rect.height(),
- False /* send_event */);
- }
-#else
- XShmPutImage(display_, pixmap, gc, image,
- 0, 0 /* source x, y */, 0, 0 /* dest x, y */,
- width, height, False /* send_event */);
-#endif
- XDestroyImage(image);
- } else { // case SHARED_MEMORY_NONE
- // No shared memory support, we have to copy the bitmap contents
- // to the X server. Xlib wraps the underlying PutImage call
- // behind several layers of functions which try to convert the
- // image into the format which the X server expects. The
- // following values hopefully disable all conversions.
- XImage image;
- memset(&image, 0, sizeof(image));
-
- image.width = width;
- image.height = height;
- image.depth = 32;
- image.bits_per_pixel = 32;
- image.format = ZPixmap;
- image.byte_order = LSBFirst;
- image.bitmap_unit = 8;
- image.bitmap_bit_order = LSBFirst;
- image.bytes_per_line = width * 4;
- image.red_mask = 0xff;
- image.green_mask = 0xff00;
- image.blue_mask = 0xff0000;
- image.data = static_cast<char*>(dib->memory());
-
- XPutImage(display_, pixmap, gc, &image,
- 0, 0 /* source x, y */, 0, 0 /* dest x, y */,
- width, height);
- }
- XFreeGC(display_, gc);
- }
-
- picture = ui::CreatePictureFromSkiaPixmap(display_, pixmap);
-
- if (scale_factor != 1.0) {
- float up_scale = 1.0 / scale_factor;
- XTransform scaling = { {
- { XDoubleToFixed(1), XDoubleToFixed(0), XDoubleToFixed(0) },
- { XDoubleToFixed(0), XDoubleToFixed(1), XDoubleToFixed(0) },
- { XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(up_scale) }
- } };
- XRenderSetPictureTransform(display_, picture, &scaling);
- XRenderSetPictureFilter(display_, picture, FilterGood, NULL, 0);
- }
- for (size_t i = 0; i < copy_rects.size(); i++) {
- const gfx::Rect& copy_rect = copy_rects[i];
- XRenderComposite(display_,
- PictOpSrc, // op
- picture, // src
- 0, // mask
- picture_, // dest
- copy_rect.x() - bitmap_rect.x(), // src_x
- copy_rect.y() - bitmap_rect.y(), // src_y
- 0, // mask_x
- 0, // mask_y
- copy_rect.x(), // dest_x
- copy_rect.y(), // dest_y
- copy_rect.width(), // width
- copy_rect.height()); // height
- }
-
- // In the case of shared memory, we wait for the composite to complete so that
- // we are sure that the X server has finished reading from the shared memory
- // segment.
- if (shared_memory_support_ != ui::SHARED_MEMORY_NONE) {
- XSyncHandler* handler = XSyncHandler::GetInstance();
- if (handler->Enabled()) {
- *scheduled_completion_callback = true;
- handler->PushPaintCounter(
- dib, display_, picture, pixmap, completion_callback);
- } else {
- XSync(display_, False);
- }
- }
-
- if (*scheduled_completion_callback == false) {
- // If we didn't schedule a callback, we need to delete our resources now.
- XRenderFreePicture(display_, picture);
- XFreePixmap(display_, pixmap);
- }
-}
-
-bool BackingStoreGtk::CopyFromBackingStore(const gfx::Rect& rect,
- skia::PlatformBitmap* output) {
- base::TimeTicks begin_time = base::TimeTicks::Now();
-
- if (visual_depth_ < 24) {
- // CopyFromBackingStore() copies pixels out of the XImage
- // in a way that assumes that each component (red, green,
- // blue) is a byte. This doesn't work on visuals which
- // encode a pixel color with less than a byte per color.
- return false;
- }
-
- const int width = std::min(size().width(), rect.width());
- const int height = std::min(size().height(), rect.height());
-
- XImage* image;
- XShmSegmentInfo shminfo; // Used only when shared memory is enabled.
- if (shared_memory_support_ != ui::SHARED_MEMORY_NONE) {
- // Use shared memory for faster copies when it's available.
- Visual* visual = static_cast<Visual*>(visual_);
- memset(&shminfo, 0, sizeof(shminfo));
- image = XShmCreateImage(display_, visual, 32,
- ZPixmap, NULL, &shminfo, width, height);
- if (!image) {
- return false;
- }
- // Create the shared memory segment for the image and map it.
- if (image->bytes_per_line == 0 || image->height == 0 ||
- static_cast<size_t>(image->height) >
- (std::numeric_limits<size_t>::max() / image->bytes_per_line)) {
- XDestroyImage(image);
- return false;
- }
- shminfo.shmid = shmget(IPC_PRIVATE, image->bytes_per_line * image->height,
- IPC_CREAT|0600);
- if (shminfo.shmid == -1) {
- XDestroyImage(image);
- LOG(WARNING) << "Failed to get shared memory segment. "
- "Performance may be degraded.";
- return false;
- } else {
- VLOG(1) << "Got shared memory segment " << shminfo.shmid;
- }
-
- void* mapped_memory = shmat(shminfo.shmid, NULL, SHM_RDONLY);
- shmctl(shminfo.shmid, IPC_RMID, 0);
- if (mapped_memory == (void*)-1) {
- XDestroyImage(image);
- return false;
- }
- shminfo.shmaddr = image->data = static_cast<char*>(mapped_memory);
-
- if (!XShmAttach(display_, &shminfo) ||
- !XShmGetImage(display_, pixmap_, image, rect.x(), rect.y(),
- AllPlanes)) {
- DestroySharedImage(display_, image, &shminfo);
- LOG(WARNING) << "X failed to get shared memory segment. "
- "Performance may be degraded.";
- return false;
- }
-
- VLOG(1) << "Using X shared memory segment " << shminfo.shmid;
- } else {
- LOG(WARNING) << "Not using X shared memory.";
- // Non-shared memory case just copy the image from the server.
- image = XGetImage(display_, pixmap_,
- rect.x(), rect.y(), width, height,
- AllPlanes, ZPixmap);
- }
-
- // TODO(jhawkins): Need to convert the image data if the image bits per pixel
- // is not 32.
- // Note that this also initializes the output bitmap as opaque.
- if (!output->Allocate(width, height, true) ||
- image->bits_per_pixel != 32) {
- if (shared_memory_support_ != ui::SHARED_MEMORY_NONE)
- DestroySharedImage(display_, image, &shminfo);
- else
- XDestroyImage(image);
- return false;
- }
-
- // The X image might have a different row stride, so iterate through
- // it and copy each row out, only up to the pixels we're actually
- // using. This code assumes a visual mode where a pixel is
- // represented using a 32-bit unsigned int, with a byte per component.
- const SkBitmap& bitmap = output->GetBitmap();
- SkAutoLockPixels alp(bitmap);
-
- for (int y = 0; y < height; y++) {
- const uint32* src_row = reinterpret_cast<uint32*>(
- &image->data[image->bytes_per_line * y]);
- uint32* dest_row = bitmap.getAddr32(0, y);
- for (int x = 0; x < width; ++x, ++dest_row) {
- // Force alpha to be 0xff, because otherwise it causes rendering problems.
- *dest_row = src_row[x] | 0xff000000;
- }
- }
-
- if (shared_memory_support_ != ui::SHARED_MEMORY_NONE)
- DestroySharedImage(display_, image, &shminfo);
- else
- XDestroyImage(image);
-
- HISTOGRAM_TIMES("BackingStore.RetrievalFromX",
- base::TimeTicks::Now() - begin_time);
- return true;
-}
-
-void BackingStoreGtk::ScrollBackingStore(const gfx::Vector2d& delta,
- const gfx::Rect& clip_rect,
- const gfx::Size& view_size) {
- if (!display_)
- return;
-
- // We only support scrolling in one direction at a time.
- DCHECK(delta.x() == 0 || delta.y() == 0);
-
- if (delta.y()) {
- // Positive values of |delta|.y() scroll up
- if (abs(delta.y()) < clip_rect.height()) {
- XCopyArea(display_, pixmap_, pixmap_, static_cast<GC>(pixmap_gc_),
- clip_rect.x() /* source x */,
- std::max(clip_rect.y(), clip_rect.y() - delta.y()),
- clip_rect.width(),
- clip_rect.height() - abs(delta.y()),
- clip_rect.x() /* dest x */,
- std::max(clip_rect.y(), clip_rect.y() + delta.y()) /* dest y */
- );
- }
- } else if (delta.x()) {
- // Positive values of |delta|.x() scroll right
- if (abs(delta.x()) < clip_rect.width()) {
- XCopyArea(display_, pixmap_, pixmap_, static_cast<GC>(pixmap_gc_),
- std::max(clip_rect.x(), clip_rect.x() - delta.x()),
- clip_rect.y() /* source y */,
- clip_rect.width() - abs(delta.x()),
- clip_rect.height(),
- std::max(clip_rect.x(), clip_rect.x() + delta.x()) /* dest x */,
- clip_rect.y() /* dest x */);
- }
- }
-}
-
-void BackingStoreGtk::XShowRect(const gfx::Point &origin,
- const gfx::Rect& rect, XID target) {
- XCopyArea(display_, pixmap_, target, static_cast<GC>(pixmap_gc_),
- rect.x(), rect.y(), rect.width(), rect.height(),
- rect.x() + origin.x(), rect.y() + origin.y());
-}
-
-#if defined(TOOLKIT_GTK)
-void BackingStoreGtk::PaintToRect(const gfx::Rect& rect, GdkDrawable* target) {
- cairo_surface_t* surface = cairo_xlib_surface_create(
- display_, pixmap_, static_cast<Visual*>(visual_),
- size().width(), size().height());
- cairo_t* cr = gdk_cairo_create(target);
-
- cairo_translate(cr, rect.x(), rect.y());
- double x_scale = static_cast<double>(rect.width()) / size().width();
- double y_scale = static_cast<double>(rect.height()) / size().height();
- cairo_scale(cr, x_scale, y_scale);
-
- cairo_pattern_t* pattern = cairo_pattern_create_for_surface(surface);
- cairo_pattern_set_filter(pattern, CAIRO_FILTER_BEST);
- cairo_set_source(cr, pattern);
- cairo_pattern_destroy(pattern);
-
- cairo_identity_matrix(cr);
-
- cairo_rectangle(cr, rect.x(), rect.y(), rect.width(), rect.height());
- cairo_fill(cr);
- cairo_destroy(cr);
-}
-#endif
-
-} // namespace content
diff --git a/content/browser/renderer_host/backing_store_gtk.h b/content/browser/renderer_host/backing_store_gtk.h
deleted file mode 100644
index 29776fc..0000000
--- a/content/browser/renderer_host/backing_store_gtk.h
+++ /dev/null
@@ -1,107 +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.
-
-#ifndef CONTENT_BROWSER_RENDERER_HOST_BACKING_STORE_GTK_H_
-#define CONTENT_BROWSER_RENDERER_HOST_BACKING_STORE_GTK_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "build/build_config.h"
-#include "content/browser/renderer_host/backing_store.h"
-#include "content/common/content_export.h"
-#include "ui/gfx/x/x11_types.h"
-
-namespace gfx {
-class Point;
-class Rect;
-}
-
-typedef struct _GdkDrawable GdkDrawable;
-
-namespace content {
-
-class CONTENT_EXPORT BackingStoreGtk : public BackingStore {
- public:
- // Create a backing store on the X server. The visual is an Xlib Visual
- // describing the format of the target window and the depth is the color
- // depth of the X window which will be drawn into.
- BackingStoreGtk(RenderWidgetHost* widget,
- const gfx::Size& size,
- void* visual,
- int depth);
-
- // This is for unittesting only. An object constructed using this constructor
- // will silently ignore all paints
- BackingStoreGtk(RenderWidgetHost* widget, const gfx::Size& size);
-
- virtual ~BackingStoreGtk();
-
- XDisplay* display() const { return display_; }
- XID root_window() const { return root_window_; }
-
- // Copy from the server-side backing store to the target window
- // origin: the destination rectangle origin
- // damage: the area to copy
- // target: the X id of the target window
- void XShowRect(const gfx::Point &origin, const gfx::Rect& damage,
- XID target);
-
-#if defined(TOOLKIT_GTK)
- // Paint the backing store into the target's |dest_rect|.
- void PaintToRect(const gfx::Rect& dest_rect, GdkDrawable* target);
-#endif
-
- // BackingStore implementation.
- virtual size_t MemorySize() OVERRIDE;
- virtual void PaintToBackingStore(
- RenderProcessHost* process,
- TransportDIB::Id bitmap,
- const gfx::Rect& bitmap_rect,
- const std::vector<gfx::Rect>& copy_rects,
- float scale_factor,
- const base::Closure& completion_callback,
- bool* scheduled_completion_callback) OVERRIDE;
- virtual bool CopyFromBackingStore(const gfx::Rect& rect,
- skia::PlatformBitmap* output) OVERRIDE;
- virtual void ScrollBackingStore(const gfx::Vector2d& delta,
- const gfx::Rect& clip_rect,
- const gfx::Size& view_size) OVERRIDE;
-
- private:
- // Paints the bitmap from the renderer onto the backing store without
- // using Xrender to composite the pixmaps.
- void PaintRectWithoutXrender(TransportDIB* bitmap,
- const gfx::Rect& bitmap_rect,
- const std::vector<gfx::Rect>& copy_rects);
-
- // This is the connection to the X server where this backing store will be
- // displayed.
- XDisplay* const display_;
- // What flavor, if any, MIT-SHM (X shared memory) support we have.
- const ui::SharedMemorySupport shared_memory_support_;
- // If this is true, then we can use Xrender to composite our pixmaps.
- const bool use_render_;
- // If |use_render_| is false, this is the number of bits-per-pixel for |depth|
- int pixmap_bpp_;
- // if |use_render_| is false, we need the Visual to get the RGB masks.
- void* const visual_;
- // This is the depth of the target window.
- const int visual_depth_;
- // The parent window (probably a GtkDrawingArea) for this backing store.
- const XID root_window_;
- // This is a handle to the server side pixmap which is our backing store.
- XID pixmap_;
- // This is the RENDER picture pointing at |pixmap_|.
- XID picture_;
- // This is a default graphic context, used in XCopyArea
- void* pixmap_gc_;
-
- DISALLOW_COPY_AND_ASSIGN(BackingStoreGtk);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_RENDERER_HOST_BACKING_STORE_GTK_H_
diff --git a/content/browser/renderer_host/gtk_im_context_wrapper.cc b/content/browser/renderer_host/gtk_im_context_wrapper.cc
deleted file mode 100644
index 3601b8d..0000000
--- a/content/browser/renderer_host/gtk_im_context_wrapper.cc
+++ /dev/null
@@ -1,665 +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/renderer_host/gtk_im_context_wrapper.h"
-
-#include <gdk/gdk.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "content/browser/renderer_host/render_widget_host_impl.h"
-#include "content/browser/renderer_host/render_widget_host_view_gtk.h"
-#include "content/public/browser/native_web_keyboard_event.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
-#include "ui/base/ime/composition_text_util_pango.h"
-#include "ui/gfx/gtk_util.h"
-#include "ui/gfx/rect.h"
-
-namespace content {
-namespace {
-
-// Copied from third_party/WebKit/Source/WebCore/page/EventHandler.cpp
-//
-// Match key code of composition keydown event on windows.
-// IE sends VK_PROCESSKEY which has value 229;
-//
-// Please refer to following documents for detals:
-// - Virtual-Key Codes
-// http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx
-// - How the IME System Works
-// http://msdn.microsoft.com/en-us/library/cc194848.aspx
-// - ImmGetVirtualKey Function
-// http://msdn.microsoft.com/en-us/library/dd318570(VS.85).aspx
-const int kCompositionEventKeyCode = 229;
-
-} // namespace
-
-// ui::CompositionUnderline should be identical to
-// blink::WebCompositionUnderline, so that we can do reinterpret_cast safely.
-// TODO(suzhe): remove it after migrating all code in chrome to use
-// ui::CompositionUnderline.
-COMPILE_ASSERT(sizeof(ui::CompositionUnderline) ==
- sizeof(blink::WebCompositionUnderline),
- ui_CompositionUnderline__WebKit_WebCompositionUnderline_diff);
-
-GtkIMContextWrapper::GtkIMContextWrapper(RenderWidgetHostViewGtk* host_view)
- : host_view_(host_view),
- context_(gtk_im_multicontext_new()),
- context_simple_(gtk_im_context_simple_new()),
- is_focused_(false),
- is_composing_text_(false),
- is_enabled_(false),
- is_in_key_event_handler_(false),
- is_composition_changed_(false),
- suppress_next_commit_(false),
- last_key_code_(0),
- last_key_was_up_(false),
- last_key_filtered_no_result_(false) {
- DCHECK(context_);
- DCHECK(context_simple_);
-
- // context_ and context_simple_ share the same callback handlers.
- // All data come from them are treated equally.
- // context_ is for full input method support.
- // context_simple_ is for supporting dead/compose keys when input method is
- // disabled by webkit, eg. in password input box.
- g_signal_connect(context_, "preedit-start",
- G_CALLBACK(HandlePreeditStartThunk), this);
- g_signal_connect(context_, "preedit-end",
- G_CALLBACK(HandlePreeditEndThunk), this);
- g_signal_connect(context_, "preedit-changed",
- G_CALLBACK(HandlePreeditChangedThunk), this);
- g_signal_connect(context_, "commit",
- G_CALLBACK(HandleCommitThunk), this);
- g_signal_connect(context_, "retrieve-surrounding",
- G_CALLBACK(HandleRetrieveSurroundingThunk), this);
-
- g_signal_connect(context_simple_, "preedit-start",
- G_CALLBACK(HandlePreeditStartThunk), this);
- g_signal_connect(context_simple_, "preedit-end",
- G_CALLBACK(HandlePreeditEndThunk), this);
- g_signal_connect(context_simple_, "preedit-changed",
- G_CALLBACK(HandlePreeditChangedThunk), this);
- g_signal_connect(context_simple_, "commit",
- G_CALLBACK(HandleCommitThunk), this);
- g_signal_connect(context_simple_, "retrieve-surrounding",
- G_CALLBACK(HandleRetrieveSurroundingThunk), this);
-
- GtkWidget* widget = host_view->GetNativeView();
- DCHECK(widget);
-
- g_signal_connect(widget, "realize",
- G_CALLBACK(HandleHostViewRealizeThunk), this);
- g_signal_connect(widget, "unrealize",
- G_CALLBACK(HandleHostViewUnrealizeThunk), this);
-
- // Set client window if the widget is already realized.
- HandleHostViewRealize(widget);
-}
-
-GtkIMContextWrapper::~GtkIMContextWrapper() {
- if (context_)
- g_object_unref(context_);
- if (context_simple_)
- g_object_unref(context_simple_);
-}
-
-void GtkIMContextWrapper::ProcessKeyEvent(GdkEventKey* event) {
- suppress_next_commit_ = false;
-
- // Indicates preedit-changed and commit signal handlers that we are
- // processing a key event.
- is_in_key_event_handler_ = true;
- // Reset this flag so that we can know if preedit is changed after
- // processing this key event.
- is_composition_changed_ = false;
- // Clear it so that we can know if something needs committing after
- // processing this key event.
- commit_text_.clear();
-
- // According to Document Object Model (DOM) Level 3 Events Specification
- // Appendix A: Keyboard events and key identifiers
- // http://www.w3.org/TR/DOM-Level-3-Events/keyset.html:
- // The event sequence would be:
- // 1. keydown
- // 2. textInput
- // 3. keyup
- //
- // So keydown must be sent to webkit before sending input method result,
- // while keyup must be sent afterwards.
- // However on Windows, if a keydown event has been processed by IME, its
- // virtual keycode will be changed to VK_PROCESSKEY(0xE5) before being sent
- // to application.
- // To emulate the windows behavior as much as possible, we need to send the
- // key event to the GtkIMContext object first, and decide whether or not to
- // send the original key event to webkit according to the result from IME.
- //
- // If IME is enabled by WebKit, this event will be dispatched to context_
- // to get full IME support. Otherwise it'll be dispatched to
- // context_simple_, so that dead/compose keys can still work.
- //
- // It sends a "commit" signal when it has a character to be inserted
- // even when we use a US keyboard so that we can send a Char event
- // (or an IME event) to the renderer in our "commit"-signal handler.
- // We should send a KeyDown (or a KeyUp) event before dispatching this
- // event to the GtkIMContext object (and send a Char event) so that WebKit
- // can dispatch the JavaScript events in the following order: onkeydown(),
- // onkeypress(), and onkeyup(). (Many JavaScript pages assume this.)
- gboolean filtered = false;
- if (is_enabled_) {
- filtered = gtk_im_context_filter_keypress(context_, event);
- } else {
- filtered = gtk_im_context_filter_keypress(context_simple_, event);
- }
-
- // Reset this flag here, as it's only used in input method callbacks.
- is_in_key_event_handler_ = false;
-
- NativeWebKeyboardEvent wke(reinterpret_cast<GdkEvent*>(event));
-
- // If the key event was handled by the input method, then we need to prevent
- // RenderView::UnhandledKeyboardEvent() from processing it.
- // Otherwise unexpected result may occur. For example if it's a
- // Backspace key event, the browser may go back to previous page.
- // We just send all keyup events to the browser to avoid breaking the
- // browser's MENU key function, which is actually the only keyup event
- // handled in the browser.
- if (filtered && event->type == GDK_KEY_PRESS)
- wke.skip_in_browser = true;
-
- const int key_code = wke.windowsKeyCode;
- const bool has_result = HasInputMethodResult();
-
- // Send filtered keydown event before sending IME result.
- // In order to workaround http://crosbug.com/6582, we only send a filtered
- // keydown event if it generated any input method result.
- if (event->type == GDK_KEY_PRESS && filtered && has_result)
- ProcessFilteredKeyPressEvent(&wke);
-
- // Send IME results. In most cases, it's only available if the key event
- // is filtered by IME. But in rare cases, an unfiltered key event may also
- // generate IME results.
- // Any IME results generated by a unfiltered key down event must be sent
- // before the key down event, to avoid some tricky issues. For example,
- // when using latin-post input method, pressing 'a' then Backspace, may
- // generate following events in sequence:
- // 1. keydown 'a' (filtered)
- // 2. preedit changed to "a"
- // 3. keyup 'a' (unfiltered)
- // 4. keydown Backspace (unfiltered)
- // 5. commit "a"
- // 6. preedit end
- // 7. keyup Backspace (unfiltered)
- //
- // In this case, the input box will be in a strange state if keydown
- // Backspace is sent to webkit before commit "a" and preedit end.
- if (has_result)
- ProcessInputMethodResult(event, filtered);
-
- // Send unfiltered keydown and keyup events after sending IME result.
- if (event->type == GDK_KEY_PRESS && !filtered) {
- ProcessUnfilteredKeyPressEvent(&wke);
- } else if (event->type == GDK_KEY_RELEASE) {
- // In order to workaround http://crosbug.com/6582, we need to suppress
- // the keyup event if corresponding keydown event was suppressed, or
- // the last key event was a keyup event with the same keycode.
- const bool suppress = (last_key_code_ == key_code) &&
- (last_key_was_up_ || last_key_filtered_no_result_);
-
- if (!suppress)
- host_view_->ForwardKeyboardEvent(wke);
- }
-
- last_key_code_ = key_code;
- last_key_was_up_ = (event->type == GDK_KEY_RELEASE);
- last_key_filtered_no_result_ = (filtered && !has_result);
-}
-
-void GtkIMContextWrapper::UpdateInputMethodState(
- ui::TextInputType type,
- bool can_compose_inline) {
- suppress_next_commit_ = false;
-
- // The renderer has updated its IME status.
- // Control the GtkIMContext object according to this status.
- if (!context_)
- return;
-
- DCHECK(!is_in_key_event_handler_);
-
- bool is_enabled = (type != ui::TEXT_INPUT_TYPE_NONE &&
- type != ui::TEXT_INPUT_TYPE_PASSWORD);
- if (is_enabled_ != is_enabled) {
- is_enabled_ = is_enabled;
- if (is_enabled && is_focused_)
- gtk_im_context_focus_in(context_);
- else
- gtk_im_context_focus_out(context_);
- }
-
- if (is_enabled) {
- // If the focused element supports inline rendering of composition text,
- // we receive and send related events to it. Otherwise, the events related
- // to the updates of composition text are directed to the candidate window.
- gtk_im_context_set_use_preedit(context_, can_compose_inline);
- }
-}
-
-void GtkIMContextWrapper::UpdateCaretBounds(
- const gfx::Rect& caret_bounds) {
- if (is_enabled_) {
- // Updates the position of the IME candidate window.
- // The position sent from the renderer is a relative one, so we need to
- // attach the GtkIMContext object to this window before changing the
- // position.
- GdkRectangle cursor_rect(caret_bounds.ToGdkRectangle());
- gtk_im_context_set_cursor_location(context_, &cursor_rect);
- }
-}
-
-void GtkIMContextWrapper::OnFocusIn() {
- if (is_focused_)
- return;
-
- // Tracks the focused state so that we can give focus to the
- // GtkIMContext object correctly later when IME is enabled by WebKit.
- is_focused_ = true;
-
- last_key_code_ = 0;
- last_key_was_up_ = false;
- last_key_filtered_no_result_ = false;
-
- // Notify the GtkIMContext object of this focus-in event only if IME is
- // enabled by WebKit.
- if (is_enabled_)
- gtk_im_context_focus_in(context_);
-
- // context_simple_ is always enabled.
- // Actually it doesn't care focus state at all.
- gtk_im_context_focus_in(context_simple_);
-
- // Enables RenderWidget's IME related events, so that we can be notified
- // when WebKit wants to enable or disable IME.
- if (host_view_->GetRenderWidgetHost()) {
- RenderWidgetHostImpl::From(
- host_view_->GetRenderWidgetHost())->SetInputMethodActive(true);
- }
-}
-
-void GtkIMContextWrapper::OnFocusOut() {
- if (!is_focused_)
- return;
-
- // Tracks the focused state so that we won't give focus to the
- // GtkIMContext object unexpectly.
- is_focused_ = false;
-
- // Notify the GtkIMContext object of this focus-out event only if IME is
- // enabled by WebKit.
- if (is_enabled_) {
- // To reset the GtkIMContext object and prevent data loss.
- ConfirmComposition();
- gtk_im_context_focus_out(context_);
- }
-
- // To make sure it'll be in correct state when focused in again.
- gtk_im_context_reset(context_simple_);
- gtk_im_context_focus_out(context_simple_);
-
- is_composing_text_ = false;
-
- // Disable RenderWidget's IME related events to save bandwidth.
- if (host_view_->GetRenderWidgetHost()) {
- RenderWidgetHostImpl::From(
- host_view_->GetRenderWidgetHost())->SetInputMethodActive(false);
- }
-}
-
-GtkWidget* GtkIMContextWrapper::BuildInputMethodsGtkMenu() {
- GtkWidget* submenu = gtk_menu_new();
- gtk_im_multicontext_append_menuitems(GTK_IM_MULTICONTEXT(context_),
- GTK_MENU_SHELL(submenu));
- return submenu;
-}
-
-void GtkIMContextWrapper::CancelComposition() {
- if (!is_enabled_)
- return;
-
- DCHECK(!is_in_key_event_handler_);
-
- // To prevent any text from being committed when resetting the |context_|;
- is_in_key_event_handler_ = true;
- suppress_next_commit_ = true;
-
- gtk_im_context_reset(context_);
- gtk_im_context_reset(context_simple_);
-
- if (is_focused_) {
- // Some input methods may not honour the reset call. Focusing out/in the
- // |context_| to make sure it gets reset correctly.
- gtk_im_context_focus_out(context_);
- gtk_im_context_focus_in(context_);
- }
-
- is_composing_text_ = false;
- composition_.Clear();
- commit_text_.clear();
-
- is_in_key_event_handler_ = false;
-}
-
-bool GtkIMContextWrapper::NeedCommitByForwardingCharEvent() const {
- // If there is no composition text and has only one character to be
- // committed, then the character will be send to webkit as a Char event
- // instead of a confirmed composition text.
- // It should be fine to handle BMP character only, as non-BMP characters
- // can always be committed as confirmed composition text.
- return !is_composing_text_ && commit_text_.length() == 1;
-}
-
-bool GtkIMContextWrapper::HasInputMethodResult() const {
- return commit_text_.length() || is_composition_changed_;
-}
-
-void GtkIMContextWrapper::ProcessFilteredKeyPressEvent(
- NativeWebKeyboardEvent* wke) {
- // If IME has filtered this event, then replace virtual key code with
- // VK_PROCESSKEY. See comment in ProcessKeyEvent() for details.
- // It's only required for keydown events.
- // To emulate windows behavior, when input method is enabled, if the commit
- // text can be emulated by a Char event, then don't do this replacement.
- if (!NeedCommitByForwardingCharEvent()) {
- wke->windowsKeyCode = kCompositionEventKeyCode;
- // keyidentifier must be updated accordingly, otherwise this key event may
- // still be processed by webkit.
- wke->setKeyIdentifierFromWindowsKeyCode();
- }
- host_view_->ForwardKeyboardEvent(*wke);
-}
-
-void GtkIMContextWrapper::ProcessUnfilteredKeyPressEvent(
- NativeWebKeyboardEvent* wke) {
- // Send keydown event as it, because it's not filtered by IME.
- host_view_->ForwardKeyboardEvent(*wke);
-
- // IME is disabled by WebKit or the GtkIMContext object cannot handle
- // this key event.
- // This case is caused by two reasons:
- // 1. The given key event is a control-key event, (e.g. return, page up,
- // page down, tab, arrows, etc.) or;
- // 2. The given key event is not a control-key event but printable
- // characters aren't assigned to the event, (e.g. alt+d, etc.)
- // Create a Char event manually from this key event and send it to the
- // renderer when this Char event contains a printable character which
- // should be processed by WebKit.
- // isSystemKey will be set to true if this key event has Alt modifier,
- // see WebInputEventFactory::keyboardEvent() for details.
- if (wke->text[0]) {
- wke->type = blink::WebInputEvent::Char;
- wke->skip_in_browser = true;
- host_view_->ForwardKeyboardEvent(*wke);
- }
-}
-
-void GtkIMContextWrapper::ProcessInputMethodResult(const GdkEventKey* event,
- bool filtered) {
- RenderWidgetHostImpl* host = RenderWidgetHostImpl::From(
- host_view_->GetRenderWidgetHost());
- if (!host)
- return;
-
- bool committed = false;
- // We do commit before preedit change, so that we can optimize some
- // unnecessary preedit changes.
- if (commit_text_.length()) {
- if (filtered && NeedCommitByForwardingCharEvent()) {
- // Send a Char event when we input a composed character without IMEs
- // so that this event is to be dispatched to onkeypress() handlers,
- // autofill, etc.
- // Only commit text generated by a filtered key down event can be sent
- // as a Char event, because a unfiltered key down event will probably
- // generate another Char event.
- // TODO(james.su@gmail.com): Is it necessary to support non BMP chars
- // here?
- NativeWebKeyboardEvent char_event(commit_text_[0],
- event->state,
- base::Time::Now().ToDoubleT());
- char_event.skip_in_browser = true;
- host_view_->ForwardKeyboardEvent(char_event);
- } else {
- committed = true;
- // Send an IME event.
- // Unlike a Char event, an IME event is NOT dispatched to onkeypress()
- // handlers or autofill.
- host->ImeConfirmComposition(
- commit_text_,gfx::Range::InvalidRange(),false);
- // Set this flag to false, as this composition session has been
- // finished.
- is_composing_text_ = false;
- }
- }
-
- // Send preedit text only if it's changed.
- // If a text has been committed, then we don't need to send the empty
- // preedit text again.
- if (is_composition_changed_) {
- if (composition_.text.length()) {
- // Another composition session has been started.
- is_composing_text_ = true;
- // TODO(suzhe): convert both renderer_host and renderer to use
- // ui::CompositionText.
- const std::vector<blink::WebCompositionUnderline>& underlines =
- reinterpret_cast<const std::vector<blink::WebCompositionUnderline>&>(
- composition_.underlines);
- host->ImeSetComposition(composition_.text, underlines,
- composition_.selection.start(),
- composition_.selection.end());
- } else if (!committed) {
- host->ImeCancelComposition();
- }
- }
-}
-
-void GtkIMContextWrapper::ConfirmComposition() {
- if (!is_enabled_)
- return;
-
- DCHECK(!is_in_key_event_handler_);
-
- if (is_composing_text_) {
- if (host_view_->GetRenderWidgetHost()) {
- RenderWidgetHostImpl::From(
- host_view_->GetRenderWidgetHost())->ImeConfirmComposition(
- base::string16(), gfx::Range::InvalidRange(), false);
- }
-
- // Reset the input method.
- CancelComposition();
- }
-}
-
-void GtkIMContextWrapper::HandleCommit(const base::string16& text) {
- if (suppress_next_commit_)
- return;
-
- // Append the text to the buffer, because commit signal might be fired
- // multiple times when processing a key event.
- commit_text_.append(text);
- // Nothing needs to do, if it's currently in ProcessKeyEvent()
- // handler, which will send commit text to webkit later. Otherwise,
- // we need send it here.
- // It's possible that commit signal is fired without a key event, for
- // example when user input via a voice or handwriting recognition software.
- // In this case, the text must be committed directly.
- if (!is_in_key_event_handler_ && host_view_->GetRenderWidgetHost()) {
- // Workaround http://crbug.com/45478 by sending fake key down/up events.
- SendFakeCompositionKeyEvent(blink::WebInputEvent::RawKeyDown);
- RenderWidgetHostImpl::From(
- host_view_->GetRenderWidgetHost())->ImeConfirmComposition(
- text, gfx::Range::InvalidRange(), false);
- SendFakeCompositionKeyEvent(blink::WebInputEvent::KeyUp);
- }
-}
-
-void GtkIMContextWrapper::HandlePreeditStart() {
- // Ignore preedit related signals triggered by CancelComposition() method.
- if (suppress_next_commit_)
- return;
- is_composing_text_ = true;
-}
-
-void GtkIMContextWrapper::HandlePreeditChanged(const gchar* text,
- PangoAttrList* attrs,
- int cursor_position) {
- // Ignore preedit related signals triggered by CancelComposition() method.
- if (suppress_next_commit_)
- return;
-
- // Don't set is_composition_changed_ to false if there is no change, because
- // this handler might be called multiple times with the same data.
- is_composition_changed_ = true;
- composition_.Clear();
-
- ui::ExtractCompositionTextFromGtkPreedit(text, attrs, cursor_position,
- &composition_);
-
- // TODO(suzhe): due to a bug of webkit, we currently can't use selection range
- // with composition string. See: https://bugs.webkit.org/show_bug.cgi?id=40805
- composition_.selection = gfx::Range(cursor_position);
-
- // In case we are using a buggy input method which doesn't fire
- // "preedit_start" signal.
- if (composition_.text.length())
- is_composing_text_ = true;
-
- // Nothing needs to do, if it's currently in ProcessKeyEvent()
- // handler, which will send preedit text to webkit later.
- // Otherwise, we need send it here if it's been changed.
- if (!is_in_key_event_handler_ && is_composing_text_ &&
- host_view_->GetRenderWidgetHost()) {
- // Workaround http://crbug.com/45478 by sending fake key down/up events.
- SendFakeCompositionKeyEvent(blink::WebInputEvent::RawKeyDown);
- // TODO(suzhe): convert both renderer_host and renderer to use
- // ui::CompositionText.
- const std::vector<blink::WebCompositionUnderline>& underlines =
- reinterpret_cast<const std::vector<blink::WebCompositionUnderline>&>(
- composition_.underlines);
- RenderWidgetHostImpl::From(
- host_view_->GetRenderWidgetHost())->ImeSetComposition(
- composition_.text, underlines, composition_.selection.start(),
- composition_.selection.end());
- SendFakeCompositionKeyEvent(blink::WebInputEvent::KeyUp);
- }
-}
-
-void GtkIMContextWrapper::HandlePreeditEnd() {
- if (composition_.text.length()) {
- // The composition session has been finished.
- composition_.Clear();
- is_composition_changed_ = true;
-
- // If there is still a preedit text when firing "preedit-end" signal,
- // we need inform webkit to clear it.
- // It's only necessary when it's not in ProcessKeyEvent ().
- if (!is_in_key_event_handler_ && host_view_->GetRenderWidgetHost()) {
- RenderWidgetHostImpl::From(
- host_view_->GetRenderWidgetHost())->ImeCancelComposition();
- }
- }
-
- // Don't set is_composing_text_ to false here, because "preedit_end"
- // signal may be fired before "commit" signal.
-}
-
-gboolean GtkIMContextWrapper::HandleRetrieveSurrounding(GtkIMContext* context) {
- if (!is_enabled_)
- return TRUE;
-
- std::string text;
- size_t cursor_index = 0;
-
- if (!is_enabled_ || !host_view_->RetrieveSurrounding(&text, &cursor_index)) {
- gtk_im_context_set_surrounding(context, "", 0, 0);
- return TRUE;
- }
-
- gtk_im_context_set_surrounding(context, text.c_str(), text.length(),
- cursor_index);
-
- return TRUE;
-}
-
-void GtkIMContextWrapper::HandleHostViewRealize(GtkWidget* widget) {
- // We should only set im context's client window once, because when setting
- // client window.im context may destroy and recreate its internal states and
- // objects.
- GdkWindow* gdk_window = gtk_widget_get_window(widget);
- if (gdk_window) {
- gtk_im_context_set_client_window(context_, gdk_window);
- gtk_im_context_set_client_window(context_simple_, gdk_window);
- }
-}
-
-void GtkIMContextWrapper::HandleHostViewUnrealize() {
- gtk_im_context_set_client_window(context_, NULL);
- gtk_im_context_set_client_window(context_simple_, NULL);
-}
-
-void GtkIMContextWrapper::SendFakeCompositionKeyEvent(
- blink::WebInputEvent::Type type) {
- NativeWebKeyboardEvent fake_event;
- fake_event.windowsKeyCode = kCompositionEventKeyCode;
- fake_event.skip_in_browser = true;
- fake_event.type = type;
- host_view_->ForwardKeyboardEvent(fake_event);
-}
-
-void GtkIMContextWrapper::HandleCommitThunk(
- GtkIMContext* context, gchar* text, GtkIMContextWrapper* self) {
- self->HandleCommit(base::UTF8ToUTF16(text));
-}
-
-void GtkIMContextWrapper::HandlePreeditStartThunk(
- GtkIMContext* context, GtkIMContextWrapper* self) {
- self->HandlePreeditStart();
-}
-
-void GtkIMContextWrapper::HandlePreeditChangedThunk(
- GtkIMContext* context, GtkIMContextWrapper* self) {
- gchar* text = NULL;
- PangoAttrList* attrs = NULL;
- gint cursor_position = 0;
- gtk_im_context_get_preedit_string(context, &text, &attrs, &cursor_position);
- self->HandlePreeditChanged(text, attrs, cursor_position);
- g_free(text);
- pango_attr_list_unref(attrs);
-}
-
-void GtkIMContextWrapper::HandlePreeditEndThunk(
- GtkIMContext* context, GtkIMContextWrapper* self) {
- self->HandlePreeditEnd();
-}
-
-gboolean GtkIMContextWrapper::HandleRetrieveSurroundingThunk(
- GtkIMContext* context, GtkIMContextWrapper* self) {
- return self->HandleRetrieveSurrounding(context);
-}
-
-void GtkIMContextWrapper::HandleHostViewRealizeThunk(
- GtkWidget* widget, GtkIMContextWrapper* self) {
- self->HandleHostViewRealize(widget);
-}
-
-void GtkIMContextWrapper::HandleHostViewUnrealizeThunk(
- GtkWidget* widget, GtkIMContextWrapper* self) {
- self->HandleHostViewUnrealize();
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/gtk_im_context_wrapper.h b/content/browser/renderer_host/gtk_im_context_wrapper.h
deleted file mode 100644
index 8bd027f..0000000
--- a/content/browser/renderer_host/gtk_im_context_wrapper.h
+++ /dev/null
@@ -1,201 +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.
-
-#ifndef CONTENT_BROWSER_RENDERER_HOST_GTK_IM_CONTEXT_WRAPPER_H_
-#define CONTENT_BROWSER_RENDERER_HOST_GTK_IM_CONTEXT_WRAPPER_H_
-
-#include <gdk/gdk.h>
-#include <pango/pango-attributes.h>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/gtest_prod_util.h"
-#include "base/strings/string16.h"
-#include "third_party/WebKit/public/web/WebInputEvent.h"
-#include "ui/base/ime/composition_text.h"
-#include "ui/base/ime/text_input_type.h"
-
-typedef struct _GtkIMContext GtkIMContext;
-typedef struct _GtkWidget GtkWidget;
-
-namespace gfx {
-class Rect;
-}
-
-namespace content {
-class RenderWidgetHostViewGtk;
-struct NativeWebKeyboardEvent;
-
-// This class is a convenience wrapper for GtkIMContext.
-// It creates and manages two GtkIMContext instances, one is GtkIMMulticontext,
-// for plain text input box, another is GtkIMContextSimple, for password input
-// box.
-//
-// This class is in charge of dispatching key events to these two GtkIMContext
-// instances and handling signals emitted by them. Key events then will be
-// forwarded to renderer along with input method results via corresponding host
-// view.
-//
-// This class is used solely by RenderWidgetHostViewGtk.
-class GtkIMContextWrapper {
- public:
- explicit GtkIMContextWrapper(RenderWidgetHostViewGtk* host_view);
- ~GtkIMContextWrapper();
-
- // Processes a gdk key event received by |host_view|.
- void ProcessKeyEvent(GdkEventKey* event);
-
- void UpdateInputMethodState(ui::TextInputType type,
- bool can_compose_inline);
- void UpdateCaretBounds(const gfx::Rect& caret_bounds);
- void OnFocusIn();
- void OnFocusOut();
- bool is_focused() const { return is_focused_; }
-
- GtkWidget* BuildInputMethodsGtkMenu();
-
- void CancelComposition();
-
- void ConfirmComposition();
-
- private:
- // Check if a text needs commit by forwarding a char event instead of
- // by confirming as a composition text.
- bool NeedCommitByForwardingCharEvent() const;
-
- // Check if the input method returned any result, eg. preedit and commit text.
- bool HasInputMethodResult() const;
-
- void ProcessFilteredKeyPressEvent(NativeWebKeyboardEvent* wke);
- void ProcessUnfilteredKeyPressEvent(NativeWebKeyboardEvent* wke);
-
- // Processes result returned from input method after filtering a key event.
- // |filtered| indicates if the key event was filtered by the input method.
- void ProcessInputMethodResult(const GdkEventKey* event, bool filtered);
-
- // Real code of "commit" signal handler.
- void HandleCommit(const base::string16& text);
-
- // Real code of "preedit-start" signal handler.
- void HandlePreeditStart();
-
- // Real code of "preedit-changed" signal handler.
- void HandlePreeditChanged(const gchar* text,
- PangoAttrList* attrs,
- int cursor_position);
-
- // Real code of "preedit-end" signal handler.
- void HandlePreeditEnd();
-
- // Real code of "retrieve-surrounding" signal handler.
- gboolean HandleRetrieveSurrounding(GtkIMContext* context);
-
- // Real code of "realize" signal handler, used for setting im context's client
- // window.
- void HandleHostViewRealize(GtkWidget* widget);
-
- // Real code of "unrealize" signal handler, used for unsetting im context's
- // client window.
- void HandleHostViewUnrealize();
-
- // Sends a fake composition key event with specified event type. A composition
- // key event is a key event with special key code 229.
- void SendFakeCompositionKeyEvent(blink::WebInputEvent::Type type);
-
- // Signal handlers of GtkIMContext object.
- static void HandleCommitThunk(GtkIMContext* context, gchar* text,
- GtkIMContextWrapper* self);
- static void HandlePreeditStartThunk(GtkIMContext* context,
- GtkIMContextWrapper* self);
- static void HandlePreeditChangedThunk(GtkIMContext* context,
- GtkIMContextWrapper* self);
- static void HandlePreeditEndThunk(GtkIMContext* context,
- GtkIMContextWrapper* self);
- static gboolean HandleRetrieveSurroundingThunk(GtkIMContext* context,
- GtkIMContextWrapper* self);
-
- // Signal handlers connecting to |host_view_|'s native view widget.
- static void HandleHostViewRealizeThunk(GtkWidget* widget,
- GtkIMContextWrapper* self);
- static void HandleHostViewUnrealizeThunk(GtkWidget* widget,
- GtkIMContextWrapper* self);
-
- // The parent object.
- RenderWidgetHostViewGtk* host_view_;
-
- // The GtkIMContext object.
- // In terms of the DOM event specification Appendix A
- // <http://www.w3.org/TR/DOM-Level-3-Events/keyset.html>,
- // GTK uses a GtkIMContext object for the following two purposes:
- // 1. Composing Latin characters (A.1.2), and;
- // 2. Composing CJK characters with an IME (A.1.3).
- // Many JavaScript pages assume composed Latin characters are dispatched to
- // their onkeypress() handlers but not dispatched CJK characters composed
- // with an IME. To emulate this behavior, we should monitor the status of
- // this GtkIMContext object and prevent sending Char events when a
- // GtkIMContext object sends a "commit" signal with the CJK characters
- // composed by an IME.
- GtkIMContext* context_;
-
- // A GtkIMContextSimple object, for supporting dead/compose keys when input
- // method is disabled, eg. in password input box.
- GtkIMContext* context_simple_;
-
- // Whether or not this widget is focused.
- bool is_focused_;
-
- // Whether or not the above GtkIMContext is composing a text with an IME.
- // This flag is used in "commit" signal handler of the GtkIMContext object,
- // which determines how to submit the result text to WebKit according to this
- // flag.
- // If this flag is true or there are more than one characters in the result,
- // then the result text will be committed to WebKit as a confirmed
- // composition. Otherwise, it'll be forwarded as a key event.
- //
- // The GtkIMContext object sends a "preedit_start" before it starts composing
- // a text and a "preedit_end" signal after it finishes composing it.
- // "preedit_start" signal is monitored to turn it on.
- // We don't monitor "preedit_end" signal to turn it off, because an input
- // method may fire "preedit_end" signal before "commit" signal.
- // A buggy input method may not fire "preedit_start" and/or "preedit_end"
- // at all, so this flag will also be set to true when "preedit_changed" signal
- // is fired with non-empty preedit text.
- bool is_composing_text_;
-
- // Whether or not the IME is enabled.
- bool is_enabled_;
-
- // Whether or not it's currently running inside key event handler.
- // If it's true, then preedit-changed and commit handler will backup the
- // preedit or commit text instead of sending them down to webkit.
- // key event handler will send them later.
- bool is_in_key_event_handler_;
-
- // The most recent composition text information retrieved from context_;
- ui::CompositionText composition_;
-
- // Whether or not the composition has been changed since last key event.
- bool is_composition_changed_;
-
- // Stores a copy of the most recent commit text received by commit signal
- // handler.
- base::string16 commit_text_;
-
- // If it's true then the next "commit" signal will be suppressed.
- // It's only used to workaround http://crbug.com/50485.
- // TODO(suzhe): Remove it after input methods get fixed.
- bool suppress_next_commit_;
-
- // Information of the last key event, for working around
- // http://crosbug.com/6582
- int last_key_code_;
- bool last_key_was_up_;
- bool last_key_filtered_no_result_;
-
- DISALLOW_COPY_AND_ASSIGN(GtkIMContextWrapper);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_RENDERER_HOST_GTK_IM_CONTEXT_WRAPPER_H_
diff --git a/content/browser/renderer_host/gtk_key_bindings_handler.cc b/content/browser/renderer_host/gtk_key_bindings_handler.cc
deleted file mode 100644
index 3830364..0000000
--- a/content/browser/renderer_host/gtk_key_bindings_handler.cc
+++ /dev/null
@@ -1,293 +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/renderer_host/gtk_key_bindings_handler.h"
-
-#include <gdk/gdkkeysyms.h>
-
-#include <string>
-
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "content/public/browser/native_web_keyboard_event.h"
-
-namespace content {
-
-GtkKeyBindingsHandler::GtkKeyBindingsHandler(GtkWidget* parent_widget)
- : handler_(CreateNewHandler()) {
- DCHECK(GTK_IS_FIXED(parent_widget));
- // We need add the |handler_| object into gtk widget hierarchy, so that
- // gtk_bindings_activate_event() can find correct display and keymaps from
- // the |handler_| object.
- gtk_fixed_put(GTK_FIXED(parent_widget), handler_.get(), -1, -1);
-}
-
-GtkKeyBindingsHandler::~GtkKeyBindingsHandler() {
- handler_.Destroy();
-}
-
-bool GtkKeyBindingsHandler::Match(const NativeWebKeyboardEvent& wke,
- EditCommands* edit_commands) {
- if (wke.type == blink::WebInputEvent::Char || !wke.os_event)
- return false;
-
- edit_commands_.clear();
- // If this key event matches a predefined key binding, corresponding signal
- // will be emitted.
- gtk_bindings_activate_event(GTK_OBJECT(handler_.get()), &wke.os_event->key);
-
- bool matched = !edit_commands_.empty();
- if (edit_commands)
- edit_commands->swap(edit_commands_);
- return matched;
-}
-
-GtkWidget* GtkKeyBindingsHandler::CreateNewHandler() {
- Handler* handler =
- static_cast<Handler*>(g_object_new(HandlerGetType(), NULL));
-
- handler->owner = this;
-
- // We don't need to show the |handler| object on screen, so set its size to
- // zero.
- gtk_widget_set_size_request(GTK_WIDGET(handler), 0, 0);
-
- // Prevents it from handling any events by itself.
- gtk_widget_set_sensitive(GTK_WIDGET(handler), FALSE);
- gtk_widget_set_events(GTK_WIDGET(handler), 0);
- gtk_widget_set_can_focus(GTK_WIDGET(handler), TRUE);
-
- return GTK_WIDGET(handler);
-}
-
-void GtkKeyBindingsHandler::EditCommandMatched(
- const std::string& name, const std::string& value) {
- edit_commands_.push_back(EditCommand(name, value));
-}
-
-void GtkKeyBindingsHandler::HandlerInit(Handler *self) {
- self->owner = NULL;
-}
-
-void GtkKeyBindingsHandler::HandlerClassInit(HandlerClass *klass) {
- GtkTextViewClass* text_view_class = GTK_TEXT_VIEW_CLASS(klass);
- GtkWidgetClass* widget_class = GTK_WIDGET_CLASS(klass);
-
- // Overrides all virtual methods related to editor key bindings.
- text_view_class->backspace = BackSpace;
- text_view_class->copy_clipboard = CopyClipboard;
- text_view_class->cut_clipboard = CutClipboard;
- text_view_class->delete_from_cursor = DeleteFromCursor;
- text_view_class->insert_at_cursor = InsertAtCursor;
- text_view_class->move_cursor = MoveCursor;
- text_view_class->paste_clipboard = PasteClipboard;
- text_view_class->set_anchor = SetAnchor;
- text_view_class->toggle_overwrite = ToggleOverwrite;
- widget_class->show_help = ShowHelp;
-
- // "move-focus", "move-viewport", "select-all" and "toggle-cursor-visible"
- // have no corresponding virtual methods. Since glib 2.18 (gtk 2.14),
- // g_signal_override_class_handler() is introduced to override a signal
- // handler.
- g_signal_override_class_handler("move-focus",
- G_TYPE_FROM_CLASS(klass),
- G_CALLBACK(MoveFocus));
-
- g_signal_override_class_handler("move-viewport",
- G_TYPE_FROM_CLASS(klass),
- G_CALLBACK(MoveViewport));
-
- g_signal_override_class_handler("select-all",
- G_TYPE_FROM_CLASS(klass),
- G_CALLBACK(SelectAll));
-
- g_signal_override_class_handler("toggle-cursor-visible",
- G_TYPE_FROM_CLASS(klass),
- G_CALLBACK(ToggleCursorVisible));
-}
-
-GType GtkKeyBindingsHandler::HandlerGetType() {
- static volatile gsize type_id_volatile = 0;
- if (g_once_init_enter(&type_id_volatile)) {
- GType type_id = g_type_register_static_simple(
- GTK_TYPE_TEXT_VIEW,
- g_intern_static_string("GtkKeyBindingsHandler"),
- sizeof(HandlerClass),
- reinterpret_cast<GClassInitFunc>(HandlerClassInit),
- sizeof(Handler),
- reinterpret_cast<GInstanceInitFunc>(HandlerInit),
- static_cast<GTypeFlags>(0));
- g_once_init_leave(&type_id_volatile, type_id);
- }
- return type_id_volatile;
-}
-
-GtkKeyBindingsHandler* GtkKeyBindingsHandler::GetHandlerOwner(
- GtkTextView* text_view) {
- Handler* handler = G_TYPE_CHECK_INSTANCE_CAST(
- text_view, HandlerGetType(), Handler);
- DCHECK(handler);
- return handler->owner;
-}
-
-void GtkKeyBindingsHandler::BackSpace(GtkTextView* text_view) {
- GetHandlerOwner(text_view)
- ->EditCommandMatched("DeleteBackward", std::string());
-}
-
-void GtkKeyBindingsHandler::CopyClipboard(GtkTextView* text_view) {
- GetHandlerOwner(text_view)->EditCommandMatched("Copy", std::string());
-}
-
-void GtkKeyBindingsHandler::CutClipboard(GtkTextView* text_view) {
- GetHandlerOwner(text_view)->EditCommandMatched("Cut", std::string());
-}
-
-void GtkKeyBindingsHandler::DeleteFromCursor(
- GtkTextView* text_view, GtkDeleteType type, gint count) {
- if (!count)
- return;
-
- const char *commands[3] = { NULL, NULL, NULL };
- switch (type) {
- case GTK_DELETE_CHARS:
- commands[0] = (count > 0 ? "DeleteForward" : "DeleteBackward");
- break;
- case GTK_DELETE_WORD_ENDS:
- commands[0] = (count > 0 ? "DeleteWordForward" : "DeleteWordBackward");
- break;
- case GTK_DELETE_WORDS:
- if (count > 0) {
- commands[0] = "MoveWordForward";
- commands[1] = "DeleteWordBackward";
- } else {
- commands[0] = "MoveWordBackward";
- commands[1] = "DeleteWordForward";
- }
- break;
- case GTK_DELETE_DISPLAY_LINES:
- commands[0] = "MoveToBeginningOfLine";
- commands[1] = "DeleteToEndOfLine";
- break;
- case GTK_DELETE_DISPLAY_LINE_ENDS:
- commands[0] = (count > 0 ? "DeleteToEndOfLine" :
- "DeleteToBeginningOfLine");
- break;
- case GTK_DELETE_PARAGRAPH_ENDS:
- commands[0] = (count > 0 ? "DeleteToEndOfParagraph" :
- "DeleteToBeginningOfParagraph");
- break;
- case GTK_DELETE_PARAGRAPHS:
- commands[0] = "MoveToBeginningOfParagraph";
- commands[1] = "DeleteToEndOfParagraph";
- break;
- default:
- // GTK_DELETE_WHITESPACE has no corresponding editor command.
- return;
- }
-
- GtkKeyBindingsHandler* owner = GetHandlerOwner(text_view);
- if (count < 0)
- count = -count;
- for (; count > 0; --count) {
- for (const char* const* p = commands; *p; ++p)
- owner->EditCommandMatched(*p, std::string());
- }
-}
-
-void GtkKeyBindingsHandler::InsertAtCursor(GtkTextView* text_view,
- const gchar* str) {
- if (str && *str)
- GetHandlerOwner(text_view)->EditCommandMatched("InsertText", str);
-}
-
-void GtkKeyBindingsHandler::MoveCursor(
- GtkTextView* text_view, GtkMovementStep step, gint count,
- gboolean extend_selection) {
- if (!count)
- return;
-
- std::string command;
- switch (step) {
- case GTK_MOVEMENT_LOGICAL_POSITIONS:
- command = (count > 0 ? "MoveForward" : "MoveBackward");
- break;
- case GTK_MOVEMENT_VISUAL_POSITIONS:
- command = (count > 0 ? "MoveRight" : "MoveLeft");
- break;
- case GTK_MOVEMENT_WORDS:
- command = (count > 0 ? "MoveWordRight" : "MoveWordLeft");
- break;
- case GTK_MOVEMENT_DISPLAY_LINES:
- command = (count > 0 ? "MoveDown" : "MoveUp");
- break;
- case GTK_MOVEMENT_DISPLAY_LINE_ENDS:
- command = (count > 0 ? "MoveToEndOfLine" : "MoveToBeginningOfLine");
- break;
- case GTK_MOVEMENT_PARAGRAPH_ENDS:
- command = (count > 0 ? "MoveToEndOfParagraph" :
- "MoveToBeginningOfParagraph");
- break;
- case GTK_MOVEMENT_PAGES:
- command = (count > 0 ? "MovePageDown" : "MovePageUp");
- break;
- case GTK_MOVEMENT_BUFFER_ENDS:
- command = (count > 0 ? "MoveToEndOfDocument" :
- "MoveToBeginningOfDocument");
- break;
- default:
- // GTK_MOVEMENT_PARAGRAPHS and GTK_MOVEMENT_HORIZONTAL_PAGES have
- // no corresponding editor commands.
- return;
- }
-
- GtkKeyBindingsHandler* owner = GetHandlerOwner(text_view);
- if (extend_selection)
- command.append("AndModifySelection");
- if (count < 0)
- count = -count;
- for (; count > 0; --count)
- owner->EditCommandMatched(command, std::string());
-}
-
-void GtkKeyBindingsHandler::MoveViewport(
- GtkTextView* text_view, GtkScrollStep step, gint count) {
- // Not supported by webkit.
-}
-
-void GtkKeyBindingsHandler::PasteClipboard(GtkTextView* text_view) {
- GetHandlerOwner(text_view)->EditCommandMatched("Paste", std::string());
-}
-
-void GtkKeyBindingsHandler::SelectAll(GtkTextView* text_view, gboolean select) {
- if (select)
- GetHandlerOwner(text_view)->EditCommandMatched("SelectAll", std::string());
- else
- GetHandlerOwner(text_view)->EditCommandMatched("Unselect", std::string());
-}
-
-void GtkKeyBindingsHandler::SetAnchor(GtkTextView* text_view) {
- GetHandlerOwner(text_view)->EditCommandMatched("SetMark", std::string());
-}
-
-void GtkKeyBindingsHandler::ToggleCursorVisible(GtkTextView* text_view) {
- // Not supported by webkit.
-}
-
-void GtkKeyBindingsHandler::ToggleOverwrite(GtkTextView* text_view) {
- // Not supported by webkit.
-}
-
-gboolean GtkKeyBindingsHandler::ShowHelp(GtkWidget* widget,
- GtkWidgetHelpType arg1) {
- // Just for disabling the default handler.
- return FALSE;
-}
-
-void GtkKeyBindingsHandler::MoveFocus(GtkWidget* widget,
- GtkDirectionType arg1) {
- // Just for disabling the default handler.
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/gtk_key_bindings_handler.h b/content/browser/renderer_host/gtk_key_bindings_handler.h
deleted file mode 100644
index 9006f5d..0000000
--- a/content/browser/renderer_host/gtk_key_bindings_handler.h
+++ /dev/null
@@ -1,132 +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.
-
-#ifndef CONTENT_BROWSER_RENDERER_HOST_GTK_KEY_BINDINGS_HANDLER_H_
-#define CONTENT_BROWSER_RENDERER_HOST_GTK_KEY_BINDINGS_HANDLER_H_
-
-#include <gtk/gtk.h>
-
-#include <string>
-
-#include "content/common/edit_command.h"
-#include "content/common/content_export.h"
-#include "ui/base/gtk/owned_widget_gtk.h"
-
-namespace content {
-struct NativeWebKeyboardEvent;
-
-// This class is a convenience class for handling editor key bindings defined
-// in gtk keyboard theme.
-// In gtk, only GtkEntry and GtkTextView support customizing editor key bindings
-// through keyboard theme. And in gtk keyboard theme definition file, each key
-// binding must be bound to a specific class or object. So existing keyboard
-// themes only define editor key bindings exactly for GtkEntry and GtkTextView.
-// Then, the only way for us to intercept editor key bindings defined in
-// keyboard theme, is to create a GtkEntry or GtkTextView object and call
-// gtk_bindings_activate_event() against it for the key events. If a key event
-// matches a predefined key binding, corresponding signal will be emitted.
-// GtkTextView is used here because it supports more key bindings than GtkEntry,
-// but in order to minimize the side effect of using a GtkTextView object, a new
-// class derived from GtkTextView is used, which overrides all signals related
-// to key bindings, to make sure GtkTextView won't receive them.
-//
-// See third_party/WebKit/Source/WebCore/editing/EditorCommand.cpp for detailed
-// definition of webkit edit commands.
-// See webkit/glue/editor_client_impl.cc for key bindings predefined in our
-// webkit glue.
-class CONTENT_EXPORT GtkKeyBindingsHandler {
- public:
- explicit GtkKeyBindingsHandler(GtkWidget* parent_widget);
- ~GtkKeyBindingsHandler();
-
- // Matches a key event against predefined gtk key bindings, false will be
- // returned if the key event doesn't correspond to a predefined key binding.
- // Edit commands matched with |wke| will be stored in |edit_commands|.
- bool Match(const NativeWebKeyboardEvent& wke,
- EditCommands* edit_commands);
-
- private:
- // Object structure of Handler class, which is derived from GtkTextView.
- struct Handler {
- GtkTextView parent_object;
- GtkKeyBindingsHandler *owner;
- };
-
- // Class structure of Handler class.
- struct HandlerClass {
- GtkTextViewClass parent_class;
- };
-
- // Creates a new instance of Handler class.
- GtkWidget* CreateNewHandler();
-
- // Adds an edit command to the key event.
- void EditCommandMatched(const std::string& name, const std::string& value);
-
- // Initializes Handler structure.
- static void HandlerInit(Handler *self);
-
- // Initializes HandlerClass structure.
- static void HandlerClassInit(HandlerClass *klass);
-
- // Registeres Handler class to GObject type system and return its type id.
- static GType HandlerGetType();
-
- // Gets the GtkKeyBindingsHandler object which owns the Handler object.
- static GtkKeyBindingsHandler* GetHandlerOwner(GtkTextView* text_view);
-
- // Handler of "backspace" signal.
- static void BackSpace(GtkTextView* text_view);
-
- // Handler of "copy-clipboard" signal.
- static void CopyClipboard(GtkTextView* text_view);
-
- // Handler of "cut-clipboard" signal.
- static void CutClipboard(GtkTextView* text_view);
-
- // Handler of "delete-from-cursor" signal.
- static void DeleteFromCursor(GtkTextView* text_view, GtkDeleteType type,
- gint count);
-
- // Handler of "insert-at-cursor" signal.
- static void InsertAtCursor(GtkTextView* text_view, const gchar* str);
-
- // Handler of "move-cursor" signal.
- static void MoveCursor(GtkTextView* text_view, GtkMovementStep step,
- gint count, gboolean extend_selection);
-
- // Handler of "move-viewport" signal.
- static void MoveViewport(GtkTextView* text_view, GtkScrollStep step,
- gint count);
-
- // Handler of "paste-clipboard" signal.
- static void PasteClipboard(GtkTextView* text_view);
-
- // Handler of "select-all" signal.
- static void SelectAll(GtkTextView* text_view, gboolean select);
-
- // Handler of "set-anchor" signal.
- static void SetAnchor(GtkTextView* text_view);
-
- // Handler of "toggle-cursor-visible" signal.
- static void ToggleCursorVisible(GtkTextView* text_view);
-
- // Handler of "toggle-overwrite" signal.
- static void ToggleOverwrite(GtkTextView* text_view);
-
- // Handler of "show-help" signal.
- static gboolean ShowHelp(GtkWidget* widget, GtkWidgetHelpType arg1);
-
- // Handler of "move-focus" signal.
- static void MoveFocus(GtkWidget* widget, GtkDirectionType arg1);
-
- ui::OwnedWidgetGtk handler_;
-
- // Buffer to store the match results.
- EditCommands edit_commands_;
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_RENDERER_HOST_GTK_KEY_BINDINGS_HANDLER_H_
diff --git a/content/browser/renderer_host/gtk_key_bindings_handler_unittest.cc b/content/browser/renderer_host/gtk_key_bindings_handler_unittest.cc
deleted file mode 100644
index fed67d5..0000000
--- a/content/browser/renderer_host/gtk_key_bindings_handler_unittest.cc
+++ /dev/null
@@ -1,226 +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/renderer_host/gtk_key_bindings_handler.h"
-
-#include <gdk/gdkkeysyms.h>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/file_util.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "base/strings/string_util.h"
-#include "content/common/edit_command.h"
-#include "content/public/browser/native_web_keyboard_event.h"
-#include "content/public/common/content_paths.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace content {
-
-class GtkKeyBindingsHandlerTest : public testing::Test {
- protected:
- struct EditCommand {
- const char* name;
- const char* value;
- };
-
- GtkKeyBindingsHandlerTest()
- : window_(gtk_window_new(GTK_WINDOW_TOPLEVEL)),
- handler_(NULL) {
- base::FilePath gtkrc;
- PathService::Get(DIR_TEST_DATA, &gtkrc);
- gtkrc = gtkrc.AppendASCII("gtk_key_bindings_test_gtkrc");
- EXPECT_TRUE(base::PathExists(gtkrc));
-
- gtk_rc_parse(gtkrc.value().c_str());
-
- GtkWidget* fixed = gtk_fixed_new();
- handler_ = new GtkKeyBindingsHandler(fixed);
- gtk_container_add(GTK_CONTAINER(window_), fixed);
- gtk_widget_show(fixed);
- gtk_widget_show(window_);
- }
- virtual ~GtkKeyBindingsHandlerTest() {
- gtk_widget_destroy(window_);
- delete handler_;
- }
-
- NativeWebKeyboardEvent NewNativeWebKeyboardEvent(guint keyval, guint state) {
- GdkKeymap* keymap =
- gdk_keymap_get_for_display(gtk_widget_get_display(window_));
-
- GdkKeymapKey *keys = NULL;
- gint n_keys = 0;
- if (gdk_keymap_get_entries_for_keyval(keymap, keyval, &keys, &n_keys)) {
- GdkEventKey event;
- event.type = GDK_KEY_PRESS;
- event.window = NULL;
- event.send_event = 0;
- event.time = 0;
- event.state = state;
- event.keyval = keyval;
- event.length = 0;
- event.string = NULL;
- event.hardware_keycode = keys[0].keycode;
- event.group = keys[0].group;
- event.is_modifier = 0;
- g_free(keys);
- return NativeWebKeyboardEvent(reinterpret_cast<GdkEvent*>(&event));
- }
- LOG(ERROR) << "Failed to create key event for keyval:" << keyval;
- return NativeWebKeyboardEvent();
- }
-
- void TestKeyBinding(const NativeWebKeyboardEvent& event,
- const EditCommand expected_result[],
- size_t size) {
- EditCommands result;
- ASSERT_TRUE(handler_->Match(event, &result));
- ASSERT_EQ(size, result.size());
- for (size_t i = 0; i < size; ++i) {
- ASSERT_STREQ(expected_result[i].name, result[i].name.c_str());
- ASSERT_STREQ(expected_result[i].value, result[i].value.c_str());
- }
- }
-
- protected:
- GtkWidget* window_;
- GtkKeyBindingsHandler* handler_;
-};
-
-TEST_F(GtkKeyBindingsHandlerTest, MoveCursor) {
- static const EditCommand kEditCommands[] = {
- // "move-cursor" (logical-positions, -2, 0)
- { "MoveBackward", "" },
- { "MoveBackward", "" },
- // "move-cursor" (logical-positions, 2, 0)
- { "MoveForward", "" },
- { "MoveForward", "" },
- // "move-cursor" (visual-positions, -1, 1)
- { "MoveLeftAndModifySelection", "" },
- // "move-cursor" (visual-positions, 1, 1)
- { "MoveRightAndModifySelection", "" },
- // "move-cursor" (words, -1, 0)
- { "MoveWordLeft", "" },
- // "move-cursor" (words, 1, 0)
- { "MoveWordRight", "" },
- // "move-cursor" (display-lines, -1, 0)
- { "MoveUp", "" },
- // "move-cursor" (display-lines, 1, 0)
- { "MoveDown", "" },
- // "move-cursor" (display-line-ends, -1, 0)
- { "MoveToBeginningOfLine", "" },
- // "move-cursor" (display-line-ends, 1, 0)
- { "MoveToEndOfLine", "" },
- // "move-cursor" (paragraph-ends, -1, 0)
- { "MoveToBeginningOfParagraph", "" },
- // "move-cursor" (paragraph-ends, 1, 0)
- { "MoveToEndOfParagraph", "" },
- // "move-cursor" (pages, -1, 0)
- { "MovePageUp", "" },
- // "move-cursor" (pages, 1, 0)
- { "MovePageDown", "" },
- // "move-cursor" (buffer-ends, -1, 0)
- { "MoveToBeginningOfDocument", "" },
- // "move-cursor" (buffer-ends, 1, 0)
- { "MoveToEndOfDocument", "" }
- };
-
- TestKeyBinding(NewNativeWebKeyboardEvent(GDK_1, GDK_CONTROL_MASK),
- kEditCommands, arraysize(kEditCommands));
-}
-
-TEST_F(GtkKeyBindingsHandlerTest, DeleteFromCursor) {
- static const EditCommand kEditCommands[] = {
- // "delete-from-cursor" (chars, -2)
- { "DeleteBackward", "" },
- { "DeleteBackward", "" },
- // "delete-from-cursor" (chars, 2)
- { "DeleteForward", "" },
- { "DeleteForward", "" },
- // "delete-from-cursor" (word-ends, -1)
- { "DeleteWordBackward", "" },
- // "delete-from-cursor" (word-ends, 1)
- { "DeleteWordForward", "" },
- // "delete-from-cursor" (words, -1)
- { "MoveWordBackward", "" },
- { "DeleteWordForward", "" },
- // "delete-from-cursor" (words, 1)
- { "MoveWordForward", "" },
- { "DeleteWordBackward", "" },
- // "delete-from-cursor" (display-lines, -1)
- { "MoveToBeginningOfLine", "" },
- { "DeleteToEndOfLine", "" },
- // "delete-from-cursor" (display-lines, 1)
- { "MoveToBeginningOfLine", "" },
- { "DeleteToEndOfLine", "" },
- // "delete-from-cursor" (display-line-ends, -1)
- { "DeleteToBeginningOfLine", "" },
- // "delete-from-cursor" (display-line-ends, 1)
- { "DeleteToEndOfLine", "" },
- // "delete-from-cursor" (paragraph-ends, -1)
- { "DeleteToBeginningOfParagraph", "" },
- // "delete-from-cursor" (paragraph-ends, 1)
- { "DeleteToEndOfParagraph", "" },
- // "delete-from-cursor" (paragraphs, -1)
- { "MoveToBeginningOfParagraph", "" },
- { "DeleteToEndOfParagraph", "" },
- // "delete-from-cursor" (paragraphs, 1)
- { "MoveToBeginningOfParagraph", "" },
- { "DeleteToEndOfParagraph", "" },
- };
-
- TestKeyBinding(NewNativeWebKeyboardEvent(GDK_2, GDK_CONTROL_MASK),
- kEditCommands, arraysize(kEditCommands));
-}
-
-TEST_F(GtkKeyBindingsHandlerTest, OtherActions) {
- static const EditCommand kBackspace[] = {
- { "DeleteBackward", "" }
- };
- TestKeyBinding(NewNativeWebKeyboardEvent(GDK_3, GDK_CONTROL_MASK),
- kBackspace, arraysize(kBackspace));
-
- static const EditCommand kCopyClipboard[] = {
- { "Copy", "" }
- };
- TestKeyBinding(NewNativeWebKeyboardEvent(GDK_4, GDK_CONTROL_MASK),
- kCopyClipboard, arraysize(kCopyClipboard));
-
- static const EditCommand kCutClipboard[] = {
- { "Cut", "" }
- };
- TestKeyBinding(NewNativeWebKeyboardEvent(GDK_5, GDK_CONTROL_MASK),
- kCutClipboard, arraysize(kCutClipboard));
-
- static const EditCommand kInsertAtCursor[] = {
- { "InsertText", "hello" }
- };
- TestKeyBinding(NewNativeWebKeyboardEvent(GDK_6, GDK_CONTROL_MASK),
- kInsertAtCursor, arraysize(kInsertAtCursor));
-
- static const EditCommand kPasteClipboard[] = {
- { "Paste", "" }
- };
- TestKeyBinding(NewNativeWebKeyboardEvent(GDK_7, GDK_CONTROL_MASK),
- kPasteClipboard, arraysize(kPasteClipboard));
-
- static const EditCommand kSelectAll[] = {
- { "Unselect", "" },
- { "SelectAll", "" }
- };
- TestKeyBinding(NewNativeWebKeyboardEvent(GDK_8, GDK_CONTROL_MASK),
- kSelectAll, arraysize(kSelectAll));
-
- static const EditCommand kSetAnchor[] = {
- { "SetMark", "" }
- };
- TestKeyBinding(NewNativeWebKeyboardEvent(GDK_9, GDK_CONTROL_MASK),
- kSetAnchor, arraysize(kSetAnchor));
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/gtk_plugin_container.cc b/content/browser/renderer_host/gtk_plugin_container.cc
deleted file mode 100644
index 0b83f2e..0000000
--- a/content/browser/renderer_host/gtk_plugin_container.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (c) 2009 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/renderer_host/gtk_plugin_container.h"
-
-#include <gtk/gtk.h>
-
-#include "base/basictypes.h"
-
-namespace content {
-
-namespace {
-
-// NOTE: This class doesn't have constructors/destructors, it is created
-// through GLib's object management.
-class GtkPluginContainer : public GtkSocket {
- public:
- // Sets the requested size of the widget.
- void set_size(int width, int height) {
- width_ = width;
- height_ = height;
- }
-
- // Casts a widget into a GtkPluginContainer, after checking the type.
- template <class T>
- static GtkPluginContainer *CastChecked(T *instance) {
- return G_TYPE_CHECK_INSTANCE_CAST(instance, GetType(), GtkPluginContainer);
- }
-
- // Create and register our custom container type with GTK.
- static GType GetType() {
- static GType type = 0; // We only want to register our type once.
- if (!type) {
- static const GTypeInfo info = {
- sizeof(GtkSocketClass),
- NULL, NULL,
- static_cast<GClassInitFunc>(&ClassInit),
- NULL, NULL,
- sizeof(GtkPluginContainer),
- 0, &InstanceInit,
- };
- type = g_type_register_static(GTK_TYPE_SOCKET,
- "GtkPluginContainer",
- &info,
- static_cast<GTypeFlags>(0));
- }
- return type;
- }
-
- // Implementation of the class initializer.
- static void ClassInit(gpointer klass, gpointer class_data_unusued) {
- GtkWidgetClass* widget_class = reinterpret_cast<GtkWidgetClass*>(klass);
- widget_class->size_request = &HandleSizeRequest;
- }
-
- // Implementation of the instance initializer (constructor).
- static void InstanceInit(GTypeInstance *instance, gpointer klass) {
- GtkPluginContainer *container = CastChecked(instance);
- container->set_size(0, 0);
- }
-
- // Report our allocation size during size requisition.
- static void HandleSizeRequest(GtkWidget* widget,
- GtkRequisition* requisition) {
- GtkPluginContainer *container = CastChecked(widget);
- requisition->width = container->width_;
- requisition->height = container->height_;
- }
-
- int width_;
- int height_;
- DISALLOW_IMPLICIT_CONSTRUCTORS(GtkPluginContainer);
-};
-
-} // namespace
-
-// Create a new instance of our GTK widget object.
-GtkWidget* gtk_plugin_container_new() {
- return GTK_WIDGET(g_object_new(GtkPluginContainer::GetType(), NULL));
-}
-
-void gtk_plugin_container_set_size(GtkWidget *widget, int width, int height) {
- GtkPluginContainer::CastChecked(widget)->set_size(width, height);
- // Signal the parent that the size request has changed.
- gtk_widget_queue_resize_no_redraw(widget);
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/gtk_plugin_container.h b/content/browser/renderer_host/gtk_plugin_container.h
deleted file mode 100644
index 1713cd4..0000000
--- a/content/browser/renderer_host/gtk_plugin_container.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2009 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.
-
-#ifndef CONTENT_BROWSER_RENDERER_HOST_GTK_PLUGIN_CONTAINER_H_
-#define CONTENT_BROWSER_RENDERER_HOST_GTK_PLUGIN_CONTAINER_H_
-
-// Windowed plugins are embedded via XEmbed, which is implemented by
-// GtkPlug/GtkSocket. But we want to control sizing and positioning
-// directly, so we need a subclass of GtkSocket that sidesteps the
-// size_request handler.
-//
-// The custom size_request handler just reports the size set by
-// gtk_plugin_container_set_size.
-
-typedef struct _GtkWidget GtkWidget;
-
-namespace content {
-
-// Return a new GtkPluginContainer.
-// Intentionally GTK-style here since we're creating a custom GTK widget.
-// This is a GtkSocket subclass; see its documentation for available methods.
-GtkWidget* gtk_plugin_container_new();
-
-// Sets the size of the GtkPluginContainer.
-void gtk_plugin_container_set_size(GtkWidget *widget, int width, int height);
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_RENDERER_HOST_GTK_PLUGIN_CONTAINER_H_
diff --git a/content/browser/renderer_host/gtk_plugin_container_manager.cc b/content/browser/renderer_host/gtk_plugin_container_manager.cc
deleted file mode 100644
index 8614911..0000000
--- a/content/browser/renderer_host/gtk_plugin_container_manager.cc
+++ /dev/null
@@ -1,161 +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/renderer_host/gtk_plugin_container_manager.h"
-
-#include <gtk/gtk.h>
-
-#include "base/logging.h"
-#include "content/browser/renderer_host/gtk_plugin_container.h"
-#include "content/common/webplugin_geometry.h"
-#include "ui/gfx/gtk_compat.h"
-#include "ui/gfx/gtk_util.h"
-
-namespace content {
-
-GtkPluginContainerManager::GtkPluginContainerManager() : host_widget_(NULL) {}
-
-GtkPluginContainerManager::~GtkPluginContainerManager() {}
-
-GtkWidget* GtkPluginContainerManager::CreatePluginContainer(
- gfx::PluginWindowHandle id) {
- DCHECK(host_widget_);
- GtkWidget *widget = gtk_plugin_container_new();
- plugin_window_to_widget_map_.insert(std::make_pair(id, widget));
-
- // The Realize callback is responsible for adding the plug into the socket.
- // The reason is 2-fold:
- // - the plug can't be added until the socket is realized, but this may not
- // happen until the socket is attached to a top-level window, which isn't the
- // case for background tabs.
- // - when dragging tabs, the socket gets unrealized, which breaks the XEMBED
- // connection. We need to make it again when the tab is reattached, and the
- // socket gets realized again.
- //
- // Note, the RealizeCallback relies on the plugin_window_to_widget_map_ to
- // have the mapping.
- g_signal_connect(widget, "realize",
- G_CALLBACK(RealizeCallback), this);
-
- // Don't destroy the widget when the plug is removed.
- g_signal_connect(widget, "plug-removed",
- G_CALLBACK(gtk_true), NULL);
-
- gtk_container_add(GTK_CONTAINER(host_widget_), widget);
- gtk_widget_show(widget);
-
- return widget;
-}
-
-void GtkPluginContainerManager::DestroyPluginContainer(
- gfx::PluginWindowHandle id) {
- DCHECK(host_widget_);
- GtkWidget* widget = MapIDToWidget(id);
- if (widget)
- gtk_widget_destroy(widget);
-
- plugin_window_to_widget_map_.erase(id);
-}
-
-void GtkPluginContainerManager::MovePluginContainer(
- const WebPluginGeometry& move) {
- DCHECK(host_widget_);
- GtkWidget *widget = MapIDToWidget(move.window);
- if (!widget)
- return;
-
- DCHECK(gtk_widget_get_has_window(widget));
-
- if (!move.visible) {
- gtk_widget_hide(widget);
- return;
- }
-
- gtk_widget_show(widget);
-
- if (!move.rects_valid)
- return;
-
- // TODO(piman): if the widget hasn't been realized (e.g. the tab has been
- // torn off and the parent gtk widget has been detached from the hierarchy),
- // we lose the cutout information.
- if (gtk_widget_get_realized(widget)) {
- GdkRectangle clip_rect = move.clip_rect.ToGdkRectangle();
- GdkRegion* clip_region = gdk_region_rectangle(&clip_rect);
- gfx::SubtractRectanglesFromRegion(clip_region, move.cutout_rects);
- gdk_window_shape_combine_region(gtk_widget_get_window(widget),
- clip_region, 0, 0);
- gdk_region_destroy(clip_region);
- }
-
- // Update the window position. Resizing is handled by WebPluginDelegate.
- // TODO(deanm): Verify that we only need to move and not resize.
- // TODO(evanm): we should cache the last shape and position and skip all
- // of this business in the common case where nothing has changed.
- int current_x, current_y;
-
- // Until the above TODO is resolved, we can grab the last position
- // off of the GtkFixed with a bit of hackery.
- GValue value = {0};
- g_value_init(&value, G_TYPE_INT);
- gtk_container_child_get_property(GTK_CONTAINER(host_widget_), widget,
- "x", &value);
- current_x = g_value_get_int(&value);
- gtk_container_child_get_property(GTK_CONTAINER(host_widget_), widget,
- "y", &value);
- current_y = g_value_get_int(&value);
- g_value_unset(&value);
-
- if (move.window_rect.x() != current_x ||
- move.window_rect.y() != current_y) {
- // Calling gtk_fixed_move unnecessarily is a no-no, as it causes the
- // parent window to repaint!
- gtk_fixed_move(GTK_FIXED(host_widget_),
- widget,
- move.window_rect.x(),
- move.window_rect.y());
- }
-
- gtk_plugin_container_set_size(widget,
- move.window_rect.width(),
- move.window_rect.height());
-}
-
-GtkWidget* GtkPluginContainerManager::MapIDToWidget(
- gfx::PluginWindowHandle id) {
- PluginWindowToWidgetMap::const_iterator i =
- plugin_window_to_widget_map_.find(id);
- if (i != plugin_window_to_widget_map_.end())
- return i->second;
-
- LOG(ERROR) << "Request for widget host for unknown window id " << id;
-
- return NULL;
-}
-
-gfx::PluginWindowHandle GtkPluginContainerManager::MapWidgetToID(
- GtkWidget* widget) {
- for (PluginWindowToWidgetMap::const_iterator i =
- plugin_window_to_widget_map_.begin();
- i != plugin_window_to_widget_map_.end(); ++i) {
- if (i->second == widget)
- return i->first;
- }
-
- LOG(ERROR) << "Request for id for unknown widget";
- return 0;
-}
-
-// static
-void GtkPluginContainerManager::RealizeCallback(GtkWidget* widget,
- void* user_data) {
- GtkPluginContainerManager* plugin_container_manager =
- static_cast<GtkPluginContainerManager*>(user_data);
-
- gfx::PluginWindowHandle id = plugin_container_manager->MapWidgetToID(widget);
- if (id)
- gtk_socket_add_id(GTK_SOCKET(widget), id);
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/gtk_plugin_container_manager.h b/content/browser/renderer_host/gtk_plugin_container_manager.h
deleted file mode 100644
index bd0e7c1..0000000
--- a/content/browser/renderer_host/gtk_plugin_container_manager.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2011 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.
-
-#ifndef CONTENT_BROWSER_RENDERER_HOST_GTK_PLUGIN_CONTAINER_MANAGER_H_
-#define CONTENT_BROWSER_RENDERER_HOST_GTK_PLUGIN_CONTAINER_MANAGER_H_
-
-#include <gtk/gtk.h>
-#include <map>
-
-#include "ui/gfx/native_widget_types.h"
-
-typedef struct _GtkWidget GtkWidget;
-
-namespace content {
-struct WebPluginGeometry;
-
-// Helper class that creates and manages plugin containers (GtkSocket).
-class GtkPluginContainerManager {
- public:
- GtkPluginContainerManager();
- ~GtkPluginContainerManager();
-
- // Sets the widget that will host the plugin containers. Must be a GtkFixed.
- void set_host_widget(GtkWidget *widget) { host_widget_ = widget; }
-
- // Creates a new plugin container, for a given plugin XID.
- GtkWidget* CreatePluginContainer(gfx::PluginWindowHandle id);
-
- // Destroys a plugin container, given the plugin XID.
- void DestroyPluginContainer(gfx::PluginWindowHandle id);
-
- // Takes an update from WebKit about a plugin's position and side and moves
- // the plugin accordingly.
- void MovePluginContainer(const WebPluginGeometry& move);
-
- private:
- // Maps a plugin XID to the corresponding container widget.
- GtkWidget* MapIDToWidget(gfx::PluginWindowHandle id);
-
- // Maps a container widget to the corresponding plugin XID.
- gfx::PluginWindowHandle MapWidgetToID(GtkWidget* widget);
-
- // Callback for when the plugin container gets realized, at which point it
- // plugs the plugin XID.
- static void RealizeCallback(GtkWidget *widget, void *user_data);
-
- // Parent of the plugin containers.
- GtkWidget* host_widget_;
-
- // A map that associates plugin containers to the plugin XID.
- typedef std::map<gfx::PluginWindowHandle, GtkWidget*> PluginWindowToWidgetMap;
- PluginWindowToWidgetMap plugin_window_to_widget_map_;
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_RENDERER_HOST_GTK_PLUGIN_CONTAINER_MANAGER_H_
diff --git a/content/browser/renderer_host/gtk_window_utils.cc b/content/browser/renderer_host/gtk_window_utils.cc
deleted file mode 100644
index 240c59d..0000000
--- a/content/browser/renderer_host/gtk_window_utils.cc
+++ /dev/null
@@ -1,89 +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/renderer_host/gtk_window_utils.h"
-
-#include <X11/Xlib.h>
-#include <gdk/gdkx.h>
-#include <gtk/gtk.h>
-
-#include <vector>
-
-#include "third_party/WebKit/public/platform/WebScreenInfo.h"
-#include "ui/base/x/x11_util.h"
-#include "ui/gfx/gtk_compat.h"
-#include "ui/gfx/rect.h"
-#include "ui/gfx/x/x11_types.h"
-
-namespace content {
-
-namespace {
-
-// Returns the region of |window|'s desktop that isn't occupied by docks or
-// panels. Returns an empty rect on failure.
-gfx::Rect GetWorkArea(Window window) {
- Window root = ui::GetX11RootWindow();
- int desktop = -1;
- if (!ui::GetIntProperty(window, "_NET_WM_DESKTOP", &desktop)) {
- // Hack for ion3: _NET_WM_DESKTOP doesn't get set on individual windows, but
- // _NET_CURRENT_DESKTOP and _NET_WORKAREA do get set.
- ui::GetIntProperty(root, "_NET_CURRENT_DESKTOP", &desktop);
- }
- if (desktop < 0)
- return gfx::Rect();
-
- std::vector<int> property;
- if (!ui::GetIntArrayProperty(root, "_NET_WORKAREA", &property))
- return gfx::Rect();
-
- size_t start_index = 4 * desktop;
- if (property.size() < start_index + 4)
- return gfx::Rect();
-
- return gfx::Rect(property[start_index], property[start_index + 1],
- property[start_index + 2], property[start_index + 3]);
-}
-
-blink::WebScreenInfo GetScreenInfo(XDisplay* display, int screenNumber) {
- // XDisplayWidth() and XDisplayHeight() return cached values. To ensure that
- // we return the correct dimensions after the screen is resized, query the
- // root window's geometry each time.
- Window root = RootWindow(display, screenNumber);
- Window root_ret;
- int x, y;
- unsigned int width, height, border, depth;
- XGetGeometry(
- display, root, &root_ret, &x, &y, &width, &height, &border, &depth);
-
- blink::WebScreenInfo results;
- results.depthPerComponent = 8; // Assume 8bpp, which is usually right.
- results.depth = depth;
- results.isMonochrome = depth == 1;
- results.rect = blink::WebRect(x, y, width, height);
- results.availableRect = results.rect;
- return results;
-}
-
-} // namespace
-
-void GetScreenInfoFromNativeWindow(
- GdkWindow* gdk_window, blink::WebScreenInfo* results) {
- GdkScreen* screen = gdk_window_get_screen(gdk_window);
- *results = GetScreenInfo(gdk_x11_drawable_get_xdisplay(gdk_window),
- gdk_x11_screen_get_screen_number(screen));
-
- int monitor_number = gdk_screen_get_monitor_at_window(screen, gdk_window);
- GdkRectangle monitor_rect;
- gdk_screen_get_monitor_geometry(screen, monitor_number, &monitor_rect);
- results->rect = blink::WebRect(monitor_rect.x, monitor_rect.y,
- monitor_rect.width, monitor_rect.height);
-
- gfx::Rect available_rect = results->rect;
- gfx::Rect work_area = GetWorkArea(GDK_WINDOW_XID(gdk_window));
- if (!work_area.IsEmpty())
- available_rect.Intersect(work_area);
- results->availableRect = available_rect;
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/gtk_window_utils.h b/content/browser/renderer_host/gtk_window_utils.h
deleted file mode 100644
index 93f1d68..0000000
--- a/content/browser/renderer_host/gtk_window_utils.h
+++ /dev/null
@@ -1,23 +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.
-
-#ifndef CONTENT_BROWSER_RENDERER_HOST_GTK_WINDOW_UTILS_H_
-#define CONTENT_BROWSER_RENDERER_HOST_GTK_WINDOW_UTILS_H_
-
-#include "content/common/content_export.h"
-
-typedef struct _GdkDrawable GdkWindow;
-
-namespace blink {
-struct WebScreenInfo;
-}
-
-namespace content {
-
-CONTENT_EXPORT void GetScreenInfoFromNativeWindow(
- GdkWindow* gdk_window, blink::WebScreenInfo* results);
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_RENDERER_HOST_GTK_WINDOW_UTILS_H_
diff --git a/content/browser/renderer_host/input/web_input_event_builders_gtk.cc b/content/browser/renderer_host/input/web_input_event_builders_gtk.cc
deleted file mode 100644
index d5c2bde..0000000
--- a/content/browser/renderer_host/input/web_input_event_builders_gtk.cc
+++ /dev/null
@@ -1,603 +0,0 @@
-// Copyright 2013 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/renderer_host/input/web_input_event_builders_gtk.h"
-
-#include <gdk/gdk.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-
-#include "base/logging.h"
-#include "content/browser/renderer_host/input/web_input_event_util_posix.h"
-#include "third_party/WebKit/public/web/WebInputEvent.h"
-#include "ui/events/keycodes/keyboard_code_conversion_gtk.h"
-
-using blink::WebInputEvent;
-using blink::WebMouseEvent;
-using blink::WebMouseWheelEvent;
-using blink::WebKeyboardEvent;
-
-namespace {
-
-// For click count tracking.
-static int num_clicks = 0;
-static GdkWindow* last_click_event_window = 0;
-static gint last_click_time = 0;
-static gint last_click_x = 0;
-static gint last_click_y = 0;
-static WebMouseEvent::Button last_click_button = WebMouseEvent::ButtonNone;
-
-bool ShouldForgetPreviousClick(GdkWindow* window, gint time, gint x, gint y) {
- static GtkSettings* settings = gtk_settings_get_default();
-
- if (window != last_click_event_window)
- return true;
-
- gint double_click_time = 250;
- gint double_click_distance = 5;
- g_object_get(G_OBJECT(settings),
- "gtk-double-click-time",
- &double_click_time,
- "gtk-double-click-distance",
- &double_click_distance,
- NULL);
- return (time - last_click_time) > double_click_time ||
- std::abs(x - last_click_x) > double_click_distance ||
- std::abs(y - last_click_y) > double_click_distance;
-}
-
-void ResetClickCountState() {
- num_clicks = 0;
- last_click_event_window = 0;
- last_click_time = 0;
- last_click_x = 0;
- last_click_y = 0;
- last_click_button = blink::WebMouseEvent::ButtonNone;
-}
-
-bool IsKeyPadKeyval(guint keyval) {
- // Keypad keyvals all fall into one range.
- return keyval >= GDK_KP_Space && keyval <= GDK_KP_9;
-}
-
-double GdkEventTimeToWebEventTime(guint32 time) {
- // Convert from time in ms to time in sec.
- return time / 1000.0;
-}
-
-int GdkStateToWebEventModifiers(guint state) {
- int modifiers = 0;
- if (state & GDK_SHIFT_MASK)
- modifiers |= WebInputEvent::ShiftKey;
- if (state & GDK_CONTROL_MASK)
- modifiers |= WebInputEvent::ControlKey;
- if (state & GDK_MOD1_MASK)
- modifiers |= WebInputEvent::AltKey;
- if (state & GDK_META_MASK)
- modifiers |= WebInputEvent::MetaKey;
- if (state & GDK_BUTTON1_MASK)
- modifiers |= WebInputEvent::LeftButtonDown;
- if (state & GDK_BUTTON2_MASK)
- modifiers |= WebInputEvent::MiddleButtonDown;
- if (state & GDK_BUTTON3_MASK)
- modifiers |= WebInputEvent::RightButtonDown;
- if (state & GDK_LOCK_MASK)
- modifiers |= WebInputEvent::CapsLockOn;
- if (state & GDK_MOD2_MASK)
- modifiers |= WebInputEvent::NumLockOn;
- return modifiers;
-}
-
-ui::KeyboardCode GdkEventToWindowsKeyCode(const GdkEventKey* event) {
- static const unsigned int kHardwareCodeToGDKKeyval[] = {
- 0, // 0x00:
- 0, // 0x01:
- 0, // 0x02:
- 0, // 0x03:
- 0, // 0x04:
- 0, // 0x05:
- 0, // 0x06:
- 0, // 0x07:
- 0, // 0x08:
- 0, // 0x09: GDK_Escape
- GDK_1, // 0x0A: GDK_1
- GDK_2, // 0x0B: GDK_2
- GDK_3, // 0x0C: GDK_3
- GDK_4, // 0x0D: GDK_4
- GDK_5, // 0x0E: GDK_5
- GDK_6, // 0x0F: GDK_6
- GDK_7, // 0x10: GDK_7
- GDK_8, // 0x11: GDK_8
- GDK_9, // 0x12: GDK_9
- GDK_0, // 0x13: GDK_0
- GDK_minus, // 0x14: GDK_minus
- GDK_equal, // 0x15: GDK_equal
- 0, // 0x16: GDK_BackSpace
- 0, // 0x17: GDK_Tab
- GDK_q, // 0x18: GDK_q
- GDK_w, // 0x19: GDK_w
- GDK_e, // 0x1A: GDK_e
- GDK_r, // 0x1B: GDK_r
- GDK_t, // 0x1C: GDK_t
- GDK_y, // 0x1D: GDK_y
- GDK_u, // 0x1E: GDK_u
- GDK_i, // 0x1F: GDK_i
- GDK_o, // 0x20: GDK_o
- GDK_p, // 0x21: GDK_p
- GDK_bracketleft, // 0x22: GDK_bracketleft
- GDK_bracketright, // 0x23: GDK_bracketright
- 0, // 0x24: GDK_Return
- 0, // 0x25: GDK_Control_L
- GDK_a, // 0x26: GDK_a
- GDK_s, // 0x27: GDK_s
- GDK_d, // 0x28: GDK_d
- GDK_f, // 0x29: GDK_f
- GDK_g, // 0x2A: GDK_g
- GDK_h, // 0x2B: GDK_h
- GDK_j, // 0x2C: GDK_j
- GDK_k, // 0x2D: GDK_k
- GDK_l, // 0x2E: GDK_l
- GDK_semicolon, // 0x2F: GDK_semicolon
- GDK_apostrophe, // 0x30: GDK_apostrophe
- GDK_grave, // 0x31: GDK_grave
- 0, // 0x32: GDK_Shift_L
- GDK_backslash, // 0x33: GDK_backslash
- GDK_z, // 0x34: GDK_z
- GDK_x, // 0x35: GDK_x
- GDK_c, // 0x36: GDK_c
- GDK_v, // 0x37: GDK_v
- GDK_b, // 0x38: GDK_b
- GDK_n, // 0x39: GDK_n
- GDK_m, // 0x3A: GDK_m
- GDK_comma, // 0x3B: GDK_comma
- GDK_period, // 0x3C: GDK_period
- GDK_slash, // 0x3D: GDK_slash
- 0, // 0x3E: GDK_Shift_R
- 0, // 0x3F:
- 0, // 0x40:
- 0, // 0x41:
- 0, // 0x42:
- 0, // 0x43:
- 0, // 0x44:
- 0, // 0x45:
- 0, // 0x46:
- 0, // 0x47:
- 0, // 0x48:
- 0, // 0x49:
- 0, // 0x4A:
- 0, // 0x4B:
- 0, // 0x4C:
- 0, // 0x4D:
- 0, // 0x4E:
- 0, // 0x4F:
- 0, // 0x50:
- 0, // 0x51:
- 0, // 0x52:
- 0, // 0x53:
- 0, // 0x54:
- 0, // 0x55:
- 0, // 0x56:
- 0, // 0x57:
- 0, // 0x58:
- 0, // 0x59:
- 0, // 0x5A:
- 0, // 0x5B:
- 0, // 0x5C:
- 0, // 0x5D:
- 0, // 0x5E:
- 0, // 0x5F:
- 0, // 0x60:
- 0, // 0x61:
- 0, // 0x62:
- 0, // 0x63:
- 0, // 0x64:
- 0, // 0x65:
- 0, // 0x66:
- 0, // 0x67:
- 0, // 0x68:
- 0, // 0x69:
- 0, // 0x6A:
- 0, // 0x6B:
- 0, // 0x6C:
- 0, // 0x6D:
- 0, // 0x6E:
- 0, // 0x6F:
- 0, // 0x70:
- 0, // 0x71:
- 0, // 0x72:
- GDK_Super_L, // 0x73: GDK_Super_L
- GDK_Super_R, // 0x74: GDK_Super_R
- };
-
- // |windows_key_code| has to include a valid virtual-key code even when we
- // use non-US layouts, e.g. even when we type an 'A' key of a US keyboard
- // on the Hebrew layout, |windows_key_code| should be VK_A.
- // On the other hand, |event->keyval| value depends on the current
- // GdkKeymap object, i.e. when we type an 'A' key of a US keyboard on
- // the Hebrew layout, |event->keyval| becomes GDK_hebrew_shin and this
- // ui::WindowsKeyCodeForGdkKeyCode() call returns 0.
- // To improve compatibilty with Windows, we use |event->hardware_keycode|
- // for retrieving its Windows key-code for the keys when the
- // WebCore::windows_key_codeForEvent() call returns 0.
- // We shouldn't use |event->hardware_keycode| for keys that GdkKeymap
- // objects cannot change because |event->hardware_keycode| doesn't change
- // even when we change the layout options, e.g. when we swap a control
- // key and a caps-lock key, GTK doesn't swap their
- // |event->hardware_keycode| values but swap their |event->keyval| values.
- ui::KeyboardCode windows_key_code =
- ui::WindowsKeyCodeForGdkKeyCode(event->keyval);
- if (windows_key_code)
- return windows_key_code;
-
- if (event->hardware_keycode < arraysize(kHardwareCodeToGDKKeyval)) {
- int keyval = kHardwareCodeToGDKKeyval[event->hardware_keycode];
- if (keyval)
- return ui::WindowsKeyCodeForGdkKeyCode(keyval);
- }
-
- // This key is one that keyboard-layout drivers cannot change.
- // Use |event->keyval| to retrieve its |windows_key_code| value.
- return ui::WindowsKeyCodeForGdkKeyCode(event->keyval);
-}
-
-// Normalizes event->state to make it Windows/Mac compatible. Since the way
-// of setting modifier mask on X is very different than Windows/Mac as shown
-// in http://crbug.com/127142#c8, the normalization is necessary.
-guint NormalizeEventState(const GdkEventKey* event) {
- guint mask = 0;
- switch (GdkEventToWindowsKeyCode(event)) {
- case ui::VKEY_CONTROL:
- case ui::VKEY_LCONTROL:
- case ui::VKEY_RCONTROL:
- mask = GDK_CONTROL_MASK;
- break;
- case ui::VKEY_SHIFT:
- case ui::VKEY_LSHIFT:
- case ui::VKEY_RSHIFT:
- mask = GDK_SHIFT_MASK;
- break;
- case ui::VKEY_MENU:
- case ui::VKEY_LMENU:
- case ui::VKEY_RMENU:
- mask = GDK_MOD1_MASK;
- break;
- case ui::VKEY_CAPITAL:
- mask = GDK_LOCK_MASK;
- break;
- default:
- return event->state;
- }
- if (event->type == GDK_KEY_PRESS)
- return event->state | mask;
- return event->state & ~mask;
-}
-
-// Gets the corresponding control character of a specified key code. See:
-// http://en.wikipedia.org/wiki/Control_characters
-// We emulate Windows behavior here.
-int GetControlCharacter(ui::KeyboardCode windows_key_code, bool shift) {
- if (windows_key_code >= ui::VKEY_A && windows_key_code <= ui::VKEY_Z) {
- // ctrl-A ~ ctrl-Z map to \x01 ~ \x1A
- return windows_key_code - ui::VKEY_A + 1;
- }
- if (shift) {
- // following graphics chars require shift key to input.
- switch (windows_key_code) {
- // ctrl-@ maps to \x00 (Null byte)
- case ui::VKEY_2:
- return 0;
- // ctrl-^ maps to \x1E (Record separator, Information separator two)
- case ui::VKEY_6:
- return 0x1E;
- // ctrl-_ maps to \x1F (Unit separator, Information separator one)
- case ui::VKEY_OEM_MINUS:
- return 0x1F;
- // Returns 0 for all other keys to avoid inputting unexpected chars.
- default:
- return 0;
- }
- } else {
- switch (windows_key_code) {
- // ctrl-[ maps to \x1B (Escape)
- case ui::VKEY_OEM_4:
- return 0x1B;
- // ctrl-\ maps to \x1C (File separator, Information separator four)
- case ui::VKEY_OEM_5:
- return 0x1C;
- // ctrl-] maps to \x1D (Group separator, Information separator three)
- case ui::VKEY_OEM_6:
- return 0x1D;
- // ctrl-Enter maps to \x0A (Line feed)
- case ui::VKEY_RETURN:
- return 0x0A;
- // Returns 0 for all other keys to avoid inputting unexpected chars.
- default:
- return 0;
- }
- }
-}
-
-} // namespace
-
-namespace content {
-
-// WebKeyboardEvent -----------------------------------------------------------
-
-WebKeyboardEvent WebKeyboardEventBuilder::Build(const GdkEventKey* event) {
- WebKeyboardEvent result;
-
- result.timeStampSeconds = GdkEventTimeToWebEventTime(event->time);
- result.modifiers = GdkStateToWebEventModifiers(NormalizeEventState(event));
-
- switch (event->type) {
- case GDK_KEY_RELEASE:
- result.type = WebInputEvent::KeyUp;
- break;
- case GDK_KEY_PRESS:
- result.type = WebInputEvent::RawKeyDown;
- break;
- default:
- NOTREACHED();
- }
-
- // According to MSDN:
- // http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx
- // Key events with Alt modifier and F10 are system key events.
- // We just emulate this behavior. It's necessary to prevent webkit from
- // processing keypress event generated by alt-d, etc.
- // F10 is not special on Linux, so don't treat it as system key.
- if (result.modifiers & WebInputEvent::AltKey)
- result.isSystemKey = true;
-
- // The key code tells us which physical key was pressed (for example, the
- // A key went down or up). It does not determine whether A should be lower
- // or upper case. This is what text does, which should be the keyval.
- ui::KeyboardCode windows_key_code = GdkEventToWindowsKeyCode(event);
- result.windowsKeyCode = GetWindowsKeyCodeWithoutLocation(windows_key_code);
- result.modifiers |= GetLocationModifiersFromWindowsKeyCode(windows_key_code);
- result.nativeKeyCode = event->hardware_keycode;
-
- if (result.windowsKeyCode == ui::VKEY_RETURN) {
- // We need to treat the enter key as a key press of character \r. This
- // is apparently just how webkit handles it and what it expects.
- result.unmodifiedText[0] = '\r';
- } else {
- // FIXME: fix for non BMP chars
- result.unmodifiedText[0] =
- static_cast<int>(gdk_keyval_to_unicode(event->keyval));
- }
-
- // If ctrl key is pressed down, then control character shall be input.
- if (result.modifiers & WebInputEvent::ControlKey) {
- result.text[0] =
- GetControlCharacter(ui::KeyboardCode(result.windowsKeyCode),
- result.modifiers & WebInputEvent::ShiftKey);
- } else {
- result.text[0] = result.unmodifiedText[0];
- }
-
- result.setKeyIdentifierFromWindowsKeyCode();
-
- // FIXME: Do we need to set IsAutoRepeat?
- if (IsKeyPadKeyval(event->keyval))
- result.modifiers |= WebInputEvent::IsKeyPad;
-
- return result;
-}
-
-WebKeyboardEvent WebKeyboardEventBuilder::Build(wchar_t character,
- int state,
- double timeStampSeconds) {
- // keyboardEvent(const GdkEventKey*) depends on the GdkEventKey object and
- // it is hard to use/ it from signal handlers which don't use GdkEventKey
- // objects (e.g. GtkIMContext signal handlers.) For such handlers, this
- // function creates a WebInputEvent::Char event without using a
- // GdkEventKey object.
- WebKeyboardEvent result;
- result.type = blink::WebInputEvent::Char;
- result.timeStampSeconds = timeStampSeconds;
- result.modifiers = GdkStateToWebEventModifiers(state);
- result.windowsKeyCode = character;
- result.nativeKeyCode = character;
- result.text[0] = character;
- result.unmodifiedText[0] = character;
-
- // According to MSDN:
- // http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx
- // Key events with Alt modifier and F10 are system key events.
- // We just emulate this behavior. It's necessary to prevent webkit from
- // processing keypress event generated by alt-d, etc.
- // F10 is not special on Linux, so don't treat it as system key.
- if (result.modifiers & WebInputEvent::AltKey)
- result.isSystemKey = true;
-
- return result;
-}
-
-// WebMouseEvent --------------------------------------------------------------
-
-WebMouseEvent WebMouseEventBuilder::Build(const GdkEventButton* event) {
- WebMouseEvent result;
-
- result.timeStampSeconds = GdkEventTimeToWebEventTime(event->time);
-
- result.modifiers = GdkStateToWebEventModifiers(event->state);
- result.x = static_cast<int>(event->x);
- result.y = static_cast<int>(event->y);
- result.windowX = result.x;
- result.windowY = result.y;
- result.globalX = static_cast<int>(event->x_root);
- result.globalY = static_cast<int>(event->y_root);
- result.clickCount = 0;
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- result.type = WebInputEvent::MouseDown;
- break;
- case GDK_BUTTON_RELEASE:
- result.type = WebInputEvent::MouseUp;
- break;
- case GDK_3BUTTON_PRESS:
- case GDK_2BUTTON_PRESS:
- default:
- NOTREACHED();
- }
-
- result.button = WebMouseEvent::ButtonNone;
- if (event->button == 1)
- result.button = WebMouseEvent::ButtonLeft;
- else if (event->button == 2)
- result.button = WebMouseEvent::ButtonMiddle;
- else if (event->button == 3)
- result.button = WebMouseEvent::ButtonRight;
-
- if (result.type == WebInputEvent::MouseDown) {
- bool forgetPreviousClick = ShouldForgetPreviousClick(
- event->window, event->time, event->x, event->y);
-
- if (!forgetPreviousClick && result.button == last_click_button) {
- ++num_clicks;
- } else {
- num_clicks = 1;
-
- last_click_event_window = event->window;
- last_click_x = event->x;
- last_click_y = event->y;
- last_click_button = result.button;
- }
- last_click_time = event->time;
- }
- result.clickCount = num_clicks;
-
- return result;
-}
-
-WebMouseEvent WebMouseEventBuilder::Build(const GdkEventMotion* event) {
- WebMouseEvent result;
-
- result.timeStampSeconds = GdkEventTimeToWebEventTime(event->time);
- result.modifiers = GdkStateToWebEventModifiers(event->state);
- result.x = static_cast<int>(event->x);
- result.y = static_cast<int>(event->y);
- result.windowX = result.x;
- result.windowY = result.y;
- result.globalX = static_cast<int>(event->x_root);
- result.globalY = static_cast<int>(event->y_root);
-
- switch (event->type) {
- case GDK_MOTION_NOTIFY:
- result.type = WebInputEvent::MouseMove;
- break;
- default:
- NOTREACHED();
- }
-
- result.button = WebMouseEvent::ButtonNone;
- if (event->state & GDK_BUTTON1_MASK)
- result.button = WebMouseEvent::ButtonLeft;
- else if (event->state & GDK_BUTTON2_MASK)
- result.button = WebMouseEvent::ButtonMiddle;
- else if (event->state & GDK_BUTTON3_MASK)
- result.button = WebMouseEvent::ButtonRight;
-
- if (ShouldForgetPreviousClick(event->window, event->time, event->x, event->y))
- ResetClickCountState();
-
- return result;
-}
-
-WebMouseEvent WebMouseEventBuilder::Build(const GdkEventCrossing* event) {
- WebMouseEvent result;
-
- result.timeStampSeconds = GdkEventTimeToWebEventTime(event->time);
- result.modifiers = GdkStateToWebEventModifiers(event->state);
- result.x = static_cast<int>(event->x);
- result.y = static_cast<int>(event->y);
- result.windowX = result.x;
- result.windowY = result.y;
- result.globalX = static_cast<int>(event->x_root);
- result.globalY = static_cast<int>(event->y_root);
-
- switch (event->type) {
- case GDK_ENTER_NOTIFY:
- case GDK_LEAVE_NOTIFY:
- // Note that if we sent MouseEnter or MouseLeave to WebKit, it
- // wouldn't work - they don't result in the proper JavaScript events.
- // MouseMove does the right thing.
- result.type = WebInputEvent::MouseMove;
- break;
- default:
- NOTREACHED();
- }
-
- result.button = WebMouseEvent::ButtonNone;
- if (event->state & GDK_BUTTON1_MASK)
- result.button = WebMouseEvent::ButtonLeft;
- else if (event->state & GDK_BUTTON2_MASK)
- result.button = WebMouseEvent::ButtonMiddle;
- else if (event->state & GDK_BUTTON3_MASK)
- result.button = WebMouseEvent::ButtonRight;
-
- if (ShouldForgetPreviousClick(event->window, event->time, event->x, event->y))
- ResetClickCountState();
-
- return result;
-}
-
-// WebMouseWheelEvent ---------------------------------------------------------
-
-float WebMouseWheelEventBuilder::ScrollbarPixelsPerTick() {
- // How much should we scroll per mouse wheel event?
- // - Windows uses 3 lines by default and obeys a system setting.
- // - Mozilla has a pref that lets you either use the "system" number of lines
- // to scroll, or lets the user override it.
- // For the "system" number of lines, it appears they've hardcoded 3.
- // See case NS_MOUSE_SCROLL in content/events/src/nsEventStateManager.cpp
- // and InitMouseScrollEvent in widget/src/gtk2/nsCommonWidget.cpp .
- // - Gtk makes the scroll amount a function of the size of the scroll bar,
- // which is not available to us here.
- // Instead, we pick a number that empirically matches Firefox's behavior.
- return 160.0f / 3.0f;
-}
-
-WebMouseWheelEvent WebMouseWheelEventBuilder::Build(
- const GdkEventScroll* event) {
- WebMouseWheelEvent result;
-
- result.type = WebInputEvent::MouseWheel;
- result.button = WebMouseEvent::ButtonNone;
-
- result.timeStampSeconds = GdkEventTimeToWebEventTime(event->time);
- result.modifiers = GdkStateToWebEventModifiers(event->state);
- result.x = static_cast<int>(event->x);
- result.y = static_cast<int>(event->y);
- result.windowX = result.x;
- result.windowY = result.y;
- result.globalX = static_cast<int>(event->x_root);
- result.globalY = static_cast<int>(event->y_root);
-
- static const float scrollbarPixelsPerTick = ScrollbarPixelsPerTick();
- switch (event->direction) {
- case GDK_SCROLL_UP:
- result.deltaY = scrollbarPixelsPerTick;
- result.wheelTicksY = 1;
- break;
- case GDK_SCROLL_DOWN:
- result.deltaY = -scrollbarPixelsPerTick;
- result.wheelTicksY = -1;
- break;
- case GDK_SCROLL_LEFT:
- result.deltaX = scrollbarPixelsPerTick;
- result.wheelTicksX = 1;
- break;
- case GDK_SCROLL_RIGHT:
- result.deltaX = -scrollbarPixelsPerTick;
- result.wheelTicksX = -1;
- break;
- }
-
- return result;
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/input/web_input_event_builders_gtk.h b/content/browser/renderer_host/input/web_input_event_builders_gtk.h
deleted file mode 100644
index 0d0250b..0000000
--- a/content/browser/renderer_host/input/web_input_event_builders_gtk.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2013 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.
-
-#ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_WEB_INPUT_EVENT_BUILDERS_GTK_H_
-#define CONTENT_BROWSER_RENDERER_HOST_INPUT_WEB_INPUT_EVENT_BUILDERS_GTK_H_
-
-#include "content/common/content_export.h"
-#include "third_party/WebKit/public/web/WebInputEvent.h"
-#include "ui/events/keycodes/keyboard_codes.h"
-
-typedef struct _GdkEventButton GdkEventButton;
-typedef struct _GdkEventMotion GdkEventMotion;
-typedef struct _GdkEventCrossing GdkEventCrossing;
-typedef struct _GdkEventScroll GdkEventScroll;
-typedef struct _GdkEventKey GdkEventKey;
-
-namespace content {
-
-class CONTENT_EXPORT WebKeyboardEventBuilder {
- public:
- static blink::WebKeyboardEvent Build(const GdkEventKey* event);
- static blink::WebKeyboardEvent Build(wchar_t character,
- int state,
- double time_secs);
-};
-
-class CONTENT_EXPORT WebMouseEventBuilder {
- public:
- static blink::WebMouseEvent Build(const GdkEventButton* event);
- static blink::WebMouseEvent Build(const GdkEventMotion* event);
- static blink::WebMouseEvent Build(const GdkEventCrossing* event);
-};
-
-class CONTENT_EXPORT WebMouseWheelEventBuilder {
- public:
- static float ScrollbarPixelsPerTick();
- static blink::WebMouseWheelEvent Build(
- const GdkEventScroll* event);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_RENDERER_HOST_INPUT_WEB_INPUT_EVENT_BUILDERS_GTK_H
diff --git a/content/browser/renderer_host/input/web_input_event_builders_gtk_unittest.cc b/content/browser/renderer_host/input/web_input_event_builders_gtk_unittest.cc
deleted file mode 100644
index b5e2d42..0000000
--- a/content/browser/renderer_host/input/web_input_event_builders_gtk_unittest.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2013 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/renderer_host/input/web_input_event_builders_gtk.h"
-
-#include <gdk/gdk.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/web/WebInputEvent.h"
-#include "ui/events/keycodes/keyboard_code_conversion_gtk.h"
-
-using blink::WebInputEvent;
-using blink::WebKeyboardEvent;
-using blink::WebMouseEvent;
-using content::WebMouseEventBuilder;
-using content::WebKeyboardEventBuilder;
-
-namespace {
-
-TEST(WebMouseEventBuilderTest, DoubleClick) {
- GdkEventButton first_click;
- first_click.type = GDK_BUTTON_PRESS;
- first_click.window = static_cast<GdkWindow*>(GINT_TO_POINTER(1));
- first_click.x = first_click.y = first_click.x_root = first_click.y_root = 100;
- first_click.state = 0;
- first_click.time = 0;
- first_click.button = 1;
-
- // Single click works.
- WebMouseEvent first_click_events =
- WebMouseEventBuilder::Build(&first_click);
- EXPECT_EQ(1, first_click_events.clickCount);
-
- // Make sure double click works.
- GdkEventButton second_click = first_click;
- second_click.time = first_click.time + 100;
- WebMouseEvent second_click_events =
- WebMouseEventBuilder::Build(&second_click);
- EXPECT_EQ(2, second_click_events.clickCount);
-
- // Reset the click count.
- first_click.time += 10000;
- first_click_events = WebMouseEventBuilder::Build(&first_click);
- EXPECT_EQ(1, first_click_events.clickCount);
-
- // Two clicks with a long gap in between aren't counted as a double click.
- second_click = first_click;
- second_click.time = first_click.time + 1000;
- second_click_events = WebMouseEventBuilder::Build(&second_click);
- EXPECT_EQ(1, second_click_events.clickCount);
-
- // Reset the click count.
- first_click.time += 10000;
- first_click_events = WebMouseEventBuilder::Build(&first_click);
- EXPECT_EQ(1, first_click_events.clickCount);
-
- // Two clicks far apart (horizontally) aren't counted as a double click.
- second_click = first_click;
- second_click.time = first_click.time + 1;
- second_click.x = first_click.x + 100;
- second_click_events = WebMouseEventBuilder::Build(&second_click);
- EXPECT_EQ(1, second_click_events.clickCount);
-
- // Reset the click count.
- first_click.time += 10000;
- first_click_events = WebMouseEventBuilder::Build(&first_click);
- EXPECT_EQ(1, first_click_events.clickCount);
-
- // Two clicks far apart (vertically) aren't counted as a double click.
- second_click = first_click;
- second_click.time = first_click.time + 1;
- second_click.x = first_click.y + 100;
- second_click_events = WebMouseEventBuilder::Build(&second_click);
- EXPECT_EQ(1, second_click_events.clickCount);
-
- // Reset the click count.
- first_click.time += 10000;
- first_click_events = WebMouseEventBuilder::Build(&first_click);
- EXPECT_EQ(1, first_click_events.clickCount);
-
- // Two clicks on different windows aren't a double click.
- second_click = first_click;
- second_click.time = first_click.time + 1;
- second_click.window = static_cast<GdkWindow*>(GINT_TO_POINTER(2));
- second_click_events = WebMouseEventBuilder::Build(&second_click);
- EXPECT_EQ(1, second_click_events.clickCount);
-}
-
-TEST(WebMouseEventBuilderTest, MouseUpClickCount) {
- GdkEventButton mouse_down;
- memset(&mouse_down, 0, sizeof(mouse_down));
- mouse_down.type = GDK_BUTTON_PRESS;
- mouse_down.window = static_cast<GdkWindow*>(GINT_TO_POINTER(1));
- mouse_down.x = mouse_down.y = mouse_down.x_root = mouse_down.y_root = 100;
- mouse_down.time = 0;
- mouse_down.button = 1;
-
- // Properly set the last click time, so that the internal state won't be
- // affected by previous tests.
- WebMouseEventBuilder::Build(&mouse_down);
-
- mouse_down.time += 10000;
- GdkEventButton mouse_up = mouse_down;
- mouse_up.type = GDK_BUTTON_RELEASE;
- WebMouseEvent mouse_down_event;
- WebMouseEvent mouse_up_event;
-
- // Click for three times.
- for (int i = 1; i < 4; ++i) {
- mouse_down.time += 100;
- mouse_down_event = WebMouseEventBuilder::Build(&mouse_down);
- EXPECT_EQ(i, mouse_down_event.clickCount);
-
- mouse_up.time = mouse_down.time + 50;
- mouse_up_event = WebMouseEventBuilder::Build(&mouse_up);
- EXPECT_EQ(i, mouse_up_event.clickCount);
- }
-
- // Reset the click count.
- mouse_down.time += 10000;
- mouse_down_event = WebMouseEventBuilder::Build(&mouse_down);
- EXPECT_EQ(1, mouse_down_event.clickCount);
-
- // Moving the cursor for a significant distance will reset the click count to
- // 0.
- GdkEventMotion mouse_move;
- memset(&mouse_move, 0, sizeof(mouse_move));
- mouse_move.type = GDK_MOTION_NOTIFY;
- mouse_move.window = mouse_down.window;
- mouse_move.time = mouse_down.time;
- mouse_move.x = mouse_move.y = mouse_move.x_root = mouse_move.y_root =
- mouse_down.x + 100;
- WebMouseEventBuilder::Build(&mouse_move);
-
- mouse_up.time = mouse_down.time + 50;
- mouse_up_event = WebMouseEventBuilder::Build(&mouse_up);
- EXPECT_EQ(0, mouse_up_event.clickCount);
-
- // Reset the click count.
- mouse_down.time += 10000;
- mouse_down_event = WebMouseEventBuilder::Build(&mouse_down);
- EXPECT_EQ(1, mouse_down_event.clickCount);
-
- // Moving the cursor with a significant delay will reset the click count to 0.
- mouse_move.time = mouse_down.time + 1000;
- mouse_move.x = mouse_move.y = mouse_move.x_root = mouse_move.y_root =
- mouse_down.x;
- WebMouseEventBuilder::Build(&mouse_move);
-
- mouse_up.time = mouse_move.time + 50;
- mouse_up_event = WebMouseEventBuilder::Build(&mouse_up);
- EXPECT_EQ(0, mouse_up_event.clickCount);
-}
-
-TEST(WebKeyboardEventBuilderTest, NumPadConversion) {
- // Construct a GDK input event for the numpad "5" key.
- char five[] = "5";
- GdkEventKey gdk_event;
- memset(&gdk_event, 0, sizeof(GdkEventKey));
- gdk_event.type = GDK_KEY_PRESS;
- gdk_event.keyval = GDK_KP_5;
- gdk_event.string = five;
-
- // Numpad flag should be set on the WebKeyboardEvent.
- WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(&gdk_event);
- EXPECT_TRUE(web_event.modifiers & WebInputEvent::IsKeyPad);
-}
-
-} // anonymous namespace
diff --git a/content/browser/renderer_host/native_web_keyboard_event_gtk.cc b/content/browser/renderer_host/native_web_keyboard_event_gtk.cc
deleted file mode 100644
index 74ce6a3..0000000
--- a/content/browser/renderer_host/native_web_keyboard_event_gtk.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2011 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/public/browser/native_web_keyboard_event.h"
-
-#include <gdk/gdk.h>
-
-#include "content/browser/renderer_host/input/web_input_event_builders_gtk.h"
-
-namespace {
-
-void CopyEventTo(gfx::NativeEvent in, gfx::NativeEvent* out) {
- *out = in ? gdk_event_copy(in) : NULL;
-}
-
-void FreeEvent(gfx::NativeEvent event) {
- if (event)
- gdk_event_free(event);
-}
-
-} // namespace
-
-namespace content {
-
-NativeWebKeyboardEvent::NativeWebKeyboardEvent()
- : os_event(NULL),
- skip_in_browser(false),
- match_edit_command(false) {
-}
-
-NativeWebKeyboardEvent::NativeWebKeyboardEvent(gfx::NativeEvent native_event)
- : WebKeyboardEvent(WebKeyboardEventBuilder::Build(&native_event->key)),
- skip_in_browser(false),
- match_edit_command(false) {
- CopyEventTo(native_event, &os_event);
-}
-
-NativeWebKeyboardEvent::NativeWebKeyboardEvent(wchar_t character,
- int state,
- double time_stamp_seconds)
- : WebKeyboardEvent(WebKeyboardEventBuilder::Build(character,
- state,
- time_stamp_seconds)),
- os_event(NULL),
- skip_in_browser(false),
- match_edit_command(false) {
-}
-
-NativeWebKeyboardEvent::NativeWebKeyboardEvent(
- const NativeWebKeyboardEvent& other)
- : WebKeyboardEvent(other),
- skip_in_browser(other.skip_in_browser),
- match_edit_command(other.match_edit_command) {
- CopyEventTo(other.os_event, &os_event);
-}
-
-NativeWebKeyboardEvent& NativeWebKeyboardEvent::operator=(
- const NativeWebKeyboardEvent& other) {
- WebKeyboardEvent::operator=(other);
-
- FreeEvent(os_event);
- CopyEventTo(other.os_event, &os_event);
-
- skip_in_browser = other.skip_in_browser;
- match_edit_command = other.match_edit_command;
-
- return *this;
-}
-
-NativeWebKeyboardEvent::~NativeWebKeyboardEvent() {
- FreeEvent(os_event);
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 62750cf..a1fb9f8 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1292,8 +1292,6 @@ TransportDIB* RenderProcessHostImpl::MapTransportDIB(
FILE_MAP_READ | FILE_MAP_WRITE,
FALSE, 0);
return TransportDIB::Map(section);
-#elif defined(TOOLKIT_GTK)
- return TransportDIB::Map(dib_id.shmkey);
#elif defined(OS_ANDROID)
return TransportDIB::Map(dib_id);
#else
@@ -1332,11 +1330,7 @@ TransportDIB* RenderProcessHostImpl::GetTransportDIB(
}
}
-#if defined(TOOLKIT_GTK)
- smallest_iterator->second->Detach();
-#else
delete smallest_iterator->second;
-#endif
cached_dibs_.erase(smallest_iterator);
}
@@ -1346,15 +1340,8 @@ TransportDIB* RenderProcessHostImpl::GetTransportDIB(
}
void RenderProcessHostImpl::ClearTransportDIBCache() {
-#if defined(TOOLKIT_GTK)
- std::map<TransportDIB::Id, TransportDIB*>::const_iterator dib =
- cached_dibs_.begin();
- for (; dib != cached_dibs_.end(); ++dib)
- dib->second->Detach();
-#else
STLDeleteContainerPairSecondPointers(
cached_dibs_.begin(), cached_dibs_.end());
-#endif
cached_dibs_.clear();
}
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index c7e66db..aee32a0 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -69,9 +69,7 @@
#include "ui/snapshot/snapshot.h"
#include "webkit/common/webpreferences.h"
-#if defined(TOOLKIT_GTK)
-#include "content/browser/renderer_host/backing_store_gtk.h"
-#elif defined(OS_MACOSX)
+#if defined(OS_MACOSX)
#include "content/browser/renderer_host/backing_store_mac.h"
#elif defined(OS_WIN)
#include "content/common/plugin_constants_win.h"
@@ -761,17 +759,7 @@ void RenderWidgetHostImpl::UnlockBackingStore() {
}
#endif
-#if defined(TOOLKIT_GTK)
-bool RenderWidgetHostImpl::CopyFromBackingStoreToGtkWindow(
- const gfx::Rect& dest_rect, GdkWindow* target) {
- BackingStore* backing_store = GetBackingStore(false);
- if (!backing_store)
- return false;
- (static_cast<BackingStoreGtk*>(backing_store))->PaintToRect(
- dest_rect, target);
- return true;
-}
-#elif defined(OS_MACOSX)
+#if defined(OS_MACOSX)
gfx::Size RenderWidgetHostImpl::GetBackingStoreSize() {
BackingStore* backing_store = GetBackingStore(false);
return backing_store ? backing_store->size() : gfx::Size();
diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc
index 4ce7eac..197960f 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.cc
+++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -34,13 +34,6 @@
#include "ui/gfx/win/hwnd_util.h"
#endif
-#if defined(TOOLKIT_GTK)
-#include <gdk/gdkx.h>
-#include <gtk/gtk.h>
-
-#include "content/browser/renderer_host/gtk_window_utils.h"
-#endif
-
namespace content {
// static
diff --git a/content/browser/renderer_host/render_widget_host_view_gtk.cc b/content/browser/renderer_host/render_widget_host_view_gtk.cc
deleted file mode 100644
index e8e713e..0000000
--- a/content/browser/renderer_host/render_widget_host_view_gtk.cc
+++ /dev/null
@@ -1,1621 +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/renderer_host/render_widget_host_view_gtk.h"
-
-#include <cairo/cairo.h>
-#include <gdk/gdk.h>
-#include <gdk/gdkkeysyms.h>
-#include <gdk/gdkx.h>
-#include <gtk/gtk.h>
-
-#include <algorithm>
-#include <string>
-
-#include "base/bind_helpers.h"
-#include "base/command_line.h"
-#include "base/debug/trace_event.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/metrics/histogram.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_offset_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
-#include "content/browser/accessibility/browser_accessibility_gtk.h"
-#include "content/browser/accessibility/browser_accessibility_manager_gtk.h"
-#include "content/browser/renderer_host/backing_store_gtk.h"
-#include "content/browser/renderer_host/gtk_im_context_wrapper.h"
-#include "content/browser/renderer_host/gtk_key_bindings_handler.h"
-#include "content/browser/renderer_host/gtk_window_utils.h"
-#include "content/browser/renderer_host/input/web_input_event_builders_gtk.h"
-#include "content/browser/renderer_host/render_view_host_delegate.h"
-#include "content/browser/renderer_host/render_view_host_impl.h"
-#include "content/common/cursors/webcursor_gtk_data.h"
-#include "content/common/gpu/gpu_messages.h"
-#include "content/common/input_messages.h"
-#include "content/common/view_messages.h"
-#include "content/common/webplugin_geometry.h"
-#include "content/public/browser/native_web_keyboard_event.h"
-#include "content/public/common/content_switches.h"
-#include "skia/ext/platform_canvas.h"
-#include "third_party/WebKit/public/platform/WebScreenInfo.h"
-#include "third_party/WebKit/public/web/WebInputEvent.h"
-#include "ui/base/clipboard/scoped_clipboard_writer.h"
-#include "ui/base/x/active_window_watcher_x.h"
-#include "ui/base/x/x11_util.h"
-#include "ui/gfx/gtk_compat.h"
-#include "ui/gfx/gtk_native_view_id_manager.h"
-#include "ui/gfx/gtk_preserve_window.h"
-#include "ui/gfx/text_elider.h"
-
-using blink::WebMouseWheelEvent;
-using blink::WebScreenInfo;
-
-#error "The GTK+ port will be deleted later this week. If you are seeing this, you are trying to compile it. Please check your gyp flags for 'use_aura=0' and remove them."
-
-namespace content {
-namespace {
-
-// Paint rects on Linux are bounded by the maximum size of a shared memory
-// region. By default that's 32MB, but many distros increase it significantly
-// (i.e. to 256MB).
-//
-// We fetch the maximum value from /proc/sys/kernel/shmmax at runtime and, if
-// we exceed that, then we limit the height of the paint rect in the renderer.
-//
-// These constants are here to ensure that, in the event that we exceed it, we
-// end up with something a little more square. Previously we had 4000x4000, but
-// people's monitor setups are actually exceeding that these days.
-const int kMaxWindowWidth = 10000;
-const int kMaxWindowHeight = 10000;
-
-const GdkColor kBGColor =
-#if defined(NDEBUG)
- { 0, 0xff * 257, 0xff * 257, 0xff * 257 };
-#else
- { 0, 0x00 * 257, 0xff * 257, 0x00 * 257 };
-#endif
-
-// Returns the spinning cursor used for loading state.
-GdkCursor* GetMozSpinningCursor() {
- static GdkCursor* moz_spinning_cursor = NULL;
- if (!moz_spinning_cursor) {
- const GdkColor fg = { 0, 0, 0, 0 };
- const GdkColor bg = { 65535, 65535, 65535, 65535 };
- GdkPixmap* source = gdk_bitmap_create_from_data(
- NULL, reinterpret_cast<const gchar*>(moz_spinning_bits), 32, 32);
- GdkPixmap* mask = gdk_bitmap_create_from_data(
- NULL, reinterpret_cast<const gchar*>(moz_spinning_mask_bits), 32, 32);
- moz_spinning_cursor =
- gdk_cursor_new_from_pixmap(source, mask, &fg, &bg, 2, 2);
- g_object_unref(source);
- g_object_unref(mask);
- }
- return moz_spinning_cursor;
-}
-
-bool MovedToPoint(const blink::WebMouseEvent& mouse_event,
- const gfx::Point& center) {
- return mouse_event.globalX == center.x() &&
- mouse_event.globalY == center.y();
-}
-
-} // namespace
-
-// This class is a simple convenience wrapper for Gtk functions. It has only
-// static methods.
-class RenderWidgetHostViewGtkWidget {
- public:
- static AtkObject* GetAccessible(void* userdata) {
- return (static_cast<RenderWidgetHostViewGtk*>(userdata))->
- GetAccessible();
- }
-
- static GtkWidget* CreateNewWidget(RenderWidgetHostViewGtk* host_view) {
- GtkWidget* widget = gtk_preserve_window_new();
- gtk_widget_set_name(widget, "chrome-render-widget-host-view");
- // We manually double-buffer in Paint() because Paint() may or may not be
- // called in repsonse to an "expose-event" signal.
- gtk_widget_set_double_buffered(widget, FALSE);
- gtk_widget_set_redraw_on_allocate(widget, FALSE);
- gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &kBGColor);
- // Allow the browser window to be resized freely.
- gtk_widget_set_size_request(widget, 0, 0);
-
- gtk_widget_add_events(widget, GDK_EXPOSURE_MASK |
- GDK_STRUCTURE_MASK |
- GDK_POINTER_MOTION_MASK |
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_KEY_PRESS_MASK |
- GDK_KEY_RELEASE_MASK |
- GDK_FOCUS_CHANGE_MASK |
- GDK_ENTER_NOTIFY_MASK |
- GDK_LEAVE_NOTIFY_MASK);
- gtk_widget_set_can_focus(widget, TRUE);
-
- g_signal_connect(widget, "expose-event",
- G_CALLBACK(OnExposeEvent), host_view);
- g_signal_connect(widget, "realize",
- G_CALLBACK(OnRealize), host_view);
- g_signal_connect(widget, "configure-event",
- G_CALLBACK(OnConfigureEvent), host_view);
- g_signal_connect(widget, "size-allocate",
- G_CALLBACK(OnSizeAllocate), host_view);
- g_signal_connect(widget, "key-press-event",
- G_CALLBACK(OnKeyPressReleaseEvent), host_view);
- g_signal_connect(widget, "key-release-event",
- G_CALLBACK(OnKeyPressReleaseEvent), host_view);
- g_signal_connect(widget, "focus-in-event",
- G_CALLBACK(OnFocusIn), host_view);
- g_signal_connect(widget, "focus-out-event",
- G_CALLBACK(OnFocusOut), host_view);
- g_signal_connect(widget, "grab-notify",
- G_CALLBACK(OnGrabNotify), host_view);
- g_signal_connect(widget, "button-press-event",
- G_CALLBACK(OnButtonPressReleaseEvent), host_view);
- g_signal_connect(widget, "button-release-event",
- G_CALLBACK(OnButtonPressReleaseEvent), host_view);
- g_signal_connect(widget, "motion-notify-event",
- G_CALLBACK(OnMouseMoveEvent), host_view);
- g_signal_connect(widget, "enter-notify-event",
- G_CALLBACK(OnCrossingEvent), host_view);
- g_signal_connect(widget, "leave-notify-event",
- G_CALLBACK(OnCrossingEvent), host_view);
- g_signal_connect(widget, "client-event",
- G_CALLBACK(OnClientEvent), host_view);
-
-
- // Connect after so that we are called after the handler installed by the
- // WebContentsView which handles zoom events.
- g_signal_connect_after(widget, "scroll-event",
- G_CALLBACK(OnMouseScrollEvent), host_view);
-
- // Route calls to get_accessible to the view.
- gtk_preserve_window_set_accessible_factory(
- GTK_PRESERVE_WINDOW(widget), GetAccessible, host_view);
-
- return widget;
- }
-
- private:
- static gboolean OnExposeEvent(GtkWidget* widget,
- GdkEventExpose* expose,
- RenderWidgetHostViewGtk* host_view) {
- if (host_view->host_->is_hidden())
- return FALSE;
- const gfx::Rect damage_rect(expose->area);
- host_view->Paint(damage_rect);
- return FALSE;
- }
-
- static gboolean OnRealize(GtkWidget* widget,
- RenderWidgetHostViewGtk* host_view) {
- // Use GtkSignalRegistrar to register events on a widget we don't
- // control the lifetime of, auto disconnecting at our end of our life.
- host_view->signals_.Connect(gtk_widget_get_toplevel(widget),
- "configure-event",
- G_CALLBACK(OnConfigureEvent), host_view);
- return FALSE;
- }
-
- static gboolean OnConfigureEvent(GtkWidget* widget,
- GdkEventConfigure* event,
- RenderWidgetHostViewGtk* host_view) {
- host_view->MarkCachedWidgetCenterStale();
- host_view->UpdateScreenInfo(host_view->GetNativeView());
- return FALSE;
- }
-
- static gboolean OnSizeAllocate(GtkWidget* widget,
- GdkRectangle* allocation,
- RenderWidgetHostViewGtk* host_view) {
- if (!host_view->IsPopup() && !host_view->is_fullscreen_)
- host_view->SetSize(gfx::Size(allocation->width, allocation->height));
- return FALSE;
- }
-
- static gboolean OnKeyPressReleaseEvent(GtkWidget* widget,
- GdkEventKey* event,
- RenderWidgetHostViewGtk* host_view) {
- TRACE_EVENT0("browser",
- "RenderWidgetHostViewGtkWidget::OnKeyPressReleaseEvent");
- // Force popups or fullscreen windows to close on Escape so they won't keep
- // the keyboard grabbed or be stuck onscreen if the renderer is hanging.
- bool should_close_on_escape =
- (host_view->IsPopup() && host_view->NeedsInputGrab()) ||
- host_view->is_fullscreen_;
- if (should_close_on_escape && GDK_Escape == event->keyval) {
- host_view->host_->Shutdown();
- } else {
- // Send key event to input method.
- host_view->im_context_->ProcessKeyEvent(event);
- }
-
- // We return TRUE because we did handle the event. If it turns out webkit
- // can't handle the event, we'll deal with it in
- // RenderView::UnhandledKeyboardEvent().
- return TRUE;
- }
-
- static gboolean OnFocusIn(GtkWidget* widget,
- GdkEventFocus* focus,
- RenderWidgetHostViewGtk* host_view) {
- host_view->ShowCurrentCursor();
- RenderWidgetHostImpl* host =
- RenderWidgetHostImpl::From(host_view->GetRenderWidgetHost());
- host->GotFocus();
- host->SetActive(true);
-
- // The only way to enable a GtkIMContext object is to call its focus in
- // handler.
- host_view->im_context_->OnFocusIn();
-
- return TRUE;
- }
-
- static gboolean OnFocusOut(GtkWidget* widget,
- GdkEventFocus* focus,
- RenderWidgetHostViewGtk* host_view) {
- // Whenever we lose focus, set the cursor back to that of our parent window,
- // which should be the default arrow.
- gdk_window_set_cursor(gtk_widget_get_window(widget), NULL);
- // If we are showing a context menu, maintain the illusion that webkit has
- // focus.
- if (!host_view->IsShowingContextMenu()) {
- RenderWidgetHostImpl* host =
- RenderWidgetHostImpl::From(host_view->GetRenderWidgetHost());
- host->SetActive(false);
- host->Blur();
- }
-
- // Prevents us from stealing input context focus in OnGrabNotify() handler.
- host_view->was_imcontext_focused_before_grab_ = false;
-
- // Disable the GtkIMContext object.
- host_view->im_context_->OnFocusOut();
-
- host_view->set_last_mouse_down(NULL);
-
- return TRUE;
- }
-
- // Called when we are shadowed or unshadowed by a keyboard grab (which will
- // occur for activatable popups, such as dropdown menus). Popup windows do not
- // take focus, so we never get a focus out or focus in event when they are
- // shown, and must rely on this signal instead.
- static void OnGrabNotify(GtkWidget* widget, gboolean was_grabbed,
- RenderWidgetHostViewGtk* host_view) {
- if (was_grabbed) {
- if (host_view->was_imcontext_focused_before_grab_)
- host_view->im_context_->OnFocusIn();
- } else {
- host_view->was_imcontext_focused_before_grab_ =
- host_view->im_context_->is_focused();
- if (host_view->was_imcontext_focused_before_grab_) {
- gdk_window_set_cursor(gtk_widget_get_window(widget), NULL);
- host_view->im_context_->OnFocusOut();
- }
- }
- }
-
- static gboolean OnButtonPressReleaseEvent(
- GtkWidget* widget,
- GdkEventButton* event,
- RenderWidgetHostViewGtk* host_view) {
- TRACE_EVENT0("browser",
- "RenderWidgetHostViewGtkWidget::OnButtonPressReleaseEvent");
-
- if (event->type != GDK_BUTTON_RELEASE)
- host_view->set_last_mouse_down(event);
-
- if (!(event->button == 1 || event->button == 2 || event->button == 3))
- return FALSE; // We do not forward any other buttons to the renderer.
- if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS)
- return FALSE;
-
- // If we don't have focus already, this mouse click will focus us.
- if (!gtk_widget_is_focus(widget))
- host_view->host_->OnPointerEventActivate();
-
- // Confirm existing composition text on mouse click events, to make sure
- // the input caret won't be moved with an ongoing composition session.
- if (event->type != GDK_BUTTON_RELEASE)
- host_view->im_context_->ConfirmComposition();
-
- // We want to translate the coordinates of events that do not originate
- // from this widget to be relative to the top left of the widget.
- GtkWidget* event_widget = gtk_get_event_widget(
- reinterpret_cast<GdkEvent*>(event));
- if (event_widget != widget) {
- int x = 0;
- int y = 0;
- gtk_widget_get_pointer(widget, &x, &y);
- // If the mouse event happens outside our popup, force the popup to
- // close. We do this so a hung renderer doesn't prevent us from
- // releasing the x pointer grab.
- GtkAllocation allocation;
- gtk_widget_get_allocation(widget, &allocation);
- bool click_in_popup = x >= 0 && y >= 0 && x < allocation.width &&
- y < allocation.height;
- // Only Shutdown on mouse downs. Mouse ups can occur outside the render
- // view if the user drags for DnD or while using the scrollbar on a select
- // dropdown. Don't shutdown if we are not a popup.
- if (event->type != GDK_BUTTON_RELEASE && host_view->IsPopup() &&
- !host_view->is_popup_first_mouse_release_ && !click_in_popup) {
- host_view->host_->Shutdown();
- return FALSE;
- }
- event->x = x;
- event->y = y;
- }
-
- // TODO(evanm): why is this necessary here but not in test shell?
- // This logic is the same as GtkButton.
- if (event->type == GDK_BUTTON_PRESS && !gtk_widget_has_focus(widget))
- gtk_widget_grab_focus(widget);
-
- host_view->is_popup_first_mouse_release_ = false;
- RenderWidgetHostImpl* widget_host =
- RenderWidgetHostImpl::From(host_view->GetRenderWidgetHost());
- if (widget_host)
- widget_host->ForwardMouseEvent(WebMouseEventBuilder::Build(event));
-
- // Although we did handle the mouse event, we need to let other handlers
- // run (in particular the one installed by WebContentsViewGtk).
- return FALSE;
- }
-
- static gboolean OnMouseMoveEvent(GtkWidget* widget,
- GdkEventMotion* event,
- RenderWidgetHostViewGtk* host_view) {
- TRACE_EVENT0("browser",
- "RenderWidgetHostViewGtkWidget::OnMouseMoveEvent");
- // We want to translate the coordinates of events that do not originate
- // from this widget to be relative to the top left of the widget.
- GtkWidget* event_widget = gtk_get_event_widget(
- reinterpret_cast<GdkEvent*>(event));
- if (event_widget != widget) {
- int x = 0;
- int y = 0;
- gtk_widget_get_pointer(widget, &x, &y);
- event->x = x;
- event->y = y;
- }
-
- host_view->ModifyEventForEdgeDragging(widget, event);
-
- blink::WebMouseEvent mouse_event = WebMouseEventBuilder::Build(event);
-
- if (host_view->mouse_locked_) {
- gfx::Point center = host_view->GetWidgetCenter();
-
- bool moved_to_center = MovedToPoint(mouse_event, center);
- if (moved_to_center)
- host_view->mouse_has_been_warped_to_new_center_ = true;
-
- host_view->ModifyEventMovementAndCoords(&mouse_event);
-
- if (!moved_to_center &&
- (mouse_event.movementX || mouse_event.movementY)) {
- GdkDisplay* display = gtk_widget_get_display(widget);
- GdkScreen* screen = gtk_widget_get_screen(widget);
- gdk_display_warp_pointer(display, screen, center.x(), center.y());
- if (host_view->mouse_has_been_warped_to_new_center_)
- RenderWidgetHostImpl::From(
- host_view->GetRenderWidgetHost())->ForwardMouseEvent(mouse_event);
- }
- } else { // Mouse is not locked.
- host_view->ModifyEventMovementAndCoords(&mouse_event);
- // Do not send mouse events while the mouse cursor is being warped back
- // to the unlocked location.
- if (!host_view->mouse_is_being_warped_to_unlocked_position_) {
- RenderWidgetHostImpl::From(
- host_view->GetRenderWidgetHost())->ForwardMouseEvent(mouse_event);
- }
- }
- return FALSE;
- }
-
- static gboolean OnCrossingEvent(GtkWidget* widget,
- GdkEventCrossing* event,
- RenderWidgetHostViewGtk* host_view) {
- TRACE_EVENT0("browser",
- "RenderWidgetHostViewGtkWidget::OnCrossingEvent");
- const int any_button_mask =
- GDK_BUTTON1_MASK |
- GDK_BUTTON2_MASK |
- GDK_BUTTON3_MASK |
- GDK_BUTTON4_MASK |
- GDK_BUTTON5_MASK;
-
- // Only forward crossing events if the mouse button is not down.
- // (When the mouse button is down, the proper events are already being
- // sent by ButtonPressReleaseEvent and MouseMoveEvent, above, and if we
- // additionally send this crossing event with the state indicating the
- // button is down, it causes problems with drag and drop in WebKit.)
- if (!(event->state & any_button_mask)) {
- blink::WebMouseEvent mouse_event = WebMouseEventBuilder::Build(event);
- host_view->ModifyEventMovementAndCoords(&mouse_event);
- // When crossing out and back into a render view the movement values
- // must represent the instantaneous movement of the mouse, not the jump
- // from the exit to re-entry point.
- mouse_event.movementX = 0;
- mouse_event.movementY = 0;
- RenderWidgetHostImpl::From(
- host_view->GetRenderWidgetHost())->ForwardMouseEvent(mouse_event);
- }
-
- return FALSE;
- }
-
- static gboolean OnClientEvent(GtkWidget* widget,
- GdkEventClient* event,
- RenderWidgetHostViewGtk* host_view) {
- VLOG(1) << "client event type: " << event->message_type
- << " data_format: " << event->data_format
- << " data: " << event->data.l;
- return TRUE;
- }
-
- // Return the net up / down (or left / right) distance represented by events
- // in the events will be removed from the queue. We only look at the top of
- // queue...any other type of event will cause us not to look farther.
- // If there is a change to the set of modifier keys or scroll axis
- // in the events we will stop looking as well.
- static int GetPendingScrollDelta(bool vert, guint current_event_state) {
- int num_clicks = 0;
- GdkEvent* event;
- bool event_coalesced = true;
- while ((event = gdk_event_get()) && event_coalesced) {
- event_coalesced = false;
- if (event->type == GDK_SCROLL) {
- GdkEventScroll scroll = event->scroll;
- if (scroll.state & GDK_SHIFT_MASK) {
- if (scroll.direction == GDK_SCROLL_UP)
- scroll.direction = GDK_SCROLL_LEFT;
- else if (scroll.direction == GDK_SCROLL_DOWN)
- scroll.direction = GDK_SCROLL_RIGHT;
- }
- if (vert) {
- if (scroll.direction == GDK_SCROLL_UP ||
- scroll.direction == GDK_SCROLL_DOWN) {
- if (scroll.state == current_event_state) {
- num_clicks += (scroll.direction == GDK_SCROLL_UP ? 1 : -1);
- gdk_event_free(event);
- event_coalesced = true;
- }
- }
- } else {
- if (scroll.direction == GDK_SCROLL_LEFT ||
- scroll.direction == GDK_SCROLL_RIGHT) {
- if (scroll.state == current_event_state) {
- num_clicks += (scroll.direction == GDK_SCROLL_LEFT ? 1 : -1);
- gdk_event_free(event);
- event_coalesced = true;
- }
- }
- }
- }
- }
- // If we have an event left we put it back on the queue.
- if (event) {
- gdk_event_put(event);
- gdk_event_free(event);
- }
- return num_clicks * WebMouseWheelEventBuilder::ScrollbarPixelsPerTick();
- }
-
- static gboolean OnMouseScrollEvent(GtkWidget* widget,
- GdkEventScroll* event,
- RenderWidgetHostViewGtk* host_view) {
- TRACE_EVENT0("browser",
- "RenderWidgetHostViewGtkWidget::OnMouseScrollEvent");
- // If the user is holding shift, translate it into a horizontal scroll. We
- // don't care what other modifiers the user may be holding (zooming is
- // handled at the WebContentsView level).
- if (event->state & GDK_SHIFT_MASK) {
- if (event->direction == GDK_SCROLL_UP)
- event->direction = GDK_SCROLL_LEFT;
- else if (event->direction == GDK_SCROLL_DOWN)
- event->direction = GDK_SCROLL_RIGHT;
- }
-
- WebMouseWheelEvent web_event = WebMouseWheelEventBuilder::Build(event);
- const float pixelsPerTick =
- WebMouseWheelEventBuilder::ScrollbarPixelsPerTick();
- // We peek ahead at the top of the queue to look for additional pending
- // scroll events.
- if (event->direction == GDK_SCROLL_UP ||
- event->direction == GDK_SCROLL_DOWN) {
- if (event->direction == GDK_SCROLL_UP)
- web_event.deltaY = pixelsPerTick;
- else
- web_event.deltaY = -pixelsPerTick;
- web_event.deltaY += GetPendingScrollDelta(true, event->state);
- } else {
- if (event->direction == GDK_SCROLL_LEFT)
- web_event.deltaX = pixelsPerTick;
- else
- web_event.deltaX = -pixelsPerTick;
- web_event.deltaX += GetPendingScrollDelta(false, event->state);
- }
- RenderWidgetHostImpl::From(
- host_view->GetRenderWidgetHost())->ForwardWheelEvent(web_event);
- return FALSE;
- }
-
- DISALLOW_IMPLICIT_CONSTRUCTORS(RenderWidgetHostViewGtkWidget);
-};
-
-RenderWidgetHostViewGtk::RenderWidgetHostViewGtk(RenderWidgetHost* widget_host)
- : host_(RenderWidgetHostImpl::From(widget_host)),
- about_to_validate_and_paint_(false),
- is_loading_(false),
- parent_(NULL),
- is_popup_first_mouse_release_(true),
- was_imcontext_focused_before_grab_(false),
- do_x_grab_(false),
- is_fullscreen_(false),
- made_active_(false),
- mouse_is_being_warped_to_unlocked_position_(false),
- destroy_handler_id_(0),
- dragged_at_horizontal_edge_(0),
- dragged_at_vertical_edge_(0),
- compositing_surface_(gfx::kNullPluginWindow),
- last_mouse_down_(NULL) {
- host_->SetView(this);
-}
-
-RenderWidgetHostViewGtk::~RenderWidgetHostViewGtk() {
- UnlockMouse();
- set_last_mouse_down(NULL);
- view_.Destroy();
-}
-
-bool RenderWidgetHostViewGtk::OnMessageReceived(const IPC::Message& message) {
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewGtk, message)
- IPC_MESSAGE_HANDLER(ViewHostMsg_CreatePluginContainer,
- OnCreatePluginContainer)
- IPC_MESSAGE_HANDLER(ViewHostMsg_DestroyPluginContainer,
- OnDestroyPluginContainer)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
-}
-
-void RenderWidgetHostViewGtk::InitAsChild(
- gfx::NativeView parent_view) {
- DoSharedInit();
- gtk_widget_show(view_.get());
-}
-
-void RenderWidgetHostViewGtk::InitAsPopup(
- RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) {
- // If we aren't a popup, then |window| will be leaked.
- DCHECK(IsPopup());
-
- DoSharedInit();
- parent_ = parent_host_view->GetNativeView();
- GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_POPUP));
- gtk_container_add(GTK_CONTAINER(window), view_.get());
- DoPopupOrFullscreenInit(window, pos);
-
- // Grab all input for the app. If a click lands outside the bounds of the
- // popup, WebKit will notice and destroy us. The underlying X window needs to
- // be created and mapped by the above code before we can grab the input
- // devices.
- if (NeedsInputGrab()) {
- // If our parent is in a widget hierarchy that ends with a window, add
- // ourselves to the same window group to make sure that our GTK grab
- // covers it.
- GtkWidget* toplevel = gtk_widget_get_toplevel(parent_);
- if (toplevel &&
- GTK_WIDGET_TOPLEVEL(toplevel) &&
- GTK_IS_WINDOW(toplevel)) {
- gtk_window_group_add_window(
- gtk_window_get_group(GTK_WINDOW(toplevel)), window);
- }
-
- // Install an application-level GTK grab to make sure that we receive all of
- // the app's input.
- gtk_grab_add(view_.get());
-
- // We need to install an X grab as well. However if the app already has an X
- // grab (as in the case of extension popup), an app grab will suffice.
- do_x_grab_ = !gdk_pointer_is_grabbed();
- if (do_x_grab_) {
- // Install the grab on behalf our parent window if it and all of its
- // ancestors are mapped; otherwise, just use ourselves (maybe we're being
- // shown on behalf of an inactive tab).
- GdkWindow* grab_window = gtk_widget_get_window(parent_);
- if (!grab_window || !gdk_window_is_viewable(grab_window))
- grab_window = gtk_widget_get_window(view_.get());
-
- gdk_pointer_grab(
- grab_window,
- TRUE, // Only events outside of the window are reported with
- // respect to |parent_->window|.
- static_cast<GdkEventMask>(GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK),
- NULL,
- NULL,
- GDK_CURRENT_TIME);
- // We grab keyboard events too so things like alt+tab are eaten.
- gdk_keyboard_grab(grab_window, TRUE, GDK_CURRENT_TIME);
- }
- }
-}
-
-void RenderWidgetHostViewGtk::InitAsFullscreen(
- RenderWidgetHostView* reference_host_view) {
- DCHECK(reference_host_view);
- DoSharedInit();
-
- is_fullscreen_ = true;
- GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
- gtk_window_set_decorated(window, FALSE);
- destroy_handler_id_ = g_signal_connect(GTK_WIDGET(window),
- "destroy",
- G_CALLBACK(OnDestroyThunk),
- this);
- gtk_container_add(GTK_CONTAINER(window), view_.get());
-
- // Try to move and resize the window to cover the screen in case the window
- // manager doesn't support _NET_WM_STATE_FULLSCREEN.
- GdkScreen* screen = gtk_window_get_screen(window);
- GdkWindow* ref_gdk_window = gtk_widget_get_window(
- reference_host_view->GetNativeView());
-
- gfx::Rect bounds;
- if (ref_gdk_window) {
- const int monitor_id = gdk_screen_get_monitor_at_window(screen,
- ref_gdk_window);
- GdkRectangle monitor_rect;
- gdk_screen_get_monitor_geometry(screen, monitor_id, &monitor_rect);
- bounds = gfx::Rect(monitor_rect);
- } else {
- bounds = gfx::Rect(
- 0, 0, gdk_screen_get_width(screen), gdk_screen_get_height(screen));
- }
- gtk_window_move(window, bounds.x(), bounds.y());
- gtk_window_resize(window, bounds.width(), bounds.height());
- gtk_window_fullscreen(window);
- DoPopupOrFullscreenInit(window, bounds);
-}
-
-RenderWidgetHost* RenderWidgetHostViewGtk::GetRenderWidgetHost() const {
- return host_;
-}
-
-void RenderWidgetHostViewGtk::WasShown() {
- if (!host_ || !host_->is_hidden())
- return;
-
- if (web_contents_switch_paint_time_.is_null())
- web_contents_switch_paint_time_ = base::TimeTicks::Now();
-
- host_->WasShown();
-}
-
-void RenderWidgetHostViewGtk::WasHidden() {
- if (!host_ || host_->is_hidden())
- return;
-
- // If we have a renderer, then inform it that we are being hidden so it can
- // reduce its resource utilization.
- host_->WasHidden();
-
- web_contents_switch_paint_time_ = base::TimeTicks();
-}
-
-void RenderWidgetHostViewGtk::SetSize(const gfx::Size& size) {
- int width = std::min(size.width(), kMaxWindowWidth);
- int height = std::min(size.height(), kMaxWindowHeight);
- if (IsPopup()) {
- // We're a popup, honor the size request.
- gtk_widget_set_size_request(view_.get(), width, height);
- }
-
- // Update the size of the RWH.
- if (requested_size_.width() != width ||
- requested_size_.height() != height) {
- requested_size_ = gfx::Size(width, height);
- host_->SendScreenRects();
- host_->WasResized();
- }
-}
-
-void RenderWidgetHostViewGtk::SetBounds(const gfx::Rect& rect) {
- // This is called when webkit has sent us a Move message.
- if (IsPopup()) {
- gtk_window_move(GTK_WINDOW(gtk_widget_get_toplevel(view_.get())),
- rect.x(), rect.y());
- }
-
- SetSize(rect.size());
-}
-
-gfx::NativeView RenderWidgetHostViewGtk::GetNativeView() const {
- return view_.get();
-}
-
-gfx::NativeViewId RenderWidgetHostViewGtk::GetNativeViewId() const {
- return GtkNativeViewManager::GetInstance()->GetIdForWidget(view_.get());
-}
-
-gfx::NativeViewAccessible RenderWidgetHostViewGtk::GetNativeViewAccessible() {
- NOTIMPLEMENTED();
- return NULL;
-}
-
-void RenderWidgetHostViewGtk::MovePluginWindows(
- const gfx::Vector2d& scroll_offset,
- const std::vector<WebPluginGeometry>& moves) {
- for (size_t i = 0; i < moves.size(); ++i) {
- plugin_container_manager_.MovePluginContainer(moves[i]);
- }
-}
-
-void RenderWidgetHostViewGtk::Focus() {
- gtk_widget_grab_focus(view_.get());
-}
-
-void RenderWidgetHostViewGtk::Blur() {
- // TODO(estade): We should be clearing native focus as well, but I know of no
- // way to do that without focusing another widget.
- host_->Blur();
-}
-
-bool RenderWidgetHostViewGtk::HasFocus() const {
- return gtk_widget_has_focus(view_.get());
-}
-
-void RenderWidgetHostViewGtk::ActiveWindowChanged(GdkWindow* window) {
- GdkWindow* our_window = gtk_widget_get_parent_window(view_.get());
-
- if (our_window == window)
- made_active_ = true;
-
- // If the window was previously active, but isn't active anymore, shut it
- // down.
- if (is_fullscreen_ && our_window != window && made_active_)
- host_->Shutdown();
-}
-
-bool RenderWidgetHostViewGtk::Send(IPC::Message* message) {
- return host_->Send(message);
-}
-
-bool RenderWidgetHostViewGtk::IsSurfaceAvailableForCopy() const {
- return true;
-}
-
-void RenderWidgetHostViewGtk::Show() {
- gtk_widget_show(view_.get());
- WasShown();
-}
-
-void RenderWidgetHostViewGtk::Hide() {
- gtk_widget_hide(view_.get());
- WasHidden();
-}
-
-bool RenderWidgetHostViewGtk::IsShowing() {
- return gtk_widget_get_visible(view_.get());
-}
-
-gfx::Rect RenderWidgetHostViewGtk::GetViewBounds() const {
- GdkWindow* gdk_window = gtk_widget_get_window(view_.get());
- if (!gdk_window)
- return gfx::Rect(requested_size_);
- GdkRectangle window_rect;
- gdk_window_get_origin(gdk_window, &window_rect.x, &window_rect.y);
- return gfx::Rect(window_rect.x, window_rect.y,
- requested_size_.width(), requested_size_.height());
-}
-
-void RenderWidgetHostViewGtk::UpdateCursor(const WebCursor& cursor) {
- // Optimize the common case, where the cursor hasn't changed.
- // However, we can switch between different pixmaps, so only on the
- // non-pixmap branch.
- if (current_cursor_.GetCursorType() != GDK_CURSOR_IS_PIXMAP &&
- current_cursor_.GetCursorType() == cursor.GetCursorType()) {
- return;
- }
-
- current_cursor_ = cursor;
- ShowCurrentCursor();
-}
-
-void RenderWidgetHostViewGtk::SetIsLoading(bool is_loading) {
- is_loading_ = is_loading;
- // Only call ShowCurrentCursor() when it will actually change the cursor.
- if (current_cursor_.GetCursorType() == GDK_LAST_CURSOR)
- ShowCurrentCursor();
-}
-
-void RenderWidgetHostViewGtk::TextInputTypeChanged(
- ui::TextInputType type,
- ui::TextInputMode input_mode,
- bool can_compose_inline) {
- im_context_->UpdateInputMethodState(type, can_compose_inline);
-}
-
-void RenderWidgetHostViewGtk::ImeCancelComposition() {
- im_context_->CancelComposition();
-}
-
-void RenderWidgetHostViewGtk::DidUpdateBackingStore(
- const gfx::Rect& scroll_rect,
- const gfx::Vector2d& scroll_delta,
- const std::vector<gfx::Rect>& copy_rects,
- const std::vector<ui::LatencyInfo>& latency_info) {
- TRACE_EVENT0("ui::gtk", "RenderWidgetHostViewGtk::DidUpdateBackingStore");
- for (size_t i = 0; i < latency_info.size(); i++)
- software_latency_info_.push_back(latency_info[i]);
-
- if (host_->is_hidden())
- return;
-
- // TODO(darin): Implement the equivalent of Win32's ScrollWindowEX. Can that
- // be done using XCopyArea? Perhaps similar to
- // BackingStore::ScrollBackingStore?
- if (about_to_validate_and_paint_)
- invalid_rect_.Union(scroll_rect);
- else
- Paint(scroll_rect);
-
- for (size_t i = 0; i < copy_rects.size(); ++i) {
- // Avoid double painting. NOTE: This is only relevant given the call to
- // Paint(scroll_rect) above.
- gfx::Rect rect = gfx::SubtractRects(copy_rects[i], scroll_rect);
- if (rect.IsEmpty())
- continue;
-
- if (about_to_validate_and_paint_)
- invalid_rect_.Union(rect);
- else
- Paint(rect);
- }
-}
-
-void RenderWidgetHostViewGtk::RenderProcessGone(base::TerminationStatus status,
- int error_code) {
- Destroy();
- plugin_container_manager_.set_host_widget(NULL);
-}
-
-void RenderWidgetHostViewGtk::Destroy() {
- if (compositing_surface_ != gfx::kNullPluginWindow) {
- GtkNativeViewManager* manager = GtkNativeViewManager::GetInstance();
- manager->ReleasePermanentXID(compositing_surface_);
- }
-
- if (do_x_grab_) {
- // Undo the X grab.
- GdkDisplay* display = gtk_widget_get_display(parent_);
- gdk_display_pointer_ungrab(display, GDK_CURRENT_TIME);
- gdk_display_keyboard_ungrab(display, GDK_CURRENT_TIME);
- }
-
- if (view_.get()) {
- // If this is a popup or fullscreen widget, then we need to destroy the
- // window that we created to hold it.
- if (IsPopup() || is_fullscreen_) {
- GtkWidget* window = gtk_widget_get_parent(view_.get());
-
- ui::ActiveWindowWatcherX::RemoveObserver(this);
-
- // Disconnect the destroy handler so that we don't try to shutdown twice.
- if (is_fullscreen_)
- g_signal_handler_disconnect(window, destroy_handler_id_);
-
- gtk_widget_destroy(window);
- }
-
- // Remove |view_| from all containers now, so nothing else can hold a
- // reference to |view_|'s widget except possibly a gtk signal handler if
- // this code is currently executing within the context of a gtk signal
- // handler. Note that |view_| is still alive after this call. It will be
- // deallocated in the destructor.
- // See http://crbug.com/11847 for details.
- gtk_widget_destroy(view_.get());
- }
-
- // The RenderWidgetHost's destruction led here, so don't call it.
- host_ = NULL;
-
- base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
-}
-
-void RenderWidgetHostViewGtk::SetTooltipText(
- const base::string16& tooltip_text) {
- // Maximum number of characters we allow in a tooltip.
- const int kMaxTooltipLength = 8 << 10;
- // Clamp the tooltip length to kMaxTooltipLength so that we don't
- // accidentally DOS the user with a mega tooltip (since GTK doesn't do
- // this itself).
- // I filed https://bugzilla.gnome.org/show_bug.cgi?id=604641 upstream.
- const base::string16 clamped_tooltip =
- gfx::TruncateString(tooltip_text, kMaxTooltipLength);
-
- if (clamped_tooltip.empty()) {
- gtk_widget_set_has_tooltip(view_.get(), FALSE);
- } else {
- gtk_widget_set_tooltip_text(view_.get(),
- base::UTF16ToUTF8(clamped_tooltip).c_str());
- }
-}
-
-void RenderWidgetHostViewGtk::SelectionChanged(const base::string16& text,
- size_t offset,
- const gfx::Range& range) {
- RenderWidgetHostViewBase::SelectionChanged(text, offset, range);
-
- if (text.empty() || range.is_empty())
- return;
- size_t pos = range.GetMin() - offset;
- size_t n = range.length();
-
- DCHECK(pos + n <= text.length()) << "The text can not fully cover range.";
- if (pos >= text.length()) {
- NOTREACHED() << "The text can not cover range.";
- return;
- }
-
- // Set the CLIPBOARD_TYPE SELECTION to the ui::Clipboard.
- ui::ScopedClipboardWriter clipboard_writer(
- ui::Clipboard::GetForCurrentThread(),
- ui::CLIPBOARD_TYPE_SELECTION);
- clipboard_writer.WriteText(text.substr(pos, n));
-}
-
-void RenderWidgetHostViewGtk::SelectionBoundsChanged(
- const ViewHostMsg_SelectionBounds_Params& params) {
- im_context_->UpdateCaretBounds(
- gfx::UnionRects(params.anchor_rect, params.focus_rect));
-}
-
-void RenderWidgetHostViewGtk::ScrollOffsetChanged() {
-}
-
-GdkEventButton* RenderWidgetHostViewGtk::GetLastMouseDown() {
- return last_mouse_down_;
-}
-
-gfx::NativeView RenderWidgetHostViewGtk::BuildInputMethodsGtkMenu() {
- return im_context_->BuildInputMethodsGtkMenu();
-}
-
-void RenderWidgetHostViewGtk::OnDestroy(GtkWidget* widget) {
- DCHECK(is_fullscreen_);
- host_->Shutdown();
-}
-
-bool RenderWidgetHostViewGtk::NeedsInputGrab() {
- return popup_type_ == blink::WebPopupTypeSelect;
-}
-
-bool RenderWidgetHostViewGtk::IsPopup() const {
- return popup_type_ != blink::WebPopupTypeNone;
-}
-
-void RenderWidgetHostViewGtk::DoSharedInit() {
- view_.Own(RenderWidgetHostViewGtkWidget::CreateNewWidget(this));
- im_context_.reset(new GtkIMContextWrapper(this));
- plugin_container_manager_.set_host_widget(view_.get());
- key_bindings_handler_.reset(new GtkKeyBindingsHandler(view_.get()));
-}
-
-void RenderWidgetHostViewGtk::DoPopupOrFullscreenInit(GtkWindow* window,
- const gfx::Rect& bounds) {
- requested_size_.SetSize(std::min(bounds.width(), kMaxWindowWidth),
- std::min(bounds.height(), kMaxWindowHeight));
- host_->WasResized();
-
- ui::ActiveWindowWatcherX::AddObserver(this);
-
- // Don't set the size when we're going fullscreen. This can confuse the
- // window manager into thinking we're resizing a fullscreen window and
- // therefore not fullscreen anymore.
- if (!is_fullscreen_) {
- gtk_widget_set_size_request(
- view_.get(), requested_size_.width(), requested_size_.height());
-
- // Don't allow the window to be resized. This also forces the window to
- // shrink down to the size of its child contents.
- gtk_window_set_resizable(window, FALSE);
- gtk_window_set_default_size(window, -1, -1);
- gtk_window_move(window, bounds.x(), bounds.y());
- }
-
- gtk_widget_show_all(GTK_WIDGET(window));
-}
-
-BackingStore* RenderWidgetHostViewGtk::AllocBackingStore(
- const gfx::Size& size) {
- gint depth = gdk_visual_get_depth(gtk_widget_get_visual(view_.get()));
- return new BackingStoreGtk(host_, size,
- ui::GetVisualFromGtkWidget(view_.get()),
- depth);
-}
-
-// NOTE: |output| is initialized with the size of |src_subrect|, and |dst_size|
-// is ignored on GTK.
-void RenderWidgetHostViewGtk::CopyFromCompositingSurface(
- const gfx::Rect& src_subrect,
- const gfx::Size& /* dst_size */,
- const base::Callback<void(bool, const SkBitmap&)>& callback,
- SkBitmap::Config config) {
- if (config != SkBitmap::kARGB_8888_Config) {
- NOTIMPLEMENTED();
- callback.Run(false, SkBitmap());
- }
- // Grab the snapshot from the renderer as that's the only reliable way to
- // readback from the GPU for this platform right now.
- GetRenderWidgetHost()->GetSnapshotFromRenderer(src_subrect, callback);
-}
-
-void RenderWidgetHostViewGtk::CopyFromCompositingSurfaceToVideoFrame(
- const gfx::Rect& src_subrect,
- const scoped_refptr<media::VideoFrame>& target,
- const base::Callback<void(bool)>& callback) {
- NOTIMPLEMENTED();
- callback.Run(false);
-}
-
-bool RenderWidgetHostViewGtk::CanCopyToVideoFrame() const {
- return false;
-}
-
-void RenderWidgetHostViewGtk::AcceleratedSurfaceInitialized(int host_id,
- int route_id) {
-}
-
-void RenderWidgetHostViewGtk::AcceleratedSurfaceBuffersSwapped(
- const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params,
- int gpu_host_id) {
- AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
- ack_params.sync_point = 0;
- RenderWidgetHostImpl::AcknowledgeBufferPresent(
- params.route_id, gpu_host_id, ack_params);
- RenderWidgetHostImpl::CompositorFrameDrawn(params.latency_info);
-}
-
-void RenderWidgetHostViewGtk::AcceleratedSurfacePostSubBuffer(
- const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
- int gpu_host_id) {
- AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
- ack_params.sync_point = 0;
- RenderWidgetHostImpl::AcknowledgeBufferPresent(
- params.route_id, gpu_host_id, ack_params);
- RenderWidgetHostImpl::CompositorFrameDrawn(params.latency_info);
-}
-
-void RenderWidgetHostViewGtk::AcceleratedSurfaceSuspend() {
-}
-
-void RenderWidgetHostViewGtk::AcceleratedSurfaceRelease() {
-}
-
-bool RenderWidgetHostViewGtk::HasAcceleratedSurface(
- const gfx::Size& desired_size) {
- // TODO(jbates) Implement this so this view can use GetBackingStore for both
- // software and GPU frames. Defaulting to false just makes GetBackingStore
- // only useable for software frames.
- return false;
-}
-
-void RenderWidgetHostViewGtk::SetBackground(const SkBitmap& background) {
- RenderWidgetHostViewBase::SetBackground(background);
- Send(new ViewMsg_SetBackground(host_->GetRoutingID(), background));
-}
-
-void RenderWidgetHostViewGtk::ModifyEventForEdgeDragging(
- GtkWidget* widget, GdkEventMotion* event) {
- // If the widget is aligned with an edge of the monitor its on and the user
- // attempts to drag past that edge we track the number of times it has
- // occurred, so that we can force the widget to scroll when it otherwise
- // would be unable to, by modifying the (x,y) position in the drag
- // event that we forward on to webkit. If we get a move that's no longer a
- // drag or a drag indicating the user is no longer at that edge we stop
- // altering the drag events.
- int new_dragged_at_horizontal_edge = 0;
- int new_dragged_at_vertical_edge = 0;
- // Used for checking the edges of the monitor. We cache the values to save
- // roundtrips to the X server.
- CR_DEFINE_STATIC_LOCAL(gfx::Size, drag_monitor_size, ());
- if (event->state & GDK_BUTTON1_MASK) {
- if (drag_monitor_size.IsEmpty()) {
- // We can safely cache the monitor size for the duration of a drag.
- GdkScreen* screen = gtk_widget_get_screen(widget);
- int monitor =
- gdk_screen_get_monitor_at_point(screen, event->x_root, event->y_root);
- GdkRectangle geometry;
- gdk_screen_get_monitor_geometry(screen, monitor, &geometry);
- drag_monitor_size.SetSize(geometry.width, geometry.height);
- }
- GtkAllocation allocation;
- gtk_widget_get_allocation(widget, &allocation);
- // Check X and Y independently, as the user could be dragging into a corner.
- if (event->x == 0 && event->x_root == 0) {
- new_dragged_at_horizontal_edge = dragged_at_horizontal_edge_ - 1;
- } else if (allocation.width - 1 == static_cast<gint>(event->x) &&
- drag_monitor_size.width() - 1 == static_cast<gint>(event->x_root)) {
- new_dragged_at_horizontal_edge = dragged_at_horizontal_edge_ + 1;
- }
-
- if (event->y == 0 && event->y_root == 0) {
- new_dragged_at_vertical_edge = dragged_at_vertical_edge_ - 1;
- } else if (allocation.height - 1 == static_cast<gint>(event->y) &&
- drag_monitor_size.height() - 1 == static_cast<gint>(event->y_root)) {
- new_dragged_at_vertical_edge = dragged_at_vertical_edge_ + 1;
- }
-
- event->x_root += new_dragged_at_horizontal_edge;
- event->x += new_dragged_at_horizontal_edge;
- event->y_root += new_dragged_at_vertical_edge;
- event->y += new_dragged_at_vertical_edge;
- } else {
- // Clear whenever we get a non-drag mouse move.
- drag_monitor_size.SetSize(0, 0);
- }
- dragged_at_horizontal_edge_ = new_dragged_at_horizontal_edge;
- dragged_at_vertical_edge_ = new_dragged_at_vertical_edge;
-}
-
-void RenderWidgetHostViewGtk::Paint(const gfx::Rect& damage_rect) {
- TRACE_EVENT0("ui::gtk", "RenderWidgetHostViewGtk::Paint");
-
- // If the GPU process is rendering directly into the View,
- // call the compositor directly.
- RenderWidgetHostImpl* render_widget_host =
- RenderWidgetHostImpl::From(GetRenderWidgetHost());
- if (render_widget_host->is_accelerated_compositing_active()) {
- host_->ScheduleComposite();
- return;
- }
-
- GdkWindow* window = gtk_widget_get_window(view_.get());
- DCHECK(!about_to_validate_and_paint_);
-
- invalid_rect_ = damage_rect;
- about_to_validate_and_paint_ = true;
-
- // If the size of our canvas is (0,0), then we don't want to block here. We
- // are doing one of our first paints and probably have animations going on.
- bool force_create = !host_->empty();
- BackingStoreGtk* backing_store = static_cast<BackingStoreGtk*>(
- host_->GetBackingStore(force_create));
- // Calling GetBackingStore maybe have changed |invalid_rect_|...
- about_to_validate_and_paint_ = false;
-
- gfx::Rect paint_rect = gfx::Rect(0, 0, kMaxWindowWidth, kMaxWindowHeight);
- paint_rect.Intersect(invalid_rect_);
-
- if (backing_store) {
- // Only render the widget if it is attached to a window; there's a short
- // period where this object isn't attached to a window but hasn't been
- // Destroy()ed yet and it receives paint messages...
- if (window) {
- backing_store->XShowRect(gfx::Point(0, 0),
- paint_rect, ui::GetX11WindowFromGtkWidget(view_.get()));
- }
- if (!whiteout_start_time_.is_null()) {
- base::TimeDelta whiteout_duration = base::TimeTicks::Now() -
- whiteout_start_time_;
- UMA_HISTOGRAM_TIMES("MPArch.RWHH_WhiteoutDuration", whiteout_duration);
-
- // Reset the start time to 0 so that we start recording again the next
- // time the backing store is NULL...
- whiteout_start_time_ = base::TimeTicks();
- }
- if (!web_contents_switch_paint_time_.is_null()) {
- base::TimeDelta web_contents_switch_paint_duration =
- base::TimeTicks::Now() - web_contents_switch_paint_time_;
- UMA_HISTOGRAM_TIMES("MPArch.RWH_TabSwitchPaintDuration",
- web_contents_switch_paint_duration);
- // Reset web_contents_switch_paint_time_ to 0 so future tab selections are
- // recorded.
- web_contents_switch_paint_time_ = base::TimeTicks();
- }
-
- for (size_t i = 0; i < software_latency_info_.size(); i++) {
- software_latency_info_[i].AddLatencyNumber(
- ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0);
- render_widget_host->FrameSwapped(software_latency_info_[i]);
- }
- software_latency_info_.clear();
- } else {
- if (window)
- gdk_window_clear(window);
- if (whiteout_start_time_.is_null())
- whiteout_start_time_ = base::TimeTicks::Now();
- }
-}
-
-void RenderWidgetHostViewGtk::ShowCurrentCursor() {
- // The widget may not have a window. If that's the case, abort mission. This
- // is the same issue as that explained above in Paint().
- if (!gtk_widget_get_window(view_.get()))
- return;
-
- // TODO(port): WebKit bug https://bugs.webkit.org/show_bug.cgi?id=16388 is
- // that calling gdk_window_set_cursor repeatedly is expensive. We should
- // avoid it here where possible.
- GdkCursor* gdk_cursor;
- if (current_cursor_.GetCursorType() == GDK_LAST_CURSOR) {
- // Use MOZ_CURSOR_SPINNING if we are showing the default cursor and
- // the page is loading.
- gdk_cursor = is_loading_ ? GetMozSpinningCursor() : NULL;
- } else {
- gdk_cursor = current_cursor_.GetNativeCursor();
- }
- gdk_window_set_cursor(gtk_widget_get_window(view_.get()), gdk_cursor);
-}
-
-void RenderWidgetHostViewGtk::SetHasHorizontalScrollbar(
- bool has_horizontal_scrollbar) {
-}
-
-void RenderWidgetHostViewGtk::SetScrollOffsetPinning(
- bool is_pinned_to_left, bool is_pinned_to_right) {
-}
-
-
-void RenderWidgetHostViewGtk::OnAcceleratedCompositingStateChange() {
- bool activated = host_->is_accelerated_compositing_active();
- GtkPreserveWindow* widget = reinterpret_cast<GtkPreserveWindow*>(view_.get());
-
- gtk_preserve_window_delegate_resize(widget, activated);
-}
-
-void RenderWidgetHostViewGtk::GetScreenInfo(WebScreenInfo* results) {
- GdkWindow* gdk_window = gtk_widget_get_window(view_.get());
- if (!gdk_window) {
- GdkDisplay* display = gdk_display_get_default();
- gdk_window = gdk_display_get_default_group(display);
- }
- if (!gdk_window)
- return;
- GetScreenInfoFromNativeWindow(gdk_window, results);
-}
-
-gfx::Rect RenderWidgetHostViewGtk::GetBoundsInRootWindow() {
- GtkWidget* toplevel = gtk_widget_get_toplevel(view_.get());
- if (!toplevel)
- return GetViewBounds();
-
- GdkRectangle frame_extents;
- GdkWindow* gdk_window = gtk_widget_get_window(toplevel);
- if (!gdk_window)
- return GetViewBounds();
-
- gdk_window_get_frame_extents(gdk_window, &frame_extents);
- return gfx::Rect(frame_extents.x, frame_extents.y,
- frame_extents.width, frame_extents.height);
-}
-
-gfx::GLSurfaceHandle RenderWidgetHostViewGtk::GetCompositingSurface() {
- if (compositing_surface_ == gfx::kNullPluginWindow) {
- GtkNativeViewManager* manager = GtkNativeViewManager::GetInstance();
- gfx::NativeViewId view_id = GetNativeViewId();
-
- if (!manager->GetPermanentXIDForId(&compositing_surface_, view_id)) {
- DLOG(ERROR) << "Can't find XID for view id " << view_id;
- }
- }
- return gfx::GLSurfaceHandle(compositing_surface_, gfx::NATIVE_TRANSPORT);
-}
-
-void RenderWidgetHostViewGtk::ResizeCompositingSurface(const gfx::Size& size) {
- GtkWidget* widget = view_.get();
- GdkWindow* window = gtk_widget_get_window(widget);
- if (window) {
- Display* display = GDK_WINDOW_XDISPLAY(window);
- gdk_window_resize(window, size.width(), size.height());
- XSync(display, False);
- }
-}
-
-bool RenderWidgetHostViewGtk::LockMouse() {
- if (mouse_locked_)
- return true;
-
- mouse_locked_ = true;
-
- // Release any current grab.
- GtkWidget* current_grab_window = gtk_grab_get_current();
- if (current_grab_window) {
- gtk_grab_remove(current_grab_window);
- LOG(WARNING) << "Locking Mouse with gdk_pointer_grab, "
- << "but had to steal grab from another window";
- }
-
- GtkWidget* widget = view_.get();
- GdkWindow* window = gtk_widget_get_window(widget);
- GdkCursor* cursor = gdk_cursor_new(GDK_BLANK_CURSOR);
-
- GdkGrabStatus grab_status =
- gdk_pointer_grab(window,
- FALSE, // owner_events
- static_cast<GdkEventMask>(
- GDK_POINTER_MOTION_MASK |
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK),
- window, // confine_to
- cursor,
- GDK_CURRENT_TIME);
-
- if (grab_status != GDK_GRAB_SUCCESS) {
- LOG(WARNING) << "Failed to grab pointer for LockMouse. "
- << "gdk_pointer_grab returned: " << grab_status;
- mouse_locked_ = false;
- return false;
- }
-
- // Clear the tooltip window.
- SetTooltipText(base::string16());
-
- // Ensure that the widget center location will be relevant for this mouse
- // lock session. It is updated whenever the window geometry moves
- // but may be out of date due to switching tabs.
- MarkCachedWidgetCenterStale();
-
- // Ensure that if we were previously warping the cursor to a specific point
- // that we no longer track doing so when entering lock. It should be cleared
- // by the cursor moving to the warp point, and this shouldn't be necessary.
- // But, this is a small effort to ensure robustness in the event a warp isn't
- // completed.
- mouse_is_being_warped_to_unlocked_position_ = false;
-
- return true;
-}
-
-void RenderWidgetHostViewGtk::UnlockMouse() {
- if (!mouse_locked_)
- return;
-
- mouse_locked_ = false;
-
- GtkWidget* widget = view_.get();
- GdkDisplay* display = gtk_widget_get_display(widget);
- GdkScreen* screen = gtk_widget_get_screen(widget);
- gdk_display_pointer_ungrab(display, GDK_CURRENT_TIME);
- gdk_display_warp_pointer(display, screen,
- unlocked_global_mouse_position_.x(),
- unlocked_global_mouse_position_.y());
- mouse_is_being_warped_to_unlocked_position_ = true;
-
- if (host_)
- host_->LostMouseLock();
-}
-
-void RenderWidgetHostViewGtk::ForwardKeyboardEvent(
- const NativeWebKeyboardEvent& event) {
- if (!host_)
- return;
-
- EditCommands edit_commands;
- if (!event.skip_in_browser &&
- key_bindings_handler_->Match(event, &edit_commands)) {
- Send(new InputMsg_SetEditCommandsForNextKeyEvent(
- host_->GetRoutingID(), edit_commands));
- NativeWebKeyboardEvent copy_event(event);
- copy_event.match_edit_command = true;
- host_->ForwardKeyboardEvent(copy_event);
- return;
- }
-
- host_->ForwardKeyboardEvent(event);
-}
-
-bool RenderWidgetHostViewGtk::RetrieveSurrounding(std::string* text,
- size_t* cursor_index) {
- if (!selection_range_.IsValid())
- return false;
-
- size_t offset = selection_range_.GetMin() - selection_text_offset_;
- DCHECK(offset <= selection_text_.length());
-
- if (offset == selection_text_.length()) {
- *text = base::UTF16ToUTF8(selection_text_);
- *cursor_index = text->length();
- return true;
- }
-
- *text = base::UTF16ToUTF8AndAdjustOffset(
- base::StringPiece16(selection_text_), &offset);
- if (offset == base::string16::npos) {
- NOTREACHED() << "Invalid offset in UTF16 string.";
- return false;
- }
- *cursor_index = offset;
- return true;
-}
-
-void RenderWidgetHostViewGtk::set_last_mouse_down(GdkEventButton* event) {
- GdkEventButton* temp = NULL;
- if (event) {
- temp = reinterpret_cast<GdkEventButton*>(
- gdk_event_copy(reinterpret_cast<GdkEvent*>(event)));
- }
-
- if (last_mouse_down_)
- gdk_event_free(reinterpret_cast<GdkEvent*>(last_mouse_down_));
-
- last_mouse_down_ = temp;
-}
-
-void RenderWidgetHostViewGtk::MarkCachedWidgetCenterStale() {
- widget_center_valid_ = false;
- mouse_has_been_warped_to_new_center_ = false;
-}
-
-gfx::Point RenderWidgetHostViewGtk::GetWidgetCenter() {
- if (widget_center_valid_)
- return widget_center_;
-
- GdkWindow* window = gtk_widget_get_window(view_.get());
- gint window_x = 0;
- gint window_y = 0;
- gdk_window_get_origin(window, &window_x, &window_y);
- gint window_w = gdk_window_get_width(window);
- gint window_h = gdk_window_get_height(window);
- widget_center_.SetPoint(window_x + window_w / 2,
- window_y + window_h / 2);
- widget_center_valid_ = true;
- return widget_center_;
-}
-
-void RenderWidgetHostViewGtk::ModifyEventMovementAndCoords(
- blink::WebMouseEvent* event) {
- // Movement is computed by taking the difference of the new cursor position
- // and the previous. Under mouse lock the cursor will be warped back to the
- // center so that we are not limited by clipping boundaries.
- // We do not measure movement as the delta from cursor to center because
- // we may receive more mouse movement events before our warp has taken
- // effect.
- event->movementX = event->globalX - global_mouse_position_.x();
- event->movementY = event->globalY - global_mouse_position_.y();
-
- // While the cursor is being warped back to the unlocked position, suppress
- // the movement member data.
- if (mouse_is_being_warped_to_unlocked_position_) {
- event->movementX = 0;
- event->movementY = 0;
- if (MovedToPoint(*event, unlocked_global_mouse_position_))
- mouse_is_being_warped_to_unlocked_position_ = false;
- }
-
- global_mouse_position_.SetPoint(event->globalX, event->globalY);
-
- // Under mouse lock, coordinates of mouse are locked to what they were when
- // mouse lock was entered.
- if (mouse_locked_) {
- event->x = unlocked_mouse_position_.x();
- event->y = unlocked_mouse_position_.y();
- event->windowX = unlocked_mouse_position_.x();
- event->windowY = unlocked_mouse_position_.y();
- event->globalX = unlocked_global_mouse_position_.x();
- event->globalY = unlocked_global_mouse_position_.y();
- } else if (!mouse_is_being_warped_to_unlocked_position_) {
- unlocked_mouse_position_.SetPoint(event->windowX, event->windowY);
- unlocked_global_mouse_position_.SetPoint(event->globalX, event->globalY);
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// RenderWidgetHostView, public:
-
-// static
-RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget(
- RenderWidgetHost* widget) {
- return new RenderWidgetHostViewGtk(widget);
-}
-
-// static
-void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) {
- GdkWindow* gdk_window =
- gdk_display_get_default_group(gdk_display_get_default());
- GetScreenInfoFromNativeWindow(gdk_window, results);
-}
-
-void RenderWidgetHostViewGtk::SetAccessibilityFocus(int acc_obj_id) {
- if (!host_)
- return;
-
- host_->AccessibilitySetFocus(acc_obj_id);
-}
-
-void RenderWidgetHostViewGtk::AccessibilityDoDefaultAction(int acc_obj_id) {
- if (!host_)
- return;
-
- host_->AccessibilityDoDefaultAction(acc_obj_id);
-}
-
-void RenderWidgetHostViewGtk::AccessibilityScrollToMakeVisible(
- int acc_obj_id, gfx::Rect subfocus) {
- if (!host_)
- return;
-
- host_->AccessibilityScrollToMakeVisible(acc_obj_id, subfocus);
-}
-
-void RenderWidgetHostViewGtk::AccessibilityScrollToPoint(
- int acc_obj_id, gfx::Point point) {
- if (!host_)
- return;
-
- host_->AccessibilityScrollToPoint(acc_obj_id, point);
-}
-
-void RenderWidgetHostViewGtk::AccessibilitySetTextSelection(
- int acc_obj_id, int start_offset, int end_offset) {
- if (!host_)
- return;
-
- host_->AccessibilitySetTextSelection(acc_obj_id, start_offset, end_offset);
-}
-
-gfx::Point RenderWidgetHostViewGtk::GetLastTouchEventLocation() const {
- // Not needed on Linux.
- return gfx::Point();
-}
-
-void RenderWidgetHostViewGtk::FatalAccessibilityTreeError() {
- if (host_) {
- host_->FatalAccessibilityTreeError();
- SetBrowserAccessibilityManager(NULL);
- } else {
- CHECK(FALSE);
- }
-}
-
-void RenderWidgetHostViewGtk::CreateBrowserAccessibilityManagerIfNeeded() {
- if (!GetBrowserAccessibilityManager()) {
- GtkWidget* parent = gtk_widget_get_parent(view_.get());
- SetBrowserAccessibilityManager(
- new BrowserAccessibilityManagerGtk(
- parent,
- BrowserAccessibilityManagerGtk::GetEmptyDocument(),
- this));
- }
-}
-
-AtkObject* RenderWidgetHostViewGtk::GetAccessible() {
- if (!GetBrowserAccessibilityManager()) {
- GtkWidget* parent = gtk_widget_get_parent(view_.get());
- SetBrowserAccessibilityManager(
- new BrowserAccessibilityManagerGtk(
- parent,
- BrowserAccessibilityManagerGtk::GetEmptyDocument(),
- this));
- }
- BrowserAccessibilityGtk* root =
- GetBrowserAccessibilityManager()->GetRoot()->ToBrowserAccessibilityGtk();
-
- atk_object_set_role(root->GetAtkObject(), ATK_ROLE_HTML_CONTAINER);
- return root->GetAtkObject();
-}
-
-void RenderWidgetHostViewGtk::OnCreatePluginContainer(
- gfx::PluginWindowHandle id) {
- plugin_container_manager_.CreatePluginContainer(id);
-}
-
-void RenderWidgetHostViewGtk::OnDestroyPluginContainer(
- gfx::PluginWindowHandle id) {
- plugin_container_manager_.DestroyPluginContainer(id);
-}
-
-SkBitmap::Config RenderWidgetHostViewGtk::PreferredReadbackFormat() {
- return SkBitmap::kARGB_8888_Config;
-}
-
-} // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_gtk.h b/content/browser/renderer_host/render_widget_host_view_gtk.h
deleted file mode 100644
index a142c5a..0000000
--- a/content/browser/renderer_host/render_widget_host_view_gtk.h
+++ /dev/null
@@ -1,341 +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.
-
-#ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_
-#define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_
-
-#include <gdk/gdk.h>
-
-#include <string>
-#include <vector>
-
-#include "base/memory/scoped_ptr.h"
-#include "base/time/time.h"
-#include "content/browser/accessibility/browser_accessibility_manager.h"
-#include "content/browser/renderer_host/gtk_plugin_container_manager.h"
-#include "content/browser/renderer_host/render_widget_host_view_base.h"
-#include "content/common/content_export.h"
-#include "content/common/cursors/webcursor.h"
-#include "ipc/ipc_sender.h"
-#include "ui/base/gtk/gtk_signal.h"
-#include "ui/base/gtk/gtk_signal_registrar.h"
-#include "ui/base/gtk/owned_widget_gtk.h"
-#include "ui/base/x/active_window_watcher_x_observer.h"
-#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/point.h"
-#include "ui/gfx/rect.h"
-
-typedef struct _GtkClipboard GtkClipboard;
-typedef struct _GtkSelectionData GtkSelectionData;
-
-namespace content {
-class GtkIMContextWrapper;
-class GtkKeyBindingsHandler;
-class RenderWidgetHost;
-class RenderWidgetHostImpl;
-struct NativeWebKeyboardEvent;
-
-// -----------------------------------------------------------------------------
-// See comments in render_widget_host_view.h about this class and its members.
-// -----------------------------------------------------------------------------
-class CONTENT_EXPORT RenderWidgetHostViewGtk
- : public RenderWidgetHostViewBase,
- public BrowserAccessibilityDelegate,
- public ui::ActiveWindowWatcherXObserver,
- public IPC::Sender {
- public:
- virtual ~RenderWidgetHostViewGtk();
-
- // RenderWidgetHostView implementation.
- virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
- virtual void InitAsChild(gfx::NativeView parent_view) OVERRIDE;
- virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE;
- virtual void SetSize(const gfx::Size& size) OVERRIDE;
- virtual void SetBounds(const gfx::Rect& rect) OVERRIDE;
- virtual gfx::NativeView GetNativeView() const OVERRIDE;
- virtual gfx::NativeViewId GetNativeViewId() const OVERRIDE;
- virtual gfx::NativeViewAccessible GetNativeViewAccessible() OVERRIDE;
- virtual bool HasFocus() const OVERRIDE;
- virtual bool IsSurfaceAvailableForCopy() const OVERRIDE;
- virtual void Show() OVERRIDE;
- virtual void Hide() OVERRIDE;
- virtual bool IsShowing() OVERRIDE;
- virtual gfx::Rect GetViewBounds() const OVERRIDE;
- virtual GdkEventButton* GetLastMouseDown() OVERRIDE;
- virtual gfx::NativeView BuildInputMethodsGtkMenu() OVERRIDE;
- virtual void SetBackground(const SkBitmap& background) OVERRIDE;
-
- // RenderWidgetHostViewPort implementation.
- virtual void InitAsPopup(RenderWidgetHostView* parent_host_view,
- const gfx::Rect& pos) OVERRIDE;
- virtual void InitAsFullscreen(
- RenderWidgetHostView* reference_host_view) OVERRIDE;
- virtual void WasShown() OVERRIDE;
- virtual void WasHidden() OVERRIDE;
- virtual void MovePluginWindows(
- const gfx::Vector2d& scroll_offset,
- const std::vector<WebPluginGeometry>& moves) OVERRIDE;
- virtual void Focus() OVERRIDE;
- virtual void Blur() OVERRIDE;
- virtual void UpdateCursor(const WebCursor& cursor) OVERRIDE;
- virtual void SetIsLoading(bool is_loading) OVERRIDE;
- virtual void TextInputTypeChanged(ui::TextInputType type,
- ui::TextInputMode input_mode,
- bool can_compose_inline) OVERRIDE;
- virtual void ImeCancelComposition() OVERRIDE;
- virtual void DidUpdateBackingStore(
- const gfx::Rect& scroll_rect,
- const gfx::Vector2d& scroll_delta,
- const std::vector<gfx::Rect>& copy_rects,
- const std::vector<ui::LatencyInfo>& latency_info) OVERRIDE;
- virtual void RenderProcessGone(base::TerminationStatus status,
- int error_code) OVERRIDE;
- virtual void Destroy() OVERRIDE;
- virtual void WillDestroyRenderWidget(RenderWidgetHost* rwh) {}
- virtual void SetTooltipText(const base::string16& tooltip_text) OVERRIDE;
- virtual void SelectionChanged(const base::string16& text,
- size_t offset,
- const gfx::Range& range) OVERRIDE;
- virtual void SelectionBoundsChanged(
- const ViewHostMsg_SelectionBounds_Params& params) OVERRIDE;
- virtual void ScrollOffsetChanged() OVERRIDE;
- virtual BackingStore* AllocBackingStore(const gfx::Size& size) OVERRIDE;
- virtual void CopyFromCompositingSurface(
- const gfx::Rect& src_subrect,
- const gfx::Size& dst_size,
- const base::Callback<void(bool, const SkBitmap&)>& callback,
- SkBitmap::Config config) OVERRIDE;
- virtual void CopyFromCompositingSurfaceToVideoFrame(
- const gfx::Rect& src_subrect,
- const scoped_refptr<media::VideoFrame>& target,
- const base::Callback<void(bool)>& callback) OVERRIDE;
- virtual bool CanCopyToVideoFrame() const OVERRIDE;
- virtual void OnAcceleratedCompositingStateChange() OVERRIDE;
- virtual void AcceleratedSurfaceInitialized(int host_id,
- int route_id) OVERRIDE;
- virtual void AcceleratedSurfaceBuffersSwapped(
- const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params,
- int gpu_host_id) OVERRIDE;
- virtual void AcceleratedSurfacePostSubBuffer(
- const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
- int gpu_host_id) OVERRIDE;
- virtual void AcceleratedSurfaceSuspend() OVERRIDE;
- virtual void AcceleratedSurfaceRelease() OVERRIDE;
- virtual bool HasAcceleratedSurface(const gfx::Size& desired_size) OVERRIDE;
- virtual void SetHasHorizontalScrollbar(
- bool has_horizontal_scrollbar) OVERRIDE;
- virtual void SetScrollOffsetPinning(
- bool is_pinned_to_left, bool is_pinned_to_right) OVERRIDE;
- virtual void GetScreenInfo(blink::WebScreenInfo* results) OVERRIDE;
- virtual gfx::Rect GetBoundsInRootWindow() OVERRIDE;
- virtual gfx::GLSurfaceHandle GetCompositingSurface() OVERRIDE;
- virtual void ResizeCompositingSurface(const gfx::Size&) OVERRIDE;
- virtual bool LockMouse() OVERRIDE;
- virtual void UnlockMouse() OVERRIDE;
- virtual void CreateBrowserAccessibilityManagerIfNeeded() OVERRIDE;
-
- // ActiveWindowWatcherXObserver implementation.
- virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE;
-
- // IPC::Sender implementation:
- virtual bool Send(IPC::Message* message) OVERRIDE;
-
- // If the widget is aligned with an edge of the monitor its on and the user
- // attempts to drag past that edge we track the number of times it has
- // occurred, so that we can force the widget to scroll when it otherwise
- // would be unable to.
- void ModifyEventForEdgeDragging(GtkWidget* widget, GdkEventMotion* event);
-
- // Mouse events always provide a movementX/Y which needs to be computed.
- // Also, mouse lock requires knowledge of last unlocked cursor coordinates.
- // State is stored on the host view to do this, and the mouse event modified.
- void ModifyEventMovementAndCoords(blink::WebMouseEvent* event);
-
- void Paint(const gfx::Rect&);
-
- // Called by GtkIMContextWrapper to forward a keyboard event to renderer.
- // On Linux (not ChromeOS):
- // Before calling RenderWidgetHost::ForwardKeyboardEvent(), this method
- // calls GtkKeyBindingsHandler::Match() against the event and send matched
- // edit commands to renderer by calling
- // RenderWidgetHost::ForwardEditCommandsForNextKeyEvent().
- void ForwardKeyboardEvent(const NativeWebKeyboardEvent& event);
-
- bool RetrieveSurrounding(std::string* text, size_t* cursor_index);
-
- // BrowserAccessibilityDelegate implementation.
- virtual void SetAccessibilityFocus(int acc_obj_id) OVERRIDE;
- virtual void AccessibilityDoDefaultAction(int acc_obj_id) OVERRIDE;
- virtual void AccessibilityScrollToMakeVisible(
- int acc_obj_id, gfx::Rect subfocus) OVERRIDE;
- virtual void AccessibilityScrollToPoint(
- int acc_obj_id, gfx::Point point) OVERRIDE;
- virtual void AccessibilitySetTextSelection(
- int acc_obj_id, int start_offset, int end_offset) OVERRIDE;
- virtual gfx::Point GetLastTouchEventLocation() const OVERRIDE;
- virtual void FatalAccessibilityTreeError() OVERRIDE;
-
- virtual SkBitmap::Config PreferredReadbackFormat() OVERRIDE;
-
- // Get the root of the AtkObject* tree for accessibility.
- AtkObject* GetAccessible();
-
- protected:
- friend class RenderWidgetHostView;
-
- // Should construct only via RenderWidgetHostView::CreateViewForWidget.
- explicit RenderWidgetHostViewGtk(RenderWidgetHost* widget);
-
- private:
- friend class RenderWidgetHostViewGtkWidget;
-
- CHROMEGTK_CALLBACK_0(RenderWidgetHostViewGtk,
- void,
- OnDestroy);
-
- // Returns whether the widget needs an input grab (GTK+ and X) to work
- // properly.
- bool NeedsInputGrab();
-
- // Returns whether this render view is a popup (<select> dropdown or
- // autocomplete window).
- bool IsPopup() const;
-
- // Do initialization needed by all InitAs*() methods.
- void DoSharedInit();
-
- // Do initialization needed just by InitAsPopup() and InitAsFullscreen().
- // We move and resize |window| to |bounds| and show it and its contents.
- void DoPopupOrFullscreenInit(GtkWindow* window, const gfx::Rect& bounds);
-
- // Update the display cursor for the render view.
- void ShowCurrentCursor();
-
- void set_last_mouse_down(GdkEventButton* event);
-
- // Cause the next query for the widget center to recompute the cached value.
- void MarkCachedWidgetCenterStale();
-
- void OnCreatePluginContainer(gfx::PluginWindowHandle id);
- void OnDestroyPluginContainer(gfx::PluginWindowHandle id);
-
- gfx::Point GetWidgetCenter();
-
- // The model object.
- RenderWidgetHostImpl* host_;
-
- // The native UI widget.
- ui::OwnedWidgetGtk view_;
-
- // This is true when we are currently painting and thus should handle extra
- // paint requests by expanding the invalid rect rather than actually
- // painting.
- bool about_to_validate_and_paint_;
-
- // This is the rectangle which we'll paint.
- gfx::Rect invalid_rect_;
-
- // Whether we are currently loading.
- bool is_loading_;
-
- // The cursor for the page. This is passed up from the renderer.
- WebCursor current_cursor_;
-
- // The time at which this view started displaying white pixels as a result of
- // not having anything to paint (empty backing store from renderer). This
- // value returns true for is_null() if we are not recording whiteout times.
- base::TimeTicks whiteout_start_time_;
-
- // The time it took after this view was selected for it to be fully painted.
- base::TimeTicks web_contents_switch_paint_time_;
-
- // The native view of our parent widget. Used only for popups.
- GtkWidget* parent_;
-
- // We ignore the first mouse release on popups so the popup will remain open.
- bool is_popup_first_mouse_release_;
-
- // Whether or not this widget's input context was focused before being
- // shadowed by another widget. Used in OnGrabNotify() handler to track the
- // focused state correctly.
- bool was_imcontext_focused_before_grab_;
-
- // True if we are responsible for creating an X grab. This will only be used
- // for <select> dropdowns. It should be true for most such cases, but false
- // for extension popups.
- bool do_x_grab_;
-
- // Is the widget fullscreen?
- bool is_fullscreen_;
-
- // Has the window ever been marked active? Only valid for fullscreen or
- // popup windows.
- bool made_active_;
-
- // Used to record the last position of the mouse.
- // While the mouse is locked, they store the last known position just as mouse
- // lock was entered.
- // Relative to the upper-left corner of the view.
- gfx::Point unlocked_mouse_position_;
- // Relative to the upper-left corner of the screen.
- gfx::Point unlocked_global_mouse_position_;
- // Last hidden cursor position. Relative to screen.
- gfx::Point global_mouse_position_;
- // Indicates when mouse motion is valid after the widget has moved.
- bool mouse_has_been_warped_to_new_center_;
- // Indicates the cursor has been warped to the unlocked position,
- // but a move event has not yet been received for it there.
- bool mouse_is_being_warped_to_unlocked_position_;
-
- // For full-screen windows we have a OnDestroy handler that we need to remove,
- // so we keep it ID here.
- unsigned long destroy_handler_id_;
-
- // A convenience wrapper object for GtkIMContext;
- scoped_ptr<GtkIMContextWrapper> im_context_;
-
- // A convenience object for handling editor key bindings defined in gtk
- // keyboard theme.
- scoped_ptr<GtkKeyBindingsHandler> key_bindings_handler_;
-
- // Helper class that lets us allocate plugin containers and move them.
- GtkPluginContainerManager plugin_container_manager_;
-
- // The size that we want the renderer to be. We keep this in a separate
- // variable because resizing in GTK+ is async.
- gfx::Size requested_size_;
-
- // The latest reported center of the widget, use GetWidgetCenter() to access.
- gfx::Point widget_center_;
- // If the window moves the widget_center will not be valid until we recompute.
- bool widget_center_valid_;
-
- // The number of times the user has dragged against horizontal edge of the
- // monitor (if the widget is aligned with that edge). Negative values
- // indicate the left edge, positive the right.
- int dragged_at_horizontal_edge_;
-
- // The number of times the user has dragged against vertical edge of the
- // monitor (if the widget is aligned with that edge). Negative values
- // indicate the top edge, positive the bottom.
- int dragged_at_vertical_edge_;
-
- gfx::PluginWindowHandle compositing_surface_;
-
- // The event for the last mouse down we handled. We need this for context
- // menus and drags.
- GdkEventButton* last_mouse_down_;
-
- // Instance of accessibility information for the root of the AtkObject
- // tree representation of the WebKit render tree.
- scoped_ptr<BrowserAccessibilityManager> browser_accessibility_manager_;
-
- ui::GtkSignalRegistrar signals_;
-
- std::vector<ui::LatencyInfo> software_latency_info_;
-};
-
-} // namespace content
-
-#endif // CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_
diff --git a/content/browser/web_contents/drag_utils_gtk.cc b/content/browser/web_contents/drag_utils_gtk.cc
deleted file mode 100644
index 279ae9d..0000000
--- a/content/browser/web_contents/drag_utils_gtk.cc
+++ /dev/null
@@ -1,38 +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/drag_utils_gtk.h"
-
-using blink::WebDragOperationsMask;
-using blink::WebDragOperation;
-using blink::WebDragOperationNone;
-using blink::WebDragOperationCopy;
-using blink::WebDragOperationLink;
-using blink::WebDragOperationMove;
-
-namespace content {
-
-GdkDragAction WebDragOpToGdkDragAction(WebDragOperationsMask op) {
- GdkDragAction action = static_cast<GdkDragAction>(0);
- if (op & WebDragOperationCopy)
- action = static_cast<GdkDragAction>(action | GDK_ACTION_COPY);
- if (op & WebDragOperationLink)
- action = static_cast<GdkDragAction>(action | GDK_ACTION_LINK);
- if (op & WebDragOperationMove)
- action = static_cast<GdkDragAction>(action | GDK_ACTION_MOVE);
- return action;
-}
-
-WebDragOperationsMask GdkDragActionToWebDragOp(GdkDragAction action) {
- WebDragOperationsMask op = WebDragOperationNone;
- if (action & GDK_ACTION_COPY)
- op = static_cast<WebDragOperationsMask>(op | WebDragOperationCopy);
- if (action & GDK_ACTION_LINK)
- op = static_cast<WebDragOperationsMask>(op | WebDragOperationLink);
- if (action & GDK_ACTION_MOVE)
- op = static_cast<WebDragOperationsMask>(op | WebDragOperationMove);
- return op;
-}
-
-} // namespace content
diff --git a/content/browser/web_contents/drag_utils_gtk.h b/content/browser/web_contents/drag_utils_gtk.h
deleted file mode 100644
index f6d8839..0000000
--- a/content/browser/web_contents/drag_utils_gtk.h
+++ /dev/null
@@ -1,24 +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.
-
-#ifndef CONTENT_BROWSER_WEB_CONTENTS_DRAG_UTILS_GTK_H_
-#define CONTENT_BROWSER_WEB_CONTENTS_DRAG_UTILS_GTK_H_
-
-#include <gtk/gtk.h>
-
-#include "content/common/content_export.h"
-#include "third_party/WebKit/public/web/WebDragOperation.h"
-
-namespace content {
-
-// Convenience methods for converting between web drag operations and the GDK
-// equivalent.
-CONTENT_EXPORT GdkDragAction WebDragOpToGdkDragAction(
- blink::WebDragOperationsMask op);
-CONTENT_EXPORT blink::WebDragOperationsMask GdkDragActionToWebDragOp(
- GdkDragAction action);
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_WEB_CONTENTS_DRAG_UTILS_GTK_H_
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 1e77e9f..0000000
--- 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
diff --git a/content/browser/web_contents/web_contents_view_gtk.h b/content/browser/web_contents/web_contents_view_gtk.h
deleted file mode 100644
index ad575a3..0000000
--- a/content/browser/web_contents/web_contents_view_gtk.h
+++ /dev/null
@@ -1,141 +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.
-
-#ifndef CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_VIEW_GTK_H_
-#define CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_VIEW_GTK_H_
-
-#include <gtk/gtk.h>
-
-#include <vector>
-
-#include "base/memory/scoped_ptr.h"
-#include "content/common/content_export.h"
-#include "content/common/drag_event_source_info.h"
-#include "content/port/browser/render_view_host_delegate_view.h"
-#include "content/port/browser/web_contents_view_port.h"
-#include "ui/base/gtk/focus_store_gtk.h"
-#include "ui/base/gtk/gtk_signal.h"
-#include "ui/base/gtk/owned_widget_gtk.h"
-
-namespace content {
-
-class WebContents;
-class WebContentsImpl;
-class WebContentsViewDelegate;
-class WebDragDestDelegate;
-class WebDragDestGtk;
-class WebDragSourceGtk;
-
-class CONTENT_EXPORT WebContentsViewGtk
- : public WebContentsViewPort,
- public RenderViewHostDelegateView {
- public:
- // The corresponding WebContentsImpl is passed in the constructor, and manages
- // our lifetime. This doesn't need to be the case, but is this way currently
- // because that's what was easiest when they were split. We optionally take
- // |wrapper| which creates an intermediary widget layer for features from the
- // Embedding layer that lives with the WebContentsView.
- WebContentsViewGtk(WebContentsImpl* web_contents,
- WebContentsViewDelegate* delegate);
- virtual ~WebContentsViewGtk();
-
- WebContentsViewDelegate* delegate() const { return delegate_.get(); }
- WebContents* web_contents();
-
- // WebContentsView implementation --------------------------------------------
-
- virtual gfx::NativeView GetNativeView() const OVERRIDE;
- virtual gfx::NativeView GetContentNativeView() const OVERRIDE;
- virtual gfx::NativeWindow GetTopLevelNativeWindow() const OVERRIDE;
- virtual void GetContainerBounds(gfx::Rect* out) const OVERRIDE;
- virtual void OnTabCrashed(base::TerminationStatus status,
- int error_code) OVERRIDE;
- virtual void SizeContents(const gfx::Size& size) OVERRIDE;
- virtual void Focus() OVERRIDE;
- virtual void SetInitialFocus() OVERRIDE;
- virtual void StoreFocus() OVERRIDE;
- virtual void RestoreFocus() OVERRIDE;
- virtual DropData* GetDropData() const OVERRIDE;
- virtual gfx::Rect GetViewBounds() const OVERRIDE;
-
- // WebContentsViewPort implementation ----------------------------------------
- virtual void CreateView(
- const gfx::Size& initial_size, gfx::NativeView context) OVERRIDE;
- virtual RenderWidgetHostView* CreateViewForWidget(
- RenderWidgetHost* render_widget_host) OVERRIDE;
- virtual RenderWidgetHostView* CreateViewForPopupWidget(
- RenderWidgetHost* render_widget_host) OVERRIDE;
- virtual void SetPageTitle(const base::string16& title) OVERRIDE;
- virtual void RenderViewCreated(RenderViewHost* host) OVERRIDE;
- virtual void RenderViewSwappedIn(RenderViewHost* host) OVERRIDE;
- virtual void SetOverscrollControllerEnabled(bool enabled) OVERRIDE;
-
- // Backend implementation of RenderViewHostDelegateView.
- virtual void ShowContextMenu(RenderFrameHost* render_frame_host,
- const ContextMenuParams& params) OVERRIDE;
- virtual void StartDragging(const DropData& drop_data,
- blink::WebDragOperationsMask allowed_ops,
- const gfx::ImageSkia& image,
- const gfx::Vector2d& image_offset,
- const DragEventSourceInfo& event_info) OVERRIDE;
- virtual void UpdateDragCursor(blink::WebDragOperation operation) OVERRIDE;
- virtual void GotFocus() OVERRIDE;
- virtual void TakeFocus(bool reverse) OVERRIDE;
-
- private:
- // Insert the given widget into the content area. Should only be used for
- // web pages and the like (including interstitials and sad tab). Note that
- // this will be perfectly happy to insert overlapping render views, so care
- // should be taken that the correct one is hidden/shown.
- void InsertIntoContentArea(GtkWidget* widget);
-
- // Replaces, or updates, the existing WebDragDestGtk with one for |new_host|.
- // This must be called when swapping in, or creating a swapped in, RVH.
- void UpdateDragDest(RenderViewHost* new_host);
-
- // Handle focus traversal on the render widget native view. Can be overridden
- // by subclasses.
- CHROMEGTK_CALLBACK_1(WebContentsViewGtk, gboolean, OnFocus, GtkDirectionType);
-
- // Used to adjust the size of its children when the size of |expanded_| is
- // changed.
- CHROMEGTK_CALLBACK_2(WebContentsViewGtk, void, OnChildSizeRequest,
- GtkWidget*, GtkRequisition*);
-
- // Used to propagate the size change of |expanded_| to our RWHV to resize the
- // renderer content.
- CHROMEGTK_CALLBACK_1(WebContentsViewGtk, void, OnSizeAllocate,
- GtkAllocation*);
-
- // The WebContentsImpl whose contents we display.
- WebContentsImpl* web_contents_;
-
- // This container holds the tab's web page views. It is a GtkExpandedContainer
- // so that we can control the size of the web pages.
- ui::OwnedWidgetGtk expanded_;
-
- ui::FocusStoreGtk focus_store_;
-
- // The helper object that handles drag destination related interactions with
- // GTK.
- scoped_ptr<WebDragDestGtk> drag_dest_;
-
- // Object responsible for handling drags from the page for us.
- scoped_ptr<WebDragSourceGtk> drag_source_;
-
- // Our optional views wrapper. If non-NULL, we return this widget as our
- // GetNativeView() and insert |expanded_| as its child in the GtkWidget
- // hierarchy.
- scoped_ptr<WebContentsViewDelegate> delegate_;
-
- // The size we want the view to be. We keep this in a separate variable
- // because resizing in GTK+ is async.
- gfx::Size requested_size_;
-
- DISALLOW_COPY_AND_ASSIGN(WebContentsViewGtk);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_VIEW_GTK_H_
diff --git a/content/browser/web_contents/web_drag_dest_gtk.cc b/content/browser/web_contents/web_drag_dest_gtk.cc
deleted file mode 100644
index 2fae686..0000000
--- a/content/browser/web_contents/web_drag_dest_gtk.cc
+++ /dev/null
@@ -1,345 +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_drag_dest_gtk.h"
-
-#include <string>
-
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/message_loop/message_loop.h"
-#include "base/strings/utf_string_conversions.h"
-#include "content/browser/renderer_host/render_view_host_impl.h"
-#include "content/browser/web_contents/drag_utils_gtk.h"
-#include "content/browser/web_contents/web_contents_impl.h"
-#include "content/public/browser/web_contents_delegate.h"
-#include "content/public/browser/web_drag_dest_delegate.h"
-#include "content/public/common/url_constants.h"
-#include "net/base/filename_util.h"
-#include "third_party/WebKit/public/web/WebInputEvent.h"
-#include "ui/base/clipboard/custom_data_helper.h"
-#include "ui/base/dragdrop/gtk_dnd_util.h"
-#include "ui/base/gtk/gtk_screen_util.h"
-
-using blink::WebDragOperation;
-using blink::WebDragOperationNone;
-
-namespace content {
-
-namespace {
-const int kNumGtkHandlers = 5;
-
-int GetModifierFlags(GtkWidget* widget) {
- int modifier_state = 0;
- GdkModifierType state;
- gdk_window_get_pointer(gtk_widget_get_window(widget), NULL, NULL, &state);
-
- if (state & GDK_SHIFT_MASK)
- modifier_state |= blink::WebInputEvent::ShiftKey;
- if (state & GDK_CONTROL_MASK)
- modifier_state |= blink::WebInputEvent::ControlKey;
- if (state & GDK_MOD1_MASK)
- modifier_state |= blink::WebInputEvent::AltKey;
- if (state & GDK_META_MASK)
- modifier_state |= blink::WebInputEvent::MetaKey;
- return modifier_state;
-}
-
-} // namespace
-
-WebDragDestGtk::WebDragDestGtk(WebContents* web_contents, GtkWidget* widget)
- : web_contents_(web_contents),
- widget_(widget),
- context_(NULL),
- data_requests_(0),
- delegate_(NULL),
- canceled_(false),
- method_factory_(this) {
- gtk_drag_dest_set(widget, static_cast<GtkDestDefaults>(0),
- NULL, 0,
- static_cast<GdkDragAction>(GDK_ACTION_COPY |
- GDK_ACTION_LINK |
- GDK_ACTION_MOVE));
-
- // If adding a handler, make sure to update kNumGtkHandlers and add it to the
- // |handlers_| array so that it can be disconnected later on.
- handlers_.reset(new int[kNumGtkHandlers]);
- handlers_.get()[0] = g_signal_connect(
- widget, "drag-motion", G_CALLBACK(OnDragMotionThunk), this);
- handlers_.get()[1] = g_signal_connect(
- widget, "drag-leave", G_CALLBACK(OnDragLeaveThunk), this);
- handlers_.get()[2] = g_signal_connect(
- widget, "drag-drop", G_CALLBACK(OnDragDropThunk), this);
- handlers_.get()[3] = g_signal_connect(
- widget, "drag-data-received", G_CALLBACK(OnDragDataReceivedThunk), this);
- // TODO(tony): Need a drag-data-delete handler for moving content out of
- // the WebContents. http://crbug.com/38989
-
- handlers_.get()[4] = g_signal_connect(
- widget, "destroy", G_CALLBACK(gtk_widget_destroyed), &widget_);
-}
-
-WebDragDestGtk::~WebDragDestGtk() {
- if (widget_) {
- gtk_drag_dest_unset(widget_);
- for (int i = 0; i < kNumGtkHandlers; ++i)
- g_signal_handler_disconnect(widget_, handlers_.get()[i]);
- }
-}
-
-void WebDragDestGtk::UpdateDragStatus(WebDragOperation operation) {
- if (context_) {
- is_drop_target_ = operation != WebDragOperationNone;
- gdk_drag_status(context_, WebDragOpToGdkDragAction(operation),
- drag_over_time_);
- }
-}
-
-void WebDragDestGtk::DragLeave() {
- GetRenderViewHost()->DragTargetDragLeave();
- if (delegate())
- delegate()->OnDragLeave();
-
- drop_data_.reset();
-}
-
-gboolean WebDragDestGtk::OnDragMotion(GtkWidget* sender,
- GdkDragContext* context,
- gint x, gint y,
- guint time) {
- if (context_ != context) {
- context_ = context;
- drop_data_.reset(new DropData);
- is_drop_target_ = false;
-
- if (delegate())
- delegate()->DragInitialize(web_contents_);
-
- // text/plain must come before text/uri-list. This is a hack that works in
- // conjunction with OnDragDataReceived. Since some file managers populate
- // text/plain with file URLs when dragging files, we want to handle
- // text/uri-list after text/plain so that the plain text can be cleared if
- // it's a file drag.
- // Similarly, renderer taint must occur before anything else so we can
- // ignore potentially forged filenames when handling text/uri-list.
- static int supported_targets[] = {
- ui::RENDERER_TAINT,
- ui::TEXT_PLAIN,
- ui::TEXT_URI_LIST,
- ui::TEXT_HTML,
- ui::NETSCAPE_URL,
- ui::CHROME_NAMED_URL,
- // TODO(estade): support image drags?
- ui::CUSTOM_DATA,
- };
-
- // Add the delegate's requested target if applicable. Need to do this here
- // since gtk_drag_get_data will dispatch to our drag-data-received.
- data_requests_ = arraysize(supported_targets) + (delegate() ? 1 : 0);
- for (size_t i = 0; i < arraysize(supported_targets); ++i) {
- gtk_drag_get_data(widget_, context,
- ui::GetAtomForTarget(supported_targets[i]),
- time);
- }
-
- if (delegate()) {
- gtk_drag_get_data(widget_, context, delegate()->GetBookmarkTargetAtom(),
- time);
- }
- } else if (data_requests_ == 0) {
- if (canceled_)
- return FALSE;
-
- GetRenderViewHost()->DragTargetDragOver(
- ui::ClientPoint(widget_),
- ui::ScreenPoint(widget_),
- GdkDragActionToWebDragOp(context->actions),
- GetModifierFlags(widget_));
-
- if (delegate())
- delegate()->OnDragOver();
-
- drag_over_time_ = time;
- }
-
- // Pretend we are a drag destination because we don't want to wait for
- // the renderer to tell us if we really are or not.
- return TRUE;
-}
-
-void WebDragDestGtk::OnDragDataReceived(
- GtkWidget* sender, GdkDragContext* context, gint x, gint y,
- GtkSelectionData* data, guint info, guint time) {
- // We might get the data from an old get_data() request that we no longer
- // care about.
- if (context != context_)
- return;
-
- data_requests_--;
-
- // Decode the data.
- gint data_length = gtk_selection_data_get_length(data);
- const guchar* raw_data = gtk_selection_data_get_data(data);
- GdkAtom target = gtk_selection_data_get_target(data);
- if (raw_data && data_length > 0) {
- // If the source can't provide us with valid data for a requested target,
- // raw_data will be NULL.
- if (target == ui::GetAtomForTarget(ui::RENDERER_TAINT)) {
- drop_data_->did_originate_from_renderer = true;
- } else if (target == ui::GetAtomForTarget(ui::TEXT_PLAIN)) {
- guchar* text = gtk_selection_data_get_text(data);
- if (text) {
- drop_data_->text = base::NullableString16(
- base::UTF8ToUTF16(std::string(reinterpret_cast<const char*>(text))),
- false);
- g_free(text);
- }
- } else if (target == ui::GetAtomForTarget(ui::TEXT_URI_LIST)) {
- gchar** uris = gtk_selection_data_get_uris(data);
- if (uris) {
- drop_data_->url = GURL();
- for (gchar** uri_iter = uris; *uri_iter; uri_iter++) {
- // Most file managers populate text/uri-list with file URLs when
- // dragging files. To avoid exposing file system paths to web content,
- // file URLs are never set as the URL content for the drop.
- // TODO(estade): Can the filenames have a non-UTF8 encoding?
- GURL url(*uri_iter);
- base::FilePath file_path;
- if (url.SchemeIs(kFileScheme) &&
- net::FileURLToFilePath(url, &file_path)) {
- drop_data_->filenames.push_back(
- ui::FileInfo(file_path, base::FilePath()));
- // This is a hack. Some file managers also populate text/plain with
- // a file URL when dragging files, so we clear it to avoid exposing
- // it to the web content.
- drop_data_->text = base::NullableString16();
- } else if (!drop_data_->url.is_valid()) {
- // Also set the first non-file URL as the URL content for the drop.
- drop_data_->url = url;
- }
- }
- g_strfreev(uris);
- }
- } else if (target == ui::GetAtomForTarget(ui::TEXT_HTML)) {
- // TODO(estade): Can the html have a non-UTF8 encoding?
- drop_data_->html = base::NullableString16(
- base::UTF8ToUTF16(std::string(reinterpret_cast<const char*>(raw_data),
- data_length)),
- false);
- // We leave the base URL empty.
- } else if (target == ui::GetAtomForTarget(ui::NETSCAPE_URL)) {
- std::string netscape_url(reinterpret_cast<const char*>(raw_data),
- data_length);
- size_t split = netscape_url.find_first_of('\n');
- if (split != std::string::npos) {
- drop_data_->url = GURL(netscape_url.substr(0, split));
- if (split < netscape_url.size() - 1) {
- drop_data_->url_title =
- base::UTF8ToUTF16(netscape_url.substr(split + 1));
- }
- }
- } else if (target == ui::GetAtomForTarget(ui::CHROME_NAMED_URL)) {
- ui::ExtractNamedURL(data, &drop_data_->url, &drop_data_->url_title);
- } else if (target == ui::GetAtomForTarget(ui::CUSTOM_DATA)) {
- ui::ReadCustomDataIntoMap(
- raw_data, data_length, &drop_data_->custom_data);
- }
- }
-
- if (data_requests_ == 0) {
- // Give the delegate an opportunity to cancel the drag.
- canceled_ = !web_contents_->GetDelegate()->CanDragEnter(
- web_contents_,
- *drop_data_,
- GdkDragActionToWebDragOp(context->actions));
- if (canceled_) {
- drag_over_time_ = time;
- UpdateDragStatus(WebDragOperationNone);
- drop_data_.reset();
- return;
- }
- }
-
- // For CHROME_BOOKMARK_ITEM, we have to handle the case where the drag source
- // doesn't have any data available for us. In this case we try to synthesize a
- // URL bookmark.
- // Note that bookmark drag data is encoded in the same format for both
- // GTK and Views, hence we can share the same logic here.
- if (delegate() && target == delegate()->GetBookmarkTargetAtom()) {
- if (raw_data && data_length > 0) {
- delegate()->OnReceiveDataFromGtk(data);
- } else {
- delegate()->OnReceiveProcessedData(drop_data_->url,
- drop_data_->url_title);
- }
- }
-
- if (data_requests_ == 0) {
- // Tell the renderer about the drag.
- // |x| and |y| are seemingly arbitrary at this point.
- GetRenderViewHost()->DragTargetDragEnter(
- *drop_data_.get(),
- ui::ClientPoint(widget_),
- ui::ScreenPoint(widget_),
- GdkDragActionToWebDragOp(context->actions),
- GetModifierFlags(widget_));
-
- if (delegate())
- delegate()->OnDragEnter();
-
- drag_over_time_ = time;
- }
-}
-
-// The drag has left our widget; forward this information to the renderer.
-void WebDragDestGtk::OnDragLeave(GtkWidget* sender, GdkDragContext* context,
- guint time) {
- // Set |context_| to NULL to make sure we will recognize the next DragMotion
- // as an enter.
- context_ = NULL;
-
- if (canceled_)
- return;
-
- // Sometimes we get a drag-leave event before getting a drag-data-received
- // event. In that case, we don't want to bother the renderer with a
- // DragLeave event.
- if (data_requests_ != 0)
- return;
-
- // When GTK sends us a drag-drop signal, it is shortly (and synchronously)
- // preceded by a drag-leave. The renderer doesn't like getting the signals
- // in this order so delay telling it about the drag-leave till we are sure
- // we are not getting a drop as well.
- base::MessageLoop::current()->PostTask(
- FROM_HERE,
- base::Bind(&WebDragDestGtk::DragLeave, method_factory_.GetWeakPtr()));
-}
-
-// Called by GTK when the user releases the mouse, executing a drop.
-gboolean WebDragDestGtk::OnDragDrop(GtkWidget* sender, GdkDragContext* context,
- gint x, gint y, guint time) {
- // Cancel that drag leave!
- method_factory_.InvalidateWeakPtrs();
-
- GetRenderViewHost()->
- DragTargetDrop(ui::ClientPoint(widget_), ui::ScreenPoint(widget_),
- GetModifierFlags(widget_));
-
- if (delegate())
- delegate()->OnDrop();
-
- // The second parameter is just an educated guess as to whether or not the
- // drag succeeded, but at least we will get the drag-end animation right
- // sometimes.
- gtk_drag_finish(context, is_drop_target_, FALSE, time);
-
- return TRUE;
-}
-
-RenderViewHostImpl* WebDragDestGtk::GetRenderViewHost() const {
- return static_cast<RenderViewHostImpl*>(web_contents_->GetRenderViewHost());
-}
-
-} // namespace content
diff --git a/content/browser/web_contents/web_drag_dest_gtk.h b/content/browser/web_contents/web_drag_dest_gtk.h
deleted file mode 100644
index 7258e1b..0000000
--- a/content/browser/web_contents/web_drag_dest_gtk.h
+++ /dev/null
@@ -1,114 +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.
-
-#ifndef CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_DEST_GTK_H_
-#define CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_DEST_GTK_H_
-
-#include <gtk/gtk.h>
-
-#include "base/gtest_prod_util.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "content/common/content_export.h"
-#include "content/public/common/drop_data.h"
-#include "third_party/WebKit/public/web/WebDragOperation.h"
-#include "ui/base/gtk/gtk_signal.h"
-
-namespace content {
-
-class RenderViewHostImpl;
-class WebContents;
-class WebDragDestDelegate;
-
-// A helper class that handles DnD for drops in the renderer. In GTK parlance,
-// this handles destination-side DnD, but not source-side DnD.
-class CONTENT_EXPORT WebDragDestGtk {
- public:
- WebDragDestGtk(WebContents* web_contents, GtkWidget* widget);
- ~WebDragDestGtk();
-
- DropData* current_drop_data() const { return drop_data_.get(); }
-
- // This is called when the renderer responds to a drag motion event. We must
- // update the system drag cursor.
- void UpdateDragStatus(blink::WebDragOperation operation);
-
- // Informs the renderer when a system drag has left the render view.
- // See OnDragLeave().
- void DragLeave();
-
- WebDragDestDelegate* delegate() const { return delegate_; }
- void set_delegate(WebDragDestDelegate* delegate) { delegate_ = delegate; }
-
- GtkWidget* widget() const { return widget_; }
-
- private:
- RenderViewHostImpl* GetRenderViewHost() const;
-
- // Called when a system drag crosses over the render view. As there is no drag
- // enter event, we treat it as an enter event (and not a regular motion event)
- // when |context_| is NULL.
- CHROMEGTK_CALLBACK_4(WebDragDestGtk, gboolean, OnDragMotion, GdkDragContext*,
- gint, gint, guint);
-
- // We make a series of requests for the drag data when the drag first enters
- // the render view. This is the callback that is used to give us the data
- // for each individual target. When |data_requests_| reaches 0, we know we
- // have attained all the data, and we can finally tell the renderer about the
- // drag.
- CHROMEGTK_CALLBACK_6(WebDragDestGtk, void, OnDragDataReceived,
- GdkDragContext*, gint, gint, GtkSelectionData*,
- guint, guint);
-
- // The drag has left our widget; forward this information to the renderer.
- CHROMEGTK_CALLBACK_2(WebDragDestGtk, void, OnDragLeave, GdkDragContext*,
- guint);
-
- // Called by GTK when the user releases the mouse, executing a drop.
- CHROMEGTK_CALLBACK_4(WebDragDestGtk, gboolean, OnDragDrop, GdkDragContext*,
- gint, gint, guint);
-
- WebContents* web_contents_;
-
- // The render view.
- GtkWidget* widget_;
-
- // The current drag context for system drags over our render view, or NULL if
- // there is no system drag or the system drag is not over our render view.
- GdkDragContext* context_;
-
- // The data for the current drag, or NULL if |context_| is NULL.
- scoped_ptr<DropData> drop_data_;
-
- // The number of outstanding drag data requests we have sent to the drag
- // source.
- int data_requests_;
-
- // The last time we sent a message to the renderer related to a drag motion.
- gint drag_over_time_;
-
- // Whether the cursor is over a drop target, according to the last message we
- // got from the renderer.
- bool is_drop_target_;
-
- // Stores Handler IDs for the gtk signal handlers. We have to cancel the
- // signal handlers when this WebDragDestGtk is deleted so that if, later on,
- // we re-create the drag dest with the same widget, we don't get callbacks to
- // deleted functions.
- scoped_ptr<int[]> handlers_;
-
- // A delegate that can receive drag information about drag events.
- WebDragDestDelegate* delegate_;
-
- // True if the drag has been canceled.
- bool canceled_;
-
- base::WeakPtrFactory<WebDragDestGtk> method_factory_;
-
- DISALLOW_COPY_AND_ASSIGN(WebDragDestGtk);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_DEST_GTK_H_
diff --git a/content/browser/web_contents/web_drag_source_gtk.cc b/content/browser/web_contents/web_drag_source_gtk.cc
deleted file mode 100644
index 1c4e589..0000000
--- a/content/browser/web_contents/web_drag_source_gtk.cc
+++ /dev/null
@@ -1,388 +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_drag_source_gtk.h"
-
-#include <string>
-
-#include "base/files/file.h"
-#include "base/nix/mime_util_xdg.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/threading/thread_restrictions.h"
-#include "content/browser/download/drag_download_file.h"
-#include "content/browser/download/drag_download_util.h"
-#include "content/browser/renderer_host/render_view_host_delegate.h"
-#include "content/browser/renderer_host/render_view_host_impl.h"
-#include "content/browser/web_contents/drag_utils_gtk.h"
-#include "content/browser/web_contents/web_contents_impl.h"
-#include "content/public/browser/content_browser_client.h"
-#include "content/public/browser/web_contents_view.h"
-#include "content/public/common/content_client.h"
-#include "content/public/common/drop_data.h"
-#include "net/base/filename_util.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/base/clipboard/custom_data_helper.h"
-#include "ui/base/dragdrop/gtk_dnd_util.h"
-#include "ui/base/gtk/gtk_screen_util.h"
-#include "ui/gfx/gtk_compat.h"
-#include "ui/gfx/gtk_util.h"
-
-using blink::WebDragOperation;
-using blink::WebDragOperationsMask;
-using blink::WebDragOperationNone;
-
-namespace content {
-
-WebDragSourceGtk::WebDragSourceGtk(WebContents* web_contents)
- : web_contents_(static_cast<WebContentsImpl*>(web_contents)),
- drag_pixbuf_(NULL),
- drag_failed_(false),
- drag_widget_(gtk_invisible_new()),
- drag_context_(NULL),
- drag_icon_(gtk_window_new(GTK_WINDOW_POPUP)) {
- signals_.Connect(drag_widget_, "drag-failed",
- G_CALLBACK(OnDragFailedThunk), this);
- signals_.Connect(drag_widget_, "drag-begin",
- G_CALLBACK(OnDragBeginThunk),
- this);
- signals_.Connect(drag_widget_, "drag-end",
- G_CALLBACK(OnDragEndThunk), this);
- signals_.Connect(drag_widget_, "drag-data-get",
- G_CALLBACK(OnDragDataGetThunk), this);
-
- signals_.Connect(drag_icon_, "expose-event",
- G_CALLBACK(OnDragIconExposeThunk), this);
-}
-
-WebDragSourceGtk::~WebDragSourceGtk() {
- // Break the current drag, if any.
- if (drop_data_) {
- gtk_grab_add(drag_widget_);
- gtk_grab_remove(drag_widget_);
- drop_data_.reset();
- }
-
- gtk_widget_destroy(drag_widget_);
- gtk_widget_destroy(drag_icon_);
-}
-
-bool WebDragSourceGtk::StartDragging(const DropData& drop_data,
- WebDragOperationsMask allowed_ops,
- GdkEventButton* last_mouse_down,
- const SkBitmap& image,
- const gfx::Vector2d& image_offset) {
- // Guard against re-starting before previous drag completed.
- if (drag_context_) {
- NOTREACHED();
- return false;
- }
-
- int targets_mask = ui::RENDERER_TAINT;
-
- if (!drop_data.text.string().empty())
- targets_mask |= ui::TEXT_PLAIN;
- if (drop_data.url.is_valid()) {
- targets_mask |= ui::TEXT_URI_LIST;
- targets_mask |= ui::CHROME_NAMED_URL;
- targets_mask |= ui::NETSCAPE_URL;
- }
- if (!drop_data.html.string().empty())
- targets_mask |= ui::TEXT_HTML;
- if (!drop_data.file_contents.empty())
- targets_mask |= ui::CHROME_WEBDROP_FILE_CONTENTS;
- if (!drop_data.download_metadata.empty() &&
- ParseDownloadMetadata(drop_data.download_metadata,
- &wide_download_mime_type_,
- &download_file_name_,
- &download_url_)) {
- targets_mask |= ui::DIRECT_SAVE_FILE;
- }
- if (!drop_data.custom_data.empty())
- targets_mask |= ui::CUSTOM_DATA;
-
- // NOTE: Begin a drag even if no targets present. Otherwise, things like
- // draggable list elements will not work.
-
- drop_data_.reset(new DropData(drop_data));
-
- // The image we get from WebKit makes heavy use of alpha-shading. This looks
- // bad on non-compositing WMs. Fall back to the default drag icon.
- if (!image.isNull() && ui::IsScreenComposited())
- drag_pixbuf_ = gfx::GdkPixbufFromSkBitmap(image);
- image_offset_ = image_offset;
-
- GtkTargetList* list = ui::GetTargetListFromCodeMask(targets_mask);
- if (targets_mask & ui::CHROME_WEBDROP_FILE_CONTENTS) {
- // Looking up the mime type can hit the disk. http://crbug.com/84896
- base::ThreadRestrictions::ScopedAllowIO allow_io;
- drag_file_mime_type_ = gdk_atom_intern(
- base::nix::GetDataMimeType(drop_data.file_contents).c_str(), FALSE);
- gtk_target_list_add(list, drag_file_mime_type_,
- 0, ui::CHROME_WEBDROP_FILE_CONTENTS);
- }
-
- drag_failed_ = false;
- // If we don't pass an event, GDK won't know what event time to start grabbing
- // mouse events. Technically it's the mouse motion event and not the mouse
- // down event that causes the drag, but there's no reliable way to know
- // *which* motion event initiated the drag, so this will have to do.
- // TODO(estade): This can sometimes be very far off, e.g. if the user clicks
- // and holds and doesn't start dragging for a long time. I doubt it matters
- // much, but we should probably look into the possibility of getting the
- // initiating event from webkit.
- drag_context_ = gtk_drag_begin(drag_widget_, list,
- WebDragOpToGdkDragAction(allowed_ops),
- 1, // Drags are always initiated by the left button.
- reinterpret_cast<GdkEvent*>(last_mouse_down));
- // The drag adds a ref; let it own the list.
- gtk_target_list_unref(list);
-
- // Sometimes the drag fails to start; |context| will be NULL and we won't
- // get a drag-end signal.
- if (!drag_context_) {
- drag_failed_ = true;
- drop_data_.reset();
- return false;
- }
-
- return true;
-}
-
-void WebDragSourceGtk::OnDragDataGet(GtkWidget* sender,
- GdkDragContext* context,
- GtkSelectionData* selection_data,
- guint target_type,
- guint time) {
- const int kBitsPerByte = 8;
-
- switch (target_type) {
- case ui::TEXT_PLAIN: {
- std::string utf8_text = base::UTF16ToUTF8(drop_data_->text.string());
- gtk_selection_data_set_text(selection_data, utf8_text.c_str(),
- utf8_text.length());
- break;
- }
-
- case ui::TEXT_HTML: {
- // TODO(estade): change relative links to be absolute using
- // |html_base_url|.
- std::string utf8_text = base::UTF16ToUTF8(drop_data_->html.string());
- gtk_selection_data_set(selection_data,
- ui::GetAtomForTarget(ui::TEXT_HTML),
- kBitsPerByte,
- reinterpret_cast<const guchar*>(utf8_text.c_str()),
- utf8_text.length());
- break;
- }
-
- case ui::TEXT_URI_LIST:
- case ui::CHROME_NAMED_URL:
- case ui::NETSCAPE_URL: {
- ui::WriteURLWithName(selection_data, drop_data_->url,
- drop_data_->url_title, target_type);
- break;
- }
-
- case ui::CHROME_WEBDROP_FILE_CONTENTS: {
- gtk_selection_data_set(
- selection_data,
- drag_file_mime_type_, kBitsPerByte,
- reinterpret_cast<const guchar*>(drop_data_->file_contents.data()),
- drop_data_->file_contents.length());
- break;
- }
-
- case ui::DIRECT_SAVE_FILE: {
- char status_code = 'E';
-
- // Retrieves the full file path (in file URL format) provided by the
- // drop target by reading from the source window's XdndDirectSave0
- // property.
- gint file_url_len = 0;
- guchar* file_url_value = NULL;
- if (gdk_property_get(context->source_window,
- ui::GetAtomForTarget(ui::DIRECT_SAVE_FILE),
- ui::GetAtomForTarget(ui::TEXT_PLAIN_NO_CHARSET),
- 0,
- 1024,
- FALSE,
- NULL,
- NULL,
- &file_url_len,
- &file_url_value) &&
- file_url_value) {
- // Convert from the file url to the file path.
- GURL file_url(std::string(reinterpret_cast<char*>(file_url_value),
- file_url_len));
- g_free(file_url_value);
- base::FilePath file_path;
- if (net::FileURLToFilePath(file_url, &file_path)) {
- // Open the file.
- base::File file(CreateFileForDrop(&file_path));
- if (file.IsValid()) {
- // Start downloading the file to the stream.
- scoped_refptr<DragDownloadFile> drag_file_downloader =
- new DragDownloadFile(
- file_path,
- file.Pass(),
- download_url_,
- Referrer(web_contents_->GetURL(),
- drop_data_->referrer_policy),
- web_contents_->GetEncoding(),
- web_contents_);
- drag_file_downloader->Start(
- new PromiseFileFinalizer(drag_file_downloader.get()));
-
- // Set the status code to success.
- status_code = 'S';
- }
- }
-
- // Return the status code to the file manager.
- gtk_selection_data_set(selection_data,
- gtk_selection_data_get_target(selection_data),
- kBitsPerByte,
- reinterpret_cast<guchar*>(&status_code),
- 1);
- }
- break;
- }
-
- case ui::CUSTOM_DATA: {
- Pickle custom_data;
- ui::WriteCustomDataToPickle(drop_data_->custom_data, &custom_data);
- gtk_selection_data_set(
- selection_data,
- ui::GetAtomForTarget(ui::CUSTOM_DATA),
- kBitsPerByte,
- reinterpret_cast<const guchar*>(custom_data.data()),
- custom_data.size());
- break;
- }
-
- case ui::RENDERER_TAINT: {
- static const char kPlaceholder[] = "x";
- gtk_selection_data_set(
- selection_data,
- ui::GetAtomForTarget(ui::RENDERER_TAINT),
- kBitsPerByte,
- reinterpret_cast<const guchar*>(kPlaceholder),
- strlen(kPlaceholder));
- break;
- }
-
- default:
- NOTREACHED();
- }
-}
-
-gboolean WebDragSourceGtk::OnDragFailed(GtkWidget* sender,
- GdkDragContext* context,
- GtkDragResult result) {
- drag_failed_ = true;
-
- gfx::Point root = ui::ScreenPoint(GetContentNativeView());
- gfx::Point client = ui::ClientPoint(GetContentNativeView());
-
- if (web_contents_) {
- web_contents_->DragSourceEndedAt(
- client.x(), client.y(), root.x(), root.y(),
- WebDragOperationNone);
- }
-
- // Let the native failure animation run.
- return FALSE;
-}
-
-void WebDragSourceGtk::OnDragBegin(GtkWidget* sender,
- GdkDragContext* drag_context) {
- if (!download_url_.is_empty()) {
- // Generate the file name based on both mime type and proposed file name.
- std::string default_name =
- GetContentClient()->browser()->GetDefaultDownloadName();
- base::FilePath generated_download_file_name =
- net::GenerateFileName(download_url_,
- std::string(),
- std::string(),
- download_file_name_.value(),
- base::UTF16ToUTF8(wide_download_mime_type_),
- default_name);
-
- // Pass the file name to the drop target by setting the source window's
- // XdndDirectSave0 property.
- gdk_property_change(drag_context->source_window,
- ui::GetAtomForTarget(ui::DIRECT_SAVE_FILE),
- ui::GetAtomForTarget(ui::TEXT_PLAIN_NO_CHARSET),
- 8,
- GDK_PROP_MODE_REPLACE,
- reinterpret_cast<const guchar*>(
- generated_download_file_name.value().c_str()),
- generated_download_file_name.value().length());
- }
-
- if (drag_pixbuf_) {
- gtk_widget_set_size_request(drag_icon_,
- gdk_pixbuf_get_width(drag_pixbuf_),
- gdk_pixbuf_get_height(drag_pixbuf_));
-
- // We only need to do this once.
- if (!gtk_widget_get_realized(drag_icon_)) {
- GdkScreen* screen = gtk_widget_get_screen(drag_icon_);
- GdkColormap* rgba = gdk_screen_get_rgba_colormap(screen);
- if (rgba)
- gtk_widget_set_colormap(drag_icon_, rgba);
- }
-
- gtk_drag_set_icon_widget(drag_context, drag_icon_,
- image_offset_.x(), image_offset_.y());
- }
-}
-
-void WebDragSourceGtk::OnDragEnd(GtkWidget* sender,
- GdkDragContext* drag_context) {
- if (drag_pixbuf_) {
- g_object_unref(drag_pixbuf_);
- drag_pixbuf_ = NULL;
- }
-
- if (!download_url_.is_empty()) {
- gdk_property_delete(drag_context->source_window,
- ui::GetAtomForTarget(ui::DIRECT_SAVE_FILE));
- }
-
- if (!drag_failed_) {
- gfx::Point root = ui::ScreenPoint(GetContentNativeView());
- gfx::Point client = ui::ClientPoint(GetContentNativeView());
-
- if (web_contents_) {
- web_contents_->DragSourceEndedAt(
- client.x(), client.y(), root.x(), root.y(),
- GdkDragActionToWebDragOp(drag_context->action));
- }
- }
-
- web_contents_->SystemDragEnded();
-
- drop_data_.reset();
- drag_context_ = NULL;
-}
-
-gfx::NativeView WebDragSourceGtk::GetContentNativeView() const {
- return web_contents_->GetView()->GetContentNativeView();
-}
-
-gboolean WebDragSourceGtk::OnDragIconExpose(GtkWidget* sender,
- GdkEventExpose* event) {
- cairo_t* cr = gdk_cairo_create(event->window);
- gdk_cairo_rectangle(cr, &event->area);
- cairo_clip(cr);
- cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
- gdk_cairo_set_source_pixbuf(cr, drag_pixbuf_, 0, 0);
- cairo_paint(cr);
- cairo_destroy(cr);
-
- return TRUE;
-}
-
-} // namespace content
diff --git a/content/browser/web_contents/web_drag_source_gtk.h b/content/browser/web_contents/web_drag_source_gtk.h
deleted file mode 100644
index 94687c1..0000000
--- a/content/browser/web_contents/web_drag_source_gtk.h
+++ /dev/null
@@ -1,109 +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.
-
-#ifndef CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_SOURCE_GTK_H_
-#define CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_SOURCE_GTK_H_
-
-#include <gtk/gtk.h>
-
-#include "base/basictypes.h"
-#include "base/files/file_path.h"
-#include "base/strings/string16.h"
-#include "content/common/content_export.h"
-#include "content/public/browser/web_contents.h"
-#include "third_party/WebKit/public/web/WebDragOperation.h"
-#include "ui/base/gtk/gtk_signal.h"
-#include "ui/base/gtk/gtk_signal_registrar.h"
-#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/vector2d.h"
-#include "url/gurl.h"
-
-class SkBitmap;
-
-namespace content {
-
-class RenderViewHostImpl;
-class WebContentsImpl;
-struct DropData;
-
-// WebDragSourceGtk takes care of managing the drag from a WebContents
-// with Gtk.
-class CONTENT_EXPORT WebDragSourceGtk {
- public:
- explicit WebDragSourceGtk(WebContents* web_contents);
- virtual ~WebDragSourceGtk();
-
- // Starts a drag for the WebContents this WebDragSourceGtk was created for.
- // Returns false if the drag could not be started.
- bool StartDragging(const DropData& drop_data,
- blink::WebDragOperationsMask allowed_ops,
- GdkEventButton* last_mouse_down,
- const SkBitmap& image,
- const gfx::Vector2d& image_offset);
-
- private:
- CHROMEGTK_CALLBACK_2(WebDragSourceGtk, gboolean, OnDragFailed,
- GdkDragContext*, GtkDragResult);
- CHROMEGTK_CALLBACK_1(WebDragSourceGtk, void, OnDragBegin,
- GdkDragContext*);
- CHROMEGTK_CALLBACK_1(WebDragSourceGtk, void, OnDragEnd,
- GdkDragContext*);
- CHROMEGTK_CALLBACK_4(WebDragSourceGtk, void, OnDragDataGet,
- GdkDragContext*, GtkSelectionData*, guint, guint);
- CHROMEGTK_CALLBACK_1(WebDragSourceGtk, gboolean, OnDragIconExpose,
- GdkEventExpose*);
-
- gfx::NativeView GetContentNativeView() const;
-
- // The tab we're manging the drag for.
- WebContentsImpl* web_contents_;
-
- // The drop data for the current drag (for drags that originate in the render
- // view). Non-NULL iff there is a current drag.
- scoped_ptr<DropData> drop_data_;
-
- // The image used for depicting the drag, and the offset between the cursor
- // and the top left pixel.
- GdkPixbuf* drag_pixbuf_;
- gfx::Vector2d image_offset_;
-
- // The mime type for the file contents of the current drag (if any).
- GdkAtom drag_file_mime_type_;
-
- // Whether the current drag has failed. Meaningless if we are not the source
- // for a current drag.
- bool drag_failed_;
-
- // This is the widget we use to initiate drags. Since we don't use the
- // renderer widget, we can persist drags even when our contents is switched
- // out. We can't use an OwnedWidgetGtk because the GtkInvisible widget
- // initialization code sinks the reference.
- GtkWidget* drag_widget_;
-
- // Context created once drag starts. A NULL value indicates that there is
- // no drag currently in progress.
- GdkDragContext* drag_context_;
-
- // The file mime type for a drag-out download.
- base::string16 wide_download_mime_type_;
-
- // The file name to be saved to for a drag-out download.
- base::FilePath download_file_name_;
-
- // The URL to download from for a drag-out download.
- GURL download_url_;
-
- // The widget that provides visual feedback for the drag. We can't use
- // an OwnedWidgetGtk because the GtkWindow initialization code sinks
- // the reference.
- GtkWidget* drag_icon_;
-
- ui::GtkSignalRegistrar signals_;
-
- DISALLOW_COPY_AND_ASSIGN(WebDragSourceGtk);
-};
-
-} // namespace content
-
-#endif // CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_SOURCE_GTK_H_