aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Vrátil <dvratil@redhat.com>2012-08-08 19:48:25 +0800
committerDan Vrátil <dvratil@redhat.com>2012-08-08 19:48:25 +0800
commit83c97e53c0be962d2db12d09b6e1a8bf91fcd93e (patch)
treee454c64dc9b43588908684e8d70f6e97f87f9cca
parent7fbcda03748b20ee399435f4f2d91e6b05f51314 (diff)
downloadgsoc2013-evolution-83c97e53c0be962d2db12d09b6e1a8bf91fcd93e.tar.gz
gsoc2013-evolution-83c97e53c0be962d2db12d09b6e1a8bf91fcd93e.tar.zst
gsoc2013-evolution-83c97e53c0be962d2db12d09b6e1a8bf91fcd93e.zip
Bug #681279 - Reply on selection doesn't work
-rw-r--r--widgets/misc/e-web-view.c89
1 files changed, 70 insertions, 19 deletions
diff --git a/widgets/misc/e-web-view.c b/widgets/misc/e-web-view.c
index e4d7be7e09..bb7f64e8bf 100644
--- a/widgets/misc/e-web-view.c
+++ b/widgets/misc/e-web-view.c
@@ -2847,15 +2847,66 @@ e_web_view_update_actions (EWebView *web_view,
g_signal_emit (web_view, signals[UPDATE_ACTIONS], 0, event);
}
-gchar *
-e_web_view_get_selection_html (EWebView *web_view)
+static gchar *
+web_view_get_frame_selection_html (WebKitDOMElement *iframe)
{
WebKitDOMDocument *document;
WebKitDOMDOMWindow *window;
WebKitDOMDOMSelection *selection;
- WebKitDOMRange *range;
- WebKitDOMDocumentFragment *fragment;
- WebKitDOMHTMLElement *element;
+ WebKitDOMNodeList *frames;
+ gulong ii, length;
+
+ document = webkit_dom_html_iframe_element_get_content_document (
+ WEBKIT_DOM_HTML_IFRAME_ELEMENT (iframe));
+ window = webkit_dom_document_get_default_view (document);
+ selection = webkit_dom_dom_window_get_selection (window);
+ if (selection && (webkit_dom_dom_selection_get_range_count (selection) > 0)) {
+ WebKitDOMRange *range;
+ WebKitDOMElement *element;
+ WebKitDOMDocumentFragment *fragment;
+
+ range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
+ if (range) {
+ fragment = webkit_dom_range_clone_contents (
+ range, NULL);
+
+ element = webkit_dom_document_create_element (
+ document, "DIV", NULL);
+ webkit_dom_node_append_child (
+ WEBKIT_DOM_NODE (element),
+ WEBKIT_DOM_NODE (fragment), NULL);
+
+ return webkit_dom_html_element_get_inner_html (
+ WEBKIT_DOM_HTML_ELEMENT (element));
+ }
+ }
+
+ frames = webkit_dom_document_get_elements_by_tag_name (
+ document, "IFRAME");
+ length = webkit_dom_node_list_get_length (frames);
+ for (ii = 0; ii < length; ii++) {
+ WebKitDOMNode *node;
+ gchar *text;
+
+ node = webkit_dom_node_list_item (frames, ii);
+
+ text = web_view_get_frame_selection_html (
+ WEBKIT_DOM_ELEMENT (node));
+
+ if (text) {
+ return text;
+ }
+ }
+
+ return NULL;
+}
+
+gchar *
+e_web_view_get_selection_html (EWebView *web_view)
+{
+ WebKitDOMDocument *document;
+ WebKitDOMNodeList *frames;
+ gulong ii, length;
g_return_val_if_fail (E_IS_WEB_VIEW (web_view), NULL);
@@ -2863,24 +2914,24 @@ e_web_view_get_selection_html (EWebView *web_view)
return NULL;
document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (web_view));
- window = webkit_dom_document_get_default_view (document);
- selection = webkit_dom_dom_window_get_selection (window);
- if (!selection)
- return NULL;
+ frames = webkit_dom_document_get_elements_by_tag_name (document, "IFRAME");
+ length = webkit_dom_node_list_get_length (frames);
- range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
- if (!range)
- return NULL;
+ for (ii = 0; ii < length; ii++) {
+ gchar *text;
+ WebKitDOMNode *node;
- fragment = webkit_dom_range_clone_contents (range, NULL);
- if (!fragment)
- return NULL;
+ node = webkit_dom_node_list_item (frames, ii);
- element = WEBKIT_DOM_HTML_ELEMENT (webkit_dom_document_create_element (document, "div", NULL));
- webkit_dom_node_append_child (WEBKIT_DOM_NODE (element),
- WEBKIT_DOM_NODE (fragment), NULL);
+ text = web_view_get_frame_selection_html (
+ WEBKIT_DOM_ELEMENT (node));
- return webkit_dom_html_element_get_inner_html (element);
+ if (text) {
+ return text;
+ }
+ }
+
+ return NULL;
}
void