static void load_status_cb(WebKitWebView* webView, GParamSpec* spec, gpointer data) { WebKitLoadStatus status = webkit_web_view_get_load_status(webView); TestInfo* info = (TestInfo*)data; if (status == WEBKIT_LOAD_FINISHED) { WebKitHitTestResult* result; guint context; GdkEvent* event = gdk_event_new(GDK_BUTTON_PRESS); WebKitDOMNode* node; gint x, y; /* Close enough to 0,0 */ event->button.x = 5; event->button.y = 5; result = webkit_web_view_get_hit_test_result(webView, (GdkEventButton*) event); gdk_event_free(event); g_assert(result); g_object_get(result, "context", &context, NULL); g_assert(context & info->flag); g_object_get(result, "inner-node", &node, NULL); g_assert(node); g_assert(WEBKIT_DOM_IS_NODE(node)); g_object_get(result, "x", &x, "y", &y, NULL); g_assert_cmpint(x, ==, 5); g_assert_cmpint(y, ==, 5); /* We can only test these node types at the moment. In the * input case there seems to be an extra layer with a DIV on * top of the input, which gets assigned to the inner-node. * tag */ if (info->flag == WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT) g_assert(WEBKIT_DOM_IS_HTML_HTML_ELEMENT(node)); else if (info->flag == WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE) g_assert(WEBKIT_DOM_IS_HTML_IMAGE_ELEMENT(node)); else if (info->flag == WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) { /* The hit test will give us the inner text node, we want * the A tag */ WebKitDOMNode* parent = webkit_dom_node_get_parent_node(node); g_assert(WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT(parent)); } g_object_unref(result); g_main_loop_quit(loop); }
WebKitDOMNode * e_html_editor_get_parent_block_node_from_child (WebKitDOMNode *node) { WebKitDOMNode *parent = node; if (!WEBKIT_DOM_IS_ELEMENT (parent) || e_html_editor_node_is_selection_position_node (parent)) parent = webkit_dom_node_get_parent_node (parent); if (element_has_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-temp-text-wrapper") || element_has_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-quoted") || element_has_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-quote-character") || element_has_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-signature") || WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (parent) || element_has_tag (WEBKIT_DOM_ELEMENT (parent), "b") || element_has_tag (WEBKIT_DOM_ELEMENT (parent), "i") || element_has_tag (WEBKIT_DOM_ELEMENT (parent), "u")) parent = webkit_dom_node_get_parent_node (parent); if (element_has_class (WEBKIT_DOM_ELEMENT (parent), "-x-evo-quoted")) parent = webkit_dom_node_get_parent_node (parent); return parent; }
static void html_editor_link_dialog_show (GtkWidget *widget) { EHTMLEditor *editor; EHTMLEditorView *view; EHTMLEditorLinkDialog *dialog; WebKitDOMDocument *document; WebKitDOMDOMWindow *dom_window; WebKitDOMDOMSelection *dom_selection; WebKitDOMRange *range; WebKitDOMElement *link; dialog = E_HTML_EDITOR_LINK_DIALOG (widget); editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view)); dom_window = webkit_dom_document_get_default_view (document); dom_selection = webkit_dom_dom_window_get_selection (dom_window); g_object_unref (dom_window); /* Reset to default values */ gtk_entry_set_text (GTK_ENTRY (dialog->priv->url_edit), "http://"); gtk_entry_set_text (GTK_ENTRY (dialog->priv->label_edit), ""); gtk_widget_set_sensitive (dialog->priv->label_edit, TRUE); gtk_widget_set_sensitive (dialog->priv->remove_link_button, TRUE); dialog->priv->label_autofill = TRUE; /* No selection at all */ if (!dom_selection || webkit_dom_dom_selection_get_range_count (dom_selection) < 1) { gtk_widget_set_sensitive (dialog->priv->remove_link_button, FALSE); goto chainup; } range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL); link = e_html_editor_dom_node_find_parent_element ( webkit_dom_range_get_start_container (range, NULL), "A"); if (!link) { if ((webkit_dom_range_get_start_container (range, NULL) != webkit_dom_range_get_end_container (range, NULL)) || (webkit_dom_range_get_start_offset (range, NULL) != webkit_dom_range_get_end_offset (range, NULL))) { WebKitDOMDocumentFragment *fragment; fragment = webkit_dom_range_clone_contents (range, NULL); link = e_html_editor_dom_node_find_child_element ( WEBKIT_DOM_NODE (fragment), "A"); } else { WebKitDOMNode *node; node = webkit_dom_range_get_common_ancestor_container (range, NULL); if (node && !WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (node)) { link = e_html_editor_dom_node_find_parent_element (node, "A"); if (link && !WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (link)) link = NULL; } else link = WEBKIT_DOM_ELEMENT (node); } } if (link) { gchar *href, *text; href = webkit_dom_html_anchor_element_get_href ( WEBKIT_DOM_HTML_ANCHOR_ELEMENT (link)); text = webkit_dom_html_element_get_inner_text ( WEBKIT_DOM_HTML_ELEMENT (link)); gtk_entry_set_text ( GTK_ENTRY (dialog->priv->url_edit), href); gtk_entry_set_text ( GTK_ENTRY (dialog->priv->label_edit), text); g_free (text); g_free (href); } else { gchar *text; text = webkit_dom_range_get_text (range); if (text && *text) { gtk_entry_set_text ( GTK_ENTRY (dialog->priv->label_edit), text); gtk_widget_set_sensitive ( dialog->priv->label_edit, FALSE); gtk_widget_set_sensitive ( dialog->priv->remove_link_button, FALSE); } g_free (text); } g_object_unref (range); chainup: g_object_unref (dom_selection); /* Chain up to parent implementation */ GTK_WIDGET_CLASS (e_html_editor_link_dialog_parent_class)->show (widget); }
static void html_editor_link_dialog_ok (EHTMLEditorLinkDialog *dialog) { EHTMLEditor *editor; EHTMLEditorView *view; EHTMLEditorSelection *selection; WebKitDOMDocument *document; WebKitDOMDOMWindow *dom_window; WebKitDOMDOMSelection *dom_selection; WebKitDOMRange *range; WebKitDOMElement *link; editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); selection = e_html_editor_view_get_selection (view); document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view)); dom_window = webkit_dom_document_get_default_view (document); dom_selection = webkit_dom_dom_window_get_selection (dom_window); g_object_unref (dom_window); if (!dom_selection || (webkit_dom_dom_selection_get_range_count (dom_selection) == 0)) { gtk_widget_hide (GTK_WIDGET (dialog)); g_object_unref (dom_selection); return; } range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL); link = e_html_editor_dom_node_find_parent_element ( webkit_dom_range_get_start_container (range, NULL), "A"); if (!link) { if ((webkit_dom_range_get_start_container (range, NULL) != webkit_dom_range_get_end_container (range, NULL)) || (webkit_dom_range_get_start_offset (range, NULL) != webkit_dom_range_get_end_offset (range, NULL))) { WebKitDOMDocumentFragment *fragment; fragment = webkit_dom_range_extract_contents (range, NULL); link = e_html_editor_dom_node_find_child_element ( WEBKIT_DOM_NODE (fragment), "A"); webkit_dom_range_insert_node ( range, WEBKIT_DOM_NODE (fragment), NULL); webkit_dom_dom_selection_set_base_and_extent ( dom_selection, webkit_dom_range_get_start_container (range, NULL), webkit_dom_range_get_start_offset (range, NULL), webkit_dom_range_get_end_container (range, NULL), webkit_dom_range_get_end_offset (range, NULL), NULL); } else { WebKitDOMNode *node; /* get element that was clicked on */ node = webkit_dom_range_get_common_ancestor_container (range, NULL); if (node && !WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (node)) { link = e_html_editor_dom_node_find_parent_element (node, "A"); if (link && !WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (link)) link = NULL; } else link = WEBKIT_DOM_ELEMENT (node); } } if (link) { webkit_dom_html_anchor_element_set_href ( WEBKIT_DOM_HTML_ANCHOR_ELEMENT (link), gtk_entry_get_text (GTK_ENTRY (dialog->priv->url_edit))); webkit_dom_html_element_set_inner_html ( WEBKIT_DOM_HTML_ELEMENT (link), gtk_entry_get_text (GTK_ENTRY (dialog->priv->label_edit)), NULL); } else { gchar *text; /* Check whether a text is selected or not */ text = webkit_dom_range_get_text (range); if (text && *text) { e_html_editor_selection_create_link ( selection, gtk_entry_get_text ( GTK_ENTRY (dialog->priv->url_edit))); } else { gchar *html = g_strdup_printf ( "<a href=\"%s\">%s</a>", gtk_entry_get_text ( GTK_ENTRY (dialog->priv->url_edit)), gtk_entry_get_text ( GTK_ENTRY (dialog->priv->label_edit))); e_html_editor_view_exec_command ( view, E_HTML_EDITOR_VIEW_COMMAND_INSERT_HTML, html); g_free (html); } g_free (text); } g_object_unref (range); g_object_unref (dom_selection); gtk_widget_hide (GTK_WIDGET (dialog)); }