/** * e_html_editor_dom_node_find_parent_element: * @node: Start node * @tagname: Tag name of element to search * * Recursively searches for first occurance of element with given @tagname * that is parent of given @node. * * Returns: A #WebKitDOMElement with @tagname representing parent of @node or * @NULL when @node has no parent with given @tagname. When @node matches @tagname, * then the @node is returned. */ WebKitDOMElement * e_html_editor_dom_node_find_parent_element (WebKitDOMNode *node, const gchar *tagname) { gint taglen = strlen (tagname); while (node) { if (WEBKIT_DOM_IS_ELEMENT (node)) { gchar *node_tagname; node_tagname = webkit_dom_element_get_tag_name ( WEBKIT_DOM_ELEMENT (node)); if (node_tagname && (strlen (node_tagname) == taglen) && (g_ascii_strncasecmp (node_tagname, tagname, taglen) == 0)) { g_free (node_tagname); return WEBKIT_DOM_ELEMENT (node); } g_free (node_tagname); } node = WEBKIT_DOM_NODE (webkit_dom_node_get_parent_element (node)); } return NULL; }
/** * e_html_editor_dom_node_find_child_element: * @node: Start node * @tagname: Tag name of element to search. * * Recursively searches for first occurrence of element with given @tagname that * is a child of @node. * * Returns: A #WebKitDOMElement with @tagname representing a child of @node or * @NULL when @node has no child with given @tagname. When @node matches @tagname, * then the @node is returned. */ WebKitDOMElement * e_html_editor_dom_node_find_child_element (WebKitDOMNode *node, const gchar *tagname) { WebKitDOMNode *start_node = node; gint taglen = strlen (tagname); do { if (WEBKIT_DOM_IS_ELEMENT (node)) { gchar *node_tagname; node_tagname = webkit_dom_element_get_tag_name ( WEBKIT_DOM_ELEMENT (node)); if (node_tagname && (strlen (node_tagname) == taglen) && (g_ascii_strncasecmp (node_tagname, tagname, taglen) == 0)) { g_free (node_tagname); return WEBKIT_DOM_ELEMENT (node); } g_free (node_tagname); } if (webkit_dom_node_has_child_nodes (node)) { node = webkit_dom_node_get_first_child (node); } else if (webkit_dom_node_get_next_sibling (node)) { node = webkit_dom_node_get_next_sibling (node); } else { node = webkit_dom_node_get_parent_node (node); } } while (!webkit_dom_node_is_same_node (node, start_node)); return NULL; }
gboolean e_editor_selection_get_superscript (EEditorSelection *selection) { WebKitDOMNode *node; WebKitDOMRange *range; g_return_val_if_fail (E_IS_EDITOR_SELECTION (selection), FALSE); range = editor_selection_get_current_range (selection); node = webkit_dom_range_get_common_ancestor_container (range, NULL); while (node) { gchar *tag_name; tag_name = webkit_dom_element_get_tag_name (WEBKIT_DOM_ELEMENT (node)); if (g_ascii_strncasecmp (tag_name, "sup", 3) == 0) { g_free (tag_name); break; } g_free (tag_name); node = webkit_dom_node_get_parent_node (node); } return (node != NULL); }
static Element *get_active_element(Document *doc) { char *tagname; Document *d = NULL; Element *active, *result = NULL; active = webkit_dom_html_document_get_active_element((void*)doc); if (!active) { return result; } tagname = webkit_dom_element_get_tag_name(active); if (!g_strcmp0(tagname, "FRAME")) { d = webkit_dom_html_frame_element_get_content_document(WEBKIT_DOM_HTML_FRAME_ELEMENT(active)); result = get_active_element(d); } else if (!g_strcmp0(tagname, "IFRAME")) { d = webkit_dom_html_iframe_element_get_content_document(WEBKIT_DOM_HTML_IFRAME_ELEMENT(active)); result = get_active_element(d); } g_free(tagname); if (result) { return result; } return active; }
/** * Indicates if the given dom element is an editable element like text input, * password or textarea. */ gboolean dom_is_editable(Element *element) { gboolean result = false; char *tagname, *type; if (!element) { return result; } tagname = webkit_dom_element_get_tag_name(element); type = webkit_dom_element_get_attribute(element, "type"); /* element is editable if it's a text area or input with no type, text or * pasword */ if (!g_ascii_strcasecmp(tagname, "textarea")) { result = true; } else if (!g_ascii_strcasecmp(tagname, "input") && (!*type || !g_ascii_strcasecmp(type, "text") || !g_ascii_strcasecmp(type, "password")) ) { result = true; } else { result = false; } g_free(tagname); g_free(type); return result; }
static gboolean get_has_style (EEditorSelection *selection, const gchar *style_tag) { WebKitDOMNode *node; WebKitDOMElement *element; WebKitDOMRange *range; gboolean result; gint tag_len; range = editor_selection_get_current_range (selection); if (!range) return FALSE; node = webkit_dom_range_get_start_container (range, NULL); if (!WEBKIT_DOM_IS_ELEMENT (node)) element = webkit_dom_node_get_parent_element (node); else element = WEBKIT_DOM_ELEMENT (node); tag_len = strlen (style_tag); result = FALSE; while (!result && element) { gchar *element_tag; element_tag = webkit_dom_element_get_tag_name (element); result = ((tag_len == strlen (element_tag)) && (g_ascii_strncasecmp (element_tag, style_tag, tag_len) == 0)); /* Special case: <blockquote type=cite> marks quotation, while * just <blockquote> is used for indentation. If the <blockquote> * has type=cite, then ignore it */ if (result && g_ascii_strncasecmp (element_tag, "blockquote", 10) == 0) { if (webkit_dom_element_has_attribute (element, "type")) { gchar *type; type = webkit_dom_element_get_attribute ( element, "type"); if (g_ascii_strncasecmp (type, "cite", 4) == 0) { result = FALSE; } g_free (type); } } g_free (element_tag); if (result) { break; } element = webkit_dom_node_get_parent_element ( WEBKIT_DOM_NODE (element)); } return result; }
static gboolean plugins_before_load_cb(WebKitDOMDOMWindow *win, WebKitDOMEvent *event, GList *gl) { WebKitDOMElement *element = (void*)webkit_dom_event_get_src_element(event); char *tagname = webkit_dom_element_get_tag_name(element); char *type = webkit_dom_element_get_attribute(element, "type"); if ( (!g_strcmp0(type, "application/x-shockwave-flash") && (! g_ascii_strcasecmp(tagname, "object") || ! g_ascii_strcasecmp(tagname, "embed")) ) && ! g_slist_find(ALLOWED(gl), element) ) { VIEW(gl)->plugins->status |= PLUGIN_STATUS_HAS_PLUGIN; webkit_dom_event_prevent_default(event); webkit_dom_event_stop_propagation(event); plugins_create_click_element(element, gl); } g_object_unref(element); g_free(tagname); g_free(type); return true; }