X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b5374b5cfa33cca0053761178fedcba1ddc7a5d9..9e3d4a32106c8c0f85695f68856da137c14d2b5c:/src/gtk/webview_webkit.cpp diff --git a/src/gtk/webview_webkit.cpp b/src/gtk/webview_webkit.cpp index b838f79d9d..c1493d21e6 100644 --- a/src/gtk/webview_webkit.cpp +++ b/src/gtk/webview_webkit.cpp @@ -26,8 +26,9 @@ extern "C" { static void -wxgtk_webkitctrl_load_status_callback(GtkWidget* widget, GParamSpec* arg1, - wxWebViewWebKit *webKitCtrl) +wxgtk_webview_webkit_load_status(GtkWidget* widget, + GParamSpec*, + wxWebViewWebKit *webKitCtrl) { if (!webKitCtrl->m_ready) return; @@ -60,11 +61,13 @@ wxgtk_webkitctrl_load_status_callback(GtkWidget* widget, GParamSpec* arg1, } } -static WebKitNavigationResponse -wxgtk_webkitctrl_navigation_requ_callback(WebKitWebView *web_view, - WebKitWebFrame *frame, - WebKitNetworkRequest *request, - wxWebViewWebKit *webKitCtrl) +static gboolean +wxgtk_webview_webkit_navigation(WebKitWebView*, + WebKitWebFrame *frame, + WebKitNetworkRequest *request, + WebKitWebNavigationAction *, + WebKitWebPolicyDecision *policy_decision, + wxWebViewWebKit *webKitCtrl) { webKitCtrl->m_busy = true; @@ -83,20 +86,21 @@ wxgtk_webkitctrl_navigation_requ_callback(WebKitWebView *web_view, if (thisEvent.IsVetoed()) { webKitCtrl->m_busy = false; - return WEBKIT_NAVIGATION_RESPONSE_IGNORE; + webkit_web_policy_decision_ignore(policy_decision); + return TRUE; } else { - return WEBKIT_NAVIGATION_RESPONSE_ACCEPT; + return FALSE; } } static gboolean -wxgtk_webkitctrl_error (WebKitWebView *web_view, - WebKitWebFrame *web_frame, - gchar *uri, - gpointer web_error, - wxWebViewWebKit* webKitWindow) +wxgtk_webview_webkit_error(WebKitWebView*, + WebKitWebFrame*, + gchar *uri, + gpointer web_error, + wxWebViewWebKit* webKitWindow) { webKitWindow->m_busy = false; wxWebNavigationError type = wxWEB_NAV_ERR_OTHER; @@ -234,6 +238,48 @@ wxgtk_webkitctrl_error (WebKitWebView *web_view, return FALSE; } +static gboolean +wxgtk_webview_webkit_new_window(WebKitWebView*, + WebKitWebFrame *frame, + WebKitNetworkRequest *request, + WebKitWebNavigationAction*, + WebKitWebPolicyDecision *policy_decision, + wxWebViewWebKit *webKitCtrl) +{ + const gchar* uri = webkit_network_request_get_uri(request); + + wxString target = webkit_web_frame_get_name (frame); + wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, + webKitCtrl->GetId(), + wxString( uri, wxConvUTF8 ), + target, + true); + + if (webKitCtrl && webKitCtrl->GetEventHandler()) + webKitCtrl->GetEventHandler()->ProcessEvent(thisEvent); + + //We always want the user to handle this themselves + webkit_web_policy_decision_ignore(policy_decision); + return TRUE; +} + +static void +wxgtk_webview_webkit_title_changed(WebKitWebView *webView, + WebKitWebFrame *frame, + gchar *title, + wxWebViewWebKit *webKitCtrl) +{ + wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, + webKitCtrl->GetId(), + webKitCtrl->GetCurrentURL(), + "", + true); + thisEvent.SetString(wxString(title, wxConvUTF8)); + + if (webKitCtrl && webKitCtrl->GetEventHandler()) + webKitCtrl->GetEventHandler()->ProcessEvent(thisEvent); + +} } // extern "C" @@ -274,18 +320,20 @@ bool wxWebViewWebKit::Create(wxWindow *parent, gtk_widget_show(web_view); g_signal_connect_after(web_view, "notify::load-status", - G_CALLBACK(wxgtk_webkitctrl_load_status_callback), + G_CALLBACK(wxgtk_webview_webkit_load_status), this); - g_signal_connect_after(web_view, "navigation-requested", - G_CALLBACK(wxgtk_webkitctrl_navigation_requ_callback), + g_signal_connect_after(web_view, "navigation-policy-decision-requested", + G_CALLBACK(wxgtk_webview_webkit_navigation), this); g_signal_connect_after(web_view, "load-error", - G_CALLBACK(wxgtk_webkitctrl_error), + G_CALLBACK(wxgtk_webview_webkit_error), this); - // this signal can be added if we care about new frames open requests - //g_signal_connect_after(web_view, "new-window-policy-decision-requested", - // G_CALLBACK(...), this); + g_signal_connect_after(web_view, "new-window-policy-decision-requested", + G_CALLBACK(wxgtk_webview_webkit_new_window), this); + + g_signal_connect_after(web_view, "title-changed", + G_CALLBACK(wxgtk_webview_webkit_title_changed), this); m_parent->DoAddChild( this ); @@ -294,6 +342,11 @@ bool wxWebViewWebKit::Create(wxWindow *parent, /* Open a webpage */ webkit_web_view_load_uri (WEBKIT_WEB_VIEW (web_view), url); + //Get the initial history limit so we can enable and disable it later + WebKitWebBackForwardList* history; + history = webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view)); + m_historyLimit = webkit_web_back_forward_list_get_limit(history); + m_ready = true; return true; @@ -384,6 +437,126 @@ bool wxWebViewWebKit::CanGoForward() return webkit_web_view_can_go_forward (WEBKIT_WEB_VIEW(web_view)); } +void wxWebViewWebKit::ClearHistory() +{ + WebKitWebBackForwardList* history; + history = webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view)); + webkit_web_back_forward_list_clear(history); +} + +void wxWebViewWebKit::EnableHistory(bool enable) +{ + WebKitWebBackForwardList* history; + history = webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view)); + if(enable) + { + webkit_web_back_forward_list_set_limit(history, m_historyLimit); + } + else + { + webkit_web_back_forward_list_set_limit(history, 0); + } +} + +wxVector > wxWebViewWebKit::GetBackwardHistory() +{ + wxVector > backhist; + WebKitWebBackForwardList* history; + history = webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view)); + GList* list = webkit_web_back_forward_list_get_back_list_with_limit(history, + m_historyLimit); + //We need to iterate in reverse to get the order we desire + for(int i = g_list_length(list) - 1; i >= 0 ; i--) + { + WebKitWebHistoryItem* gtkitem = (WebKitWebHistoryItem*)g_list_nth_data(list, i); + wxSharedPtr item(new wxWebHistoryItem( + webkit_web_history_item_get_uri(gtkitem), + webkit_web_history_item_get_title(gtkitem))); + backhist.push_back(item); + m_historyMap[item] = gtkitem; + } + return backhist; +} + +wxVector > wxWebViewWebKit::GetForwardHistory() +{ + wxVector > forwardhist; + WebKitWebBackForwardList* history; + history = webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view)); + GList* list = webkit_web_back_forward_list_get_forward_list_with_limit(history, + m_historyLimit); + for(guint i = 0; i < g_list_length(list); i++) + { + WebKitWebHistoryItem* gtkitem = (WebKitWebHistoryItem*)g_list_nth_data(list, i); + wxSharedPtr item(new wxWebHistoryItem( + webkit_web_history_item_get_uri(gtkitem), + webkit_web_history_item_get_title(gtkitem))); + forwardhist.push_back(item); + m_historyMap[item] = gtkitem; + } + return forwardhist; +} + +void wxWebViewWebKit::LoadHistoryItem(wxSharedPtr item) +{ + WebKitWebHistoryItem* gtkitem = m_historyMap[item]; + if(gtkitem) + { + WebKitWebBackForwardList* history; + history = webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view)); + webkit_web_back_forward_list_go_to_item(history, gtkitem); + } +} + +bool wxWebViewWebKit::CanCut() +{ + return webkit_web_view_can_cut_clipboard(WEBKIT_WEB_VIEW(web_view)); +} + +bool wxWebViewWebKit::CanCopy() +{ + return webkit_web_view_can_copy_clipboard(WEBKIT_WEB_VIEW(web_view)); +} + +bool wxWebViewWebKit::CanPaste() +{ + return webkit_web_view_can_paste_clipboard(WEBKIT_WEB_VIEW(web_view)); +} + +void wxWebViewWebKit::Cut() +{ + webkit_web_view_cut_clipboard(WEBKIT_WEB_VIEW(web_view)); +} + +void wxWebViewWebKit::Copy() +{ + webkit_web_view_copy_clipboard(WEBKIT_WEB_VIEW(web_view)); +} + +void wxWebViewWebKit::Paste() +{ + webkit_web_view_paste_clipboard(WEBKIT_WEB_VIEW(web_view)); +} + +bool wxWebViewWebKit::CanUndo() +{ + return webkit_web_view_can_undo(WEBKIT_WEB_VIEW(web_view)); +} + +bool wxWebViewWebKit::CanRedo() +{ + return webkit_web_view_can_redo(WEBKIT_WEB_VIEW(web_view)); +} + +void wxWebViewWebKit::Undo() +{ + webkit_web_view_undo(WEBKIT_WEB_VIEW(web_view)); +} + +void wxWebViewWebKit::Redo() +{ + webkit_web_view_redo(WEBKIT_WEB_VIEW(web_view)); +} wxString wxWebViewWebKit::GetCurrentURL() { @@ -548,6 +721,102 @@ bool wxWebViewWebKit::IsBusy() */ } +void wxWebViewWebKit::SetEditable(bool enable) +{ + webkit_web_view_set_editable(WEBKIT_WEB_VIEW(web_view), enable); +} + +bool wxWebViewWebKit::IsEditable() +{ + return webkit_web_view_get_editable(WEBKIT_WEB_VIEW(web_view)); +} + +void wxWebViewWebKit::DeleteSelection() +{ + webkit_web_view_delete_selection(WEBKIT_WEB_VIEW(web_view)); +} + +bool wxWebViewWebKit::HasSelection() +{ + return webkit_web_view_has_selection(WEBKIT_WEB_VIEW(web_view)); +} + +void wxWebViewWebKit::SelectAll() +{ + webkit_web_view_select_all(WEBKIT_WEB_VIEW(web_view)); +} + +wxString wxWebViewWebKit::GetSelectedText() +{ + WebKitDOMDocument* doc; + WebKitDOMDOMWindow* win; + WebKitDOMDOMSelection* sel; + WebKitDOMRange* range; + + doc = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(web_view)); + win = webkit_dom_document_get_default_view(WEBKIT_DOM_DOCUMENT(doc)); + sel = webkit_dom_dom_window_get_selection(WEBKIT_DOM_DOM_WINDOW(win)); + range = webkit_dom_dom_selection_get_range_at(WEBKIT_DOM_DOM_SELECTION(sel), + 0, NULL); + return wxString(webkit_dom_range_get_text(WEBKIT_DOM_RANGE(range)), + wxConvUTF8); +} + +wxString wxWebViewWebKit::GetSelectedSource() +{ + WebKitDOMDocument* doc; + WebKitDOMDOMWindow* win; + WebKitDOMDOMSelection* sel; + WebKitDOMRange* range; + WebKitDOMElement* div; + WebKitDOMDocumentFragment* clone; + WebKitDOMHTMLElement* html; + + doc = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(web_view)); + win = webkit_dom_document_get_default_view(WEBKIT_DOM_DOCUMENT(doc)); + sel = webkit_dom_dom_window_get_selection(WEBKIT_DOM_DOM_WINDOW(win)); + range = webkit_dom_dom_selection_get_range_at(WEBKIT_DOM_DOM_SELECTION(sel), + 0, NULL); + div = webkit_dom_document_create_element(WEBKIT_DOM_DOCUMENT(doc), "div", NULL); + + clone = webkit_dom_range_clone_contents(WEBKIT_DOM_RANGE(range), NULL); + webkit_dom_node_append_child(&div->parent_instance, &clone->parent_instance, NULL); + html = (WebKitDOMHTMLElement*)div; + + return wxString(webkit_dom_html_element_get_inner_html(WEBKIT_DOM_HTML_ELEMENT(html)), + wxConvUTF8); +} + +void wxWebViewWebKit::ClearSelection() +{ + WebKitDOMDocument* doc; + WebKitDOMDOMWindow* win; + WebKitDOMDOMSelection* sel; + + doc = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(web_view)); + win = webkit_dom_document_get_default_view(WEBKIT_DOM_DOCUMENT(doc)); + sel = webkit_dom_dom_window_get_selection(WEBKIT_DOM_DOM_WINDOW(win)); + webkit_dom_dom_selection_remove_all_ranges(WEBKIT_DOM_DOM_SELECTION(sel)); + +} + +wxString wxWebViewWebKit::GetPageText() +{ + WebKitDOMDocument* doc; + WebKitDOMHTMLElement* body; + + doc = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(web_view)); + body = webkit_dom_document_get_body(WEBKIT_DOM_DOCUMENT(doc)); + return wxString(webkit_dom_html_element_get_inner_text(WEBKIT_DOM_HTML_ELEMENT(body)), + wxConvUTF8); +} + +void wxWebViewWebKit::RunScript(const wxString& javascript) +{ + webkit_web_view_execute_script(WEBKIT_WEB_VIEW(web_view), + javascript.mb_str(wxConvUTF8)); +} + // static wxVisualAttributes wxWebViewWebKit::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))