summaryrefslogtreecommitdiffstats
path: root/WebKit/gtk/webkit/webkitwebview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/gtk/webkit/webkitwebview.cpp')
-rw-r--r--WebKit/gtk/webkit/webkitwebview.cpp136
1 files changed, 126 insertions, 10 deletions
diff --git a/WebKit/gtk/webkit/webkitwebview.cpp b/WebKit/gtk/webkit/webkitwebview.cpp
index 0dc19f3..90be935 100644
--- a/WebKit/gtk/webkit/webkitwebview.cpp
+++ b/WebKit/gtk/webkit/webkitwebview.cpp
@@ -173,6 +173,19 @@ enum {
GEOLOCATION_POLICY_DECISION_CANCELLED,
ONLOAD_EVENT,
FRAME_CREATED,
+
+ SHOULD_BEGIN_EDITING,
+ SHOULD_END_EDITING,
+ SHOULD_INSERT_NODE,
+ SHOULD_INSERT_TEXT,
+ SHOULD_DELETE_RANGE,
+ SHOULD_SHOW_DELETE_INTERFACE_FOR_ELEMENT,
+ SHOULD_CHANGE_SELECTED_RANGE,
+ SHOULD_APPLY_STYLE,
+ EDITING_BEGAN,
+ USER_CHANGED_CONTENTS,
+ EDITING_ENDED,
+
LAST_SIGNAL
};
@@ -1311,6 +1324,11 @@ static void webkit_web_view_real_paste_clipboard(WebKitWebView* webView)
frame->editor()->command("Paste").execute();
}
+static gboolean webkit_web_view_real_should_allow_editing_action(WebKitWebView*)
+{
+ return TRUE;
+}
+
static void webkit_web_view_dispose(GObject* object)
{
WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
@@ -1636,13 +1654,58 @@ static gboolean webkit_web_view_query_tooltip(GtkWidget *widget, gint x, gint y,
{
WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(widget);
+ if (keyboard_mode) {
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
+
+ // Get the title of the current focused element.
+ Frame* coreFrame = core(webView)->focusController()->focusedOrMainFrame();
+ if (!coreFrame)
+ return FALSE;
+
+ Node* node = getFocusedNode(coreFrame);
+ if (!node)
+ return FALSE;
+
+ for (Node* titleNode = node; titleNode; titleNode = titleNode->parentNode()) {
+ if (titleNode->isElementNode()) {
+ String title = static_cast<Element*>(titleNode)->title();
+ if (!title.isEmpty()) {
+ if (FrameView* view = coreFrame->view()) {
+ GdkRectangle area = view->contentsToWindow(node->getRect());
+ gtk_tooltip_set_tip_area(tooltip, &area);
+ }
+ gtk_tooltip_set_text(tooltip, title.utf8().data());
+
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+ }
+
if (priv->tooltipText.length() > 0) {
+ if (!keyboard_mode) {
+ if (!priv->tooltipArea.isEmpty()) {
+ GdkRectangle area = priv->tooltipArea;
+ gtk_tooltip_set_tip_area(tooltip, &area);
+ } else
+ gtk_tooltip_set_tip_area(tooltip, 0);
+ }
gtk_tooltip_set_text(tooltip, priv->tooltipText.data());
return TRUE;
}
return FALSE;
}
+
+static gboolean webkit_web_view_show_help(GtkWidget* widget, GtkWidgetHelpType help_type)
+{
+ if (help_type == GTK_WIDGET_HELP_TOOLTIP)
+ gtk_widget_set_has_tooltip(widget, TRUE);
+
+ return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->show_help(widget, help_type);
+}
#endif
static GtkIMContext* webkit_web_view_get_im_context(WebKitWebView* webView)
@@ -2197,15 +2260,6 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
G_TYPE_NONE, 1,
G_TYPE_STRING);
- webkit_web_view_signals[SELECTION_CHANGED] = g_signal_new("selection-changed",
- G_TYPE_FROM_CLASS(webViewClass),
- (GSignalFlags)G_SIGNAL_RUN_LAST,
- 0,
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
/**
* WebKitWebView::console-message:
* @webView: the object on which the signal is emitted
@@ -2603,6 +2657,66 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
G_TYPE_NONE, 1,
WEBKIT_TYPE_WEB_FRAME);
+ webkit_web_view_signals[SHOULD_BEGIN_EDITING] = g_signal_new("should-begin-editing",
+ G_TYPE_FROM_CLASS(webViewClass), static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, should_allow_editing_action), g_signal_accumulator_first_wins, 0,
+ webkit_marshal_BOOLEAN__OBJECT, G_TYPE_BOOLEAN, 1, WEBKIT_TYPE_DOM_RANGE);
+
+ webkit_web_view_signals[SHOULD_END_EDITING] = g_signal_new("should-end-editing", G_TYPE_FROM_CLASS(webViewClass),
+ static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, should_allow_editing_action), g_signal_accumulator_first_wins, 0,
+ webkit_marshal_BOOLEAN__OBJECT, G_TYPE_BOOLEAN, 1, WEBKIT_TYPE_DOM_RANGE);
+
+ webkit_web_view_signals[SHOULD_INSERT_NODE] = g_signal_new("should-insert-node", G_TYPE_FROM_CLASS(webViewClass),
+ static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, should_allow_editing_action), g_signal_accumulator_first_wins, 0,
+ webkit_marshal_BOOLEAN__OBJECT_OBJECT_ENUM, G_TYPE_BOOLEAN,
+ 3, WEBKIT_TYPE_DOM_NODE, WEBKIT_TYPE_DOM_RANGE, WEBKIT_TYPE_INSERT_ACTION);
+
+ webkit_web_view_signals[SHOULD_INSERT_TEXT] = g_signal_new("should-insert-text", G_TYPE_FROM_CLASS(webViewClass),
+ static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, should_allow_editing_action), g_signal_accumulator_first_wins, 0,
+ webkit_marshal_BOOLEAN__STRING_OBJECT_ENUM, G_TYPE_BOOLEAN,
+ 3, G_TYPE_STRING, WEBKIT_TYPE_DOM_RANGE, WEBKIT_TYPE_INSERT_ACTION);
+
+ webkit_web_view_signals[SHOULD_DELETE_RANGE] = g_signal_new("should-delete-range", G_TYPE_FROM_CLASS(webViewClass),
+ static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, should_allow_editing_action), g_signal_accumulator_first_wins, 0,
+ webkit_marshal_BOOLEAN__OBJECT, G_TYPE_BOOLEAN, 1, WEBKIT_TYPE_DOM_RANGE);
+
+ webkit_web_view_signals[SHOULD_SHOW_DELETE_INTERFACE_FOR_ELEMENT] = g_signal_new("should-show-delete-interface-for-element",
+ G_TYPE_FROM_CLASS(webViewClass), static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, should_allow_editing_action), g_signal_accumulator_first_wins, 0,
+ webkit_marshal_BOOLEAN__OBJECT, G_TYPE_BOOLEAN, 1, WEBKIT_TYPE_DOM_HTML_ELEMENT);
+
+ webkit_web_view_signals[SHOULD_CHANGE_SELECTED_RANGE] = g_signal_new("should-change-selected-range",
+ G_TYPE_FROM_CLASS(webViewClass), static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, should_allow_editing_action), g_signal_accumulator_first_wins, 0,
+ webkit_marshal_BOOLEAN__OBJECT_OBJECT_ENUM_BOOLEAN, G_TYPE_BOOLEAN,
+ 4, WEBKIT_TYPE_DOM_RANGE, WEBKIT_TYPE_DOM_RANGE, WEBKIT_TYPE_SELECTION_AFFINITY, G_TYPE_BOOLEAN);
+
+ webkit_web_view_signals[SHOULD_APPLY_STYLE] = g_signal_new("should-apply-style",
+ G_TYPE_FROM_CLASS(webViewClass), static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, should_allow_editing_action), g_signal_accumulator_first_wins, 0,
+ webkit_marshal_BOOLEAN__OBJECT_OBJECT, G_TYPE_BOOLEAN,
+ 2, WEBKIT_TYPE_DOM_CSS_STYLE_DECLARATION, WEBKIT_TYPE_DOM_RANGE);
+
+ webkit_web_view_signals[EDITING_BEGAN] = g_signal_new("editing-began",
+ G_TYPE_FROM_CLASS(webViewClass), static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), 0, 0, 0,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ webkit_web_view_signals[USER_CHANGED_CONTENTS] = g_signal_new("user-changed-contents",
+ G_TYPE_FROM_CLASS(webViewClass), static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), 0, 0, 0,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ webkit_web_view_signals[EDITING_ENDED] = g_signal_new("editing-ended",
+ G_TYPE_FROM_CLASS(webViewClass), static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), 0, 0, 0,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ webkit_web_view_signals[SELECTION_CHANGED] = g_signal_new("selection-changed",
+ G_TYPE_FROM_CLASS(webViewClass), static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), 0, 0, 0,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
/*
* implementations of virtual methods
*/
@@ -2623,6 +2737,7 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
webViewClass->undo = webkit_web_view_real_undo;
webViewClass->redo = webkit_web_view_real_redo;
webViewClass->move_cursor = webkit_web_view_real_move_cursor;
+ webViewClass->should_allow_editing_action = webkit_web_view_real_should_allow_editing_action;
GObjectClass* objectClass = G_OBJECT_CLASS(webViewClass);
objectClass->dispose = webkit_web_view_dispose;
@@ -2664,6 +2779,7 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
widgetClass->drag_data_received = webkit_web_view_drag_data_received;
#if GTK_CHECK_VERSION(2, 12, 0)
widgetClass->query_tooltip = webkit_web_view_query_tooltip;
+ widgetClass->show_help = webkit_web_view_show_help;
#endif
GtkContainerClass* containerClass = GTK_CONTAINER_CLASS(webViewClass);
@@ -4800,7 +4916,7 @@ webkit_web_view_get_dom_document(WebKitWebView* webView)
if (!doc)
return 0;
- return static_cast<WebKitDOMDocument*>(kit(doc));
+ return kit(doc);
}
/**