1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/gtk/webview_webkit.cpp
3 // Purpose: GTK WebKit backend for web view component
4 // Author: Marianne Gagnon, Robert Roebling
6 // Copyright: (c) 2010 Marianne Gagnon, 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 // For compilers that support precompilation, includes "wx.h".
11 #include "wx/wxprec.h"
13 #if wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT
15 #include "wx/stockitem.h"
16 #include "wx/gtk/webview_webkit.h"
17 #include "wx/gtk/control.h"
18 #include "wx/gtk/private.h"
19 #include "wx/filesys.h"
20 #include "wx/base64.h"
21 #include <webkit/webkit.h>
23 // ----------------------------------------------------------------------------
25 // ----------------------------------------------------------------------------
31 wxgtk_webview_webkit_load_status(GtkWidget
* widget
,
33 wxWebViewWebKit
*webKitCtrl
)
35 if (!webKitCtrl
->m_ready
) return;
37 wxString url
= webKitCtrl
->GetCurrentURL();
39 WebKitLoadStatus status
;
40 g_object_get(G_OBJECT(widget
), "load-status", &status
, NULL
);
42 wxString target
; // TODO: get target (if possible)
44 if (status
== WEBKIT_LOAD_FINISHED
)
46 WebKitWebBackForwardList
* hist
= webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(widget
));
47 WebKitWebHistoryItem
* item
= webkit_web_back_forward_list_get_current_item(hist
);
48 //We have to check if we are actually storing history
49 //If the item isn't added we add it ourselves, it isn't added otherwise
50 //with a custom scheme.
51 if(WEBKIT_IS_WEB_HISTORY_ITEM(item
) && webkit_web_history_item_get_uri(item
) != url
)
54 newitem
= webkit_web_history_item_new_with_data
57 webKitCtrl
->GetCurrentTitle().utf8_str()
59 webkit_web_back_forward_list_add_item(hist
, newitem
);
62 webKitCtrl
->m_busy
= false;
63 wxWebViewEvent
event(wxEVT_COMMAND_WEB_VIEW_LOADED
,
67 if (webKitCtrl
&& webKitCtrl
->GetEventHandler())
68 webKitCtrl
->GetEventHandler()->ProcessEvent(event
);
70 else if (status
== WEBKIT_LOAD_COMMITTED
)
72 webKitCtrl
->m_busy
= true;
73 wxWebViewEvent
event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED
,
77 if (webKitCtrl
&& webKitCtrl
->GetEventHandler())
78 webKitCtrl
->GetEventHandler()->ProcessEvent(event
);
83 wxgtk_webview_webkit_navigation(WebKitWebView
*,
84 WebKitWebFrame
*frame
,
85 WebKitNetworkRequest
*request
,
86 WebKitWebNavigationAction
*,
87 WebKitWebPolicyDecision
*policy_decision
,
88 wxWebViewWebKit
*webKitCtrl
)
90 if(webKitCtrl
->m_guard
)
92 webKitCtrl
->m_guard
= false;
93 //We set this to make sure that we don't try to load the page again from
94 //the resource request callback
95 webKitCtrl
->m_vfsurl
= webkit_network_request_get_uri(request
);
96 webkit_web_policy_decision_use(policy_decision
);
100 webKitCtrl
->m_busy
= true;
102 const gchar
* uri
= webkit_network_request_get_uri(request
);
104 wxString target
= webkit_web_frame_get_name (frame
);
105 wxWebViewEvent
event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING
,
107 wxString( uri
, wxConvUTF8
),
110 if (webKitCtrl
&& webKitCtrl
->GetEventHandler())
111 webKitCtrl
->GetEventHandler()->ProcessEvent(event
);
113 if (!event
.IsAllowed())
115 webKitCtrl
->m_busy
= false;
116 webkit_web_policy_decision_ignore(policy_decision
);
121 wxString wxuri
= uri
;
122 wxSharedPtr
<wxWebViewHandler
> handler
;
123 wxVector
<wxSharedPtr
<wxWebViewHandler
> > hanlders
= webKitCtrl
->GetHandlers();
124 //We are not vetoed so see if we match one of the additional handlers
125 for(wxVector
<wxSharedPtr
<wxWebViewHandler
> >::iterator it
= hanlders
.begin();
126 it
!= hanlders
.end(); ++it
)
128 if(wxuri
.substr(0, (*it
)->GetName().length()) == (*it
)->GetName())
133 //If we found a handler we can then use it to load the file directly
137 webKitCtrl
->m_guard
= true;
138 wxFSFile
* file
= handler
->GetFile(wxuri
);
141 webKitCtrl
->SetPage(*file
->GetStream(), wxuri
);
143 //We need to throw some sort of error here if file is NULL
144 webkit_web_policy_decision_ignore(policy_decision
);
152 wxgtk_webview_webkit_error(WebKitWebView
*,
156 wxWebViewWebKit
* webKitWindow
)
158 webKitWindow
->m_busy
= false;
159 wxWebViewNavigationError type
= wxWEB_NAV_ERR_OTHER
;
161 GError
* error
= (GError
*)web_error
;
162 wxString
description(error
->message
, wxConvUTF8
);
164 if (strcmp(g_quark_to_string(error
->domain
), "soup_http_error_quark") == 0)
168 case SOUP_STATUS_CANCELLED
:
169 type
= wxWEB_NAV_ERR_USER_CANCELLED
;
172 case SOUP_STATUS_CANT_RESOLVE
:
173 case SOUP_STATUS_NOT_FOUND
:
174 type
= wxWEB_NAV_ERR_NOT_FOUND
;
177 case SOUP_STATUS_CANT_RESOLVE_PROXY
:
178 case SOUP_STATUS_CANT_CONNECT
:
179 case SOUP_STATUS_CANT_CONNECT_PROXY
:
180 case SOUP_STATUS_SSL_FAILED
:
181 case SOUP_STATUS_IO_ERROR
:
182 type
= wxWEB_NAV_ERR_CONNECTION
;
185 case SOUP_STATUS_MALFORMED
:
186 //case SOUP_STATUS_TOO_MANY_REDIRECTS:
187 type
= wxWEB_NAV_ERR_REQUEST
;
190 //case SOUP_STATUS_NO_CONTENT:
191 //case SOUP_STATUS_RESET_CONTENT:
193 case SOUP_STATUS_BAD_REQUEST
:
194 type
= wxWEB_NAV_ERR_REQUEST
;
197 case SOUP_STATUS_UNAUTHORIZED
:
198 case SOUP_STATUS_FORBIDDEN
:
199 type
= wxWEB_NAV_ERR_AUTH
;
202 case SOUP_STATUS_METHOD_NOT_ALLOWED
:
203 case SOUP_STATUS_NOT_ACCEPTABLE
:
204 type
= wxWEB_NAV_ERR_SECURITY
;
207 case SOUP_STATUS_PROXY_AUTHENTICATION_REQUIRED
:
208 type
= wxWEB_NAV_ERR_AUTH
;
211 case SOUP_STATUS_REQUEST_TIMEOUT
:
212 type
= wxWEB_NAV_ERR_CONNECTION
;
215 //case SOUP_STATUS_PAYMENT_REQUIRED:
216 case SOUP_STATUS_REQUEST_ENTITY_TOO_LARGE
:
217 case SOUP_STATUS_REQUEST_URI_TOO_LONG
:
218 case SOUP_STATUS_UNSUPPORTED_MEDIA_TYPE
:
219 type
= wxWEB_NAV_ERR_REQUEST
;
222 case SOUP_STATUS_BAD_GATEWAY
:
223 case SOUP_STATUS_SERVICE_UNAVAILABLE
:
224 case SOUP_STATUS_GATEWAY_TIMEOUT
:
225 type
= wxWEB_NAV_ERR_CONNECTION
;
228 case SOUP_STATUS_HTTP_VERSION_NOT_SUPPORTED
:
229 type
= wxWEB_NAV_ERR_REQUEST
;
231 //case SOUP_STATUS_INSUFFICIENT_STORAGE:
232 //case SOUP_STATUS_NOT_EXTENDED:
235 else if (strcmp(g_quark_to_string(error
->domain
),
236 "webkit-network-error-quark") == 0)
240 //WEBKIT_NETWORK_ERROR_FAILED:
241 //WEBKIT_NETWORK_ERROR_TRANSPORT:
243 case WEBKIT_NETWORK_ERROR_UNKNOWN_PROTOCOL
:
244 type
= wxWEB_NAV_ERR_REQUEST
;
247 case WEBKIT_NETWORK_ERROR_CANCELLED
:
248 type
= wxWEB_NAV_ERR_USER_CANCELLED
;
251 case WEBKIT_NETWORK_ERROR_FILE_DOES_NOT_EXIST
:
252 type
= wxWEB_NAV_ERR_NOT_FOUND
;
256 else if (strcmp(g_quark_to_string(error
->domain
),
257 "webkit-policy-error-quark") == 0)
261 //case WEBKIT_POLICY_ERROR_FAILED:
262 //case WEBKIT_POLICY_ERROR_CANNOT_SHOW_MIME_TYPE:
263 //case WEBKIT_POLICY_ERROR_CANNOT_SHOW_URL:
264 //case WEBKIT_POLICY_ERROR_FRAME_LOAD_INTERRUPTED_BY_POLICY_CHANGE:
265 case WEBKIT_POLICY_ERROR_CANNOT_USE_RESTRICTED_PORT
:
266 type
= wxWEB_NAV_ERR_SECURITY
;
271 webkit_plugin_error_quark
274 printf("Error domain %s\n", g_quark_to_string(error->domain));
278 wxWebViewEvent
event(wxEVT_COMMAND_WEB_VIEW_ERROR
,
279 webKitWindow
->GetId(),
281 event
.SetString(description
);
284 if (webKitWindow
&& webKitWindow
->GetEventHandler())
286 webKitWindow
->GetEventHandler()->ProcessEvent(event
);
293 wxgtk_webview_webkit_new_window(WebKitWebView
*,
294 WebKitWebFrame
*frame
,
295 WebKitNetworkRequest
*request
,
296 WebKitWebNavigationAction
*,
297 WebKitWebPolicyDecision
*policy_decision
,
298 wxWebViewWebKit
*webKitCtrl
)
300 const gchar
* uri
= webkit_network_request_get_uri(request
);
302 wxString target
= webkit_web_frame_get_name (frame
);
303 wxWebViewEvent
event(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW
,
305 wxString( uri
, wxConvUTF8
),
308 if (webKitCtrl
&& webKitCtrl
->GetEventHandler())
309 webKitCtrl
->GetEventHandler()->ProcessEvent(event
);
311 //We always want the user to handle this themselves
312 webkit_web_policy_decision_ignore(policy_decision
);
317 wxgtk_webview_webkit_title_changed(WebKitWebView
*,
320 wxWebViewWebKit
*webKitCtrl
)
322 wxWebViewEvent
event(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED
,
324 webKitCtrl
->GetCurrentURL(),
326 event
.SetString(wxString(title
, wxConvUTF8
));
328 if (webKitCtrl
&& webKitCtrl
->GetEventHandler())
329 webKitCtrl
->GetEventHandler()->ProcessEvent(event
);
334 wxgtk_webview_webkit_resource_req(WebKitWebView
*,
337 WebKitNetworkRequest
*request
,
338 WebKitNetworkResponse
*,
339 wxWebViewWebKit
*webKitCtrl
)
341 wxString uri
= webkit_network_request_get_uri(request
);
343 wxSharedPtr
<wxWebViewHandler
> handler
;
344 wxVector
<wxSharedPtr
<wxWebViewHandler
> > hanlders
= webKitCtrl
->GetHandlers();
346 //We are not vetoed so see if we match one of the additional handlers
347 for(wxVector
<wxSharedPtr
<wxWebViewHandler
> >::iterator it
= hanlders
.begin();
348 it
!= hanlders
.end(); ++it
)
350 if(uri
.substr(0, (*it
)->GetName().length()) == (*it
)->GetName())
355 //If we found a handler we can then use it to load the file directly
359 //If it is requsting the page itself then return as we have already
360 //loaded it from the archive
361 if(webKitCtrl
->m_vfsurl
== uri
)
364 wxFSFile
* file
= handler
->GetFile(uri
);
367 //We load the data into a data url to save it being written out again
368 size_t size
= file
->GetStream()->GetLength();
369 char *buffer
= new char[size
];
370 file
->GetStream()->Read(buffer
, size
);
371 wxString data
= wxBase64Encode(buffer
, size
);
373 wxString mime
= file
->GetMimeType();
374 wxString path
= "data:" + mime
+ ";base64," + data
;
375 //Then we can redirect the call
376 webkit_network_request_set_uri(request
, path
.utf8_str());
384 //-----------------------------------------------------------------------------
386 //-----------------------------------------------------------------------------
388 wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewWebKit
, wxWebView
);
390 bool wxWebViewWebKit
::Create(wxWindow
*parent
,
396 const wxString
& name
)
402 if (!PreCreation( parent
, pos
, size
) ||
403 !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
))
405 wxFAIL_MSG( wxT("wxWebViewWebKit creation failed") );
409 GtkWidget
*scrolled_window
= gtk_scrolled_window_new (NULL
, NULL
);
410 web_view
= webkit_web_view_new ();
411 g_object_ref(web_view
); // TODO: check memory management
413 m_widget
= scrolled_window
;
414 g_object_ref(m_widget
); // TODO: check memory management
416 /* Place the WebKitWebView in the GtkScrolledWindow */
417 gtk_container_add (GTK_CONTAINER (scrolled_window
), web_view
);
418 gtk_widget_show(web_view
);
420 g_signal_connect_after(web_view
, "notify::load-status",
421 G_CALLBACK(wxgtk_webview_webkit_load_status
),
423 g_signal_connect_after(web_view
, "navigation-policy-decision-requested",
424 G_CALLBACK(wxgtk_webview_webkit_navigation
),
426 g_signal_connect_after(web_view
, "load-error",
427 G_CALLBACK(wxgtk_webview_webkit_error
),
430 g_signal_connect_after(web_view
, "new-window-policy-decision-requested",
431 G_CALLBACK(wxgtk_webview_webkit_new_window
), this);
433 g_signal_connect_after(web_view
, "title-changed",
434 G_CALLBACK(wxgtk_webview_webkit_title_changed
), this);
436 g_signal_connect_after(web_view
, "resource-request-starting",
437 G_CALLBACK(wxgtk_webview_webkit_resource_req
), this);
439 m_parent
->DoAddChild( this );
444 webkit_web_view_load_uri (WEBKIT_WEB_VIEW (web_view
), url
.utf8_str());
446 //Get the initial history limit so we can enable and disable it later
447 WebKitWebBackForwardList
* history
;
448 history
= webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view
));
449 m_historyLimit
= webkit_web_back_forward_list_get_limit(history
);
456 bool wxWebViewWebKit
::Enable( bool enable
)
458 if (!wxControl
::Enable(enable
))
461 gtk_widget_set_sensitive(GTK_BIN(m_widget
)->child
, enable
);
464 // GTKFixSensitivity();
470 wxWebViewWebKit
::GTKGetWindow(wxArrayGdkWindows
& WXUNUSED(windows
)) const
472 GdkWindow
* window
= gtk_widget_get_parent_window(m_widget
);
476 void wxWebViewWebKit
::ZoomIn()
478 webkit_web_view_zoom_in (WEBKIT_WEB_VIEW(web_view
));
481 void wxWebViewWebKit
::ZoomOut()
483 webkit_web_view_zoom_out (WEBKIT_WEB_VIEW(web_view
));
486 void wxWebViewWebKit
::SetWebkitZoom(float level
)
488 webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW(web_view
), level
);
491 float wxWebViewWebKit
::GetWebkitZoom() const
493 return webkit_web_view_get_zoom_level (WEBKIT_WEB_VIEW(web_view
));
496 void wxWebViewWebKit
::Stop()
498 webkit_web_view_stop_loading (WEBKIT_WEB_VIEW(web_view
));
501 void wxWebViewWebKit
::Reload(wxWebViewReloadFlags flags
)
503 if (flags
& wxWEB_VIEW_RELOAD_NO_CACHE
)
505 webkit_web_view_reload_bypass_cache (WEBKIT_WEB_VIEW(web_view
));
509 webkit_web_view_reload (WEBKIT_WEB_VIEW(web_view
));
513 void wxWebViewWebKit
::LoadURL(const wxString
& url
)
515 webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view
), wxGTK_CONV(url
));
519 void wxWebViewWebKit
::GoBack()
521 webkit_web_view_go_back (WEBKIT_WEB_VIEW(web_view
));
524 void wxWebViewWebKit
::GoForward()
526 webkit_web_view_go_forward (WEBKIT_WEB_VIEW(web_view
));
530 bool wxWebViewWebKit
::CanGoBack() const
532 return webkit_web_view_can_go_back (WEBKIT_WEB_VIEW(web_view
));
536 bool wxWebViewWebKit
::CanGoForward() const
538 return webkit_web_view_can_go_forward (WEBKIT_WEB_VIEW(web_view
));
541 void wxWebViewWebKit
::ClearHistory()
543 WebKitWebBackForwardList
* history
;
544 history
= webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view
));
545 webkit_web_back_forward_list_clear(history
);
548 void wxWebViewWebKit
::EnableHistory(bool enable
)
550 WebKitWebBackForwardList
* history
;
551 history
= webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view
));
554 webkit_web_back_forward_list_set_limit(history
, m_historyLimit
);
558 webkit_web_back_forward_list_set_limit(history
, 0);
562 wxVector
<wxSharedPtr
<wxWebViewHistoryItem
> > wxWebViewWebKit
::GetBackwardHistory()
564 wxVector
<wxSharedPtr
<wxWebViewHistoryItem
> > backhist
;
565 WebKitWebBackForwardList
* history
;
566 history
= webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view
));
567 GList
* list
= webkit_web_back_forward_list_get_back_list_with_limit(history
,
569 //We need to iterate in reverse to get the order we desire
570 for(int i
= g_list_length(list
) - 1; i
>= 0 ; i
--)
572 WebKitWebHistoryItem
* gtkitem
= (WebKitWebHistoryItem
*)g_list_nth_data(list
, i
);
573 wxWebViewHistoryItem
* wxitem
= new wxWebViewHistoryItem(
574 webkit_web_history_item_get_uri(gtkitem
),
575 webkit_web_history_item_get_title(gtkitem
));
576 wxitem
->m_histItem
= gtkitem
;
577 wxSharedPtr
<wxWebViewHistoryItem
> item(wxitem
);
578 backhist
.push_back(item
);
583 wxVector
<wxSharedPtr
<wxWebViewHistoryItem
> > wxWebViewWebKit
::GetForwardHistory()
585 wxVector
<wxSharedPtr
<wxWebViewHistoryItem
> > forwardhist
;
586 WebKitWebBackForwardList
* history
;
587 history
= webkit_web_view_get_back_forward_list(WEBKIT_WEB_VIEW(web_view
));
588 GList
* list
= webkit_web_back_forward_list_get_forward_list_with_limit(history
,
590 for(guint i
= 0; i
< g_list_length(list
); i
++)
592 WebKitWebHistoryItem
* gtkitem
= (WebKitWebHistoryItem
*)g_list_nth_data(list
, i
);
593 wxWebViewHistoryItem
* wxitem
= new wxWebViewHistoryItem(
594 webkit_web_history_item_get_uri(gtkitem
),
595 webkit_web_history_item_get_title(gtkitem
));
596 wxitem
->m_histItem
= gtkitem
;
597 wxSharedPtr
<wxWebViewHistoryItem
> item(wxitem
);
598 forwardhist
.push_back(item
);
603 void wxWebViewWebKit
::LoadHistoryItem(wxSharedPtr
<wxWebViewHistoryItem
> item
)
605 WebKitWebHistoryItem
* gtkitem
= (WebKitWebHistoryItem
*)item
->m_histItem
;
608 webkit_web_view_go_to_back_forward_item(WEBKIT_WEB_VIEW(web_view
),
609 WEBKIT_WEB_HISTORY_ITEM(gtkitem
));
613 bool wxWebViewWebKit
::CanCut() const
615 return webkit_web_view_can_cut_clipboard(WEBKIT_WEB_VIEW(web_view
));
618 bool wxWebViewWebKit
::CanCopy() const
620 return webkit_web_view_can_copy_clipboard(WEBKIT_WEB_VIEW(web_view
));
623 bool wxWebViewWebKit
::CanPaste() const
625 return webkit_web_view_can_paste_clipboard(WEBKIT_WEB_VIEW(web_view
));
628 void wxWebViewWebKit
::Cut()
630 webkit_web_view_cut_clipboard(WEBKIT_WEB_VIEW(web_view
));
633 void wxWebViewWebKit
::Copy()
635 webkit_web_view_copy_clipboard(WEBKIT_WEB_VIEW(web_view
));
638 void wxWebViewWebKit
::Paste()
640 webkit_web_view_paste_clipboard(WEBKIT_WEB_VIEW(web_view
));
643 bool wxWebViewWebKit
::CanUndo() const
645 return webkit_web_view_can_undo(WEBKIT_WEB_VIEW(web_view
));
648 bool wxWebViewWebKit
::CanRedo() const
650 return webkit_web_view_can_redo(WEBKIT_WEB_VIEW(web_view
));
653 void wxWebViewWebKit
::Undo()
655 webkit_web_view_undo(WEBKIT_WEB_VIEW(web_view
));
658 void wxWebViewWebKit
::Redo()
660 webkit_web_view_redo(WEBKIT_WEB_VIEW(web_view
));
663 wxString wxWebViewWebKit
::GetCurrentURL() const
665 // FIXME: check which encoding the web kit control uses instead of
666 // assuming UTF8 (here and elsewhere too)
667 return wxString
::FromUTF8(webkit_web_view_get_uri(
668 WEBKIT_WEB_VIEW(web_view
)));
672 wxString wxWebViewWebKit
::GetCurrentTitle() const
674 return wxString
::FromUTF8(webkit_web_view_get_title(
675 WEBKIT_WEB_VIEW(web_view
)));
679 wxString wxWebViewWebKit
::GetPageSource() const
681 WebKitWebFrame
* frame
= webkit_web_view_get_main_frame(
682 WEBKIT_WEB_VIEW(web_view
));
683 WebKitWebDataSource
* src
= webkit_web_frame_get_data_source (frame
);
685 // TODO: check encoding with
687 // webkit_web_data_source_get_encoding(WebKitWebDataSource *data_source);
688 return wxString(webkit_web_data_source_get_data (src
)->str
, wxConvUTF8
);
692 wxWebViewZoom wxWebViewWebKit
::GetZoom() const
694 float zoom
= GetWebkitZoom();
696 // arbitrary way to map float zoom to our common zoom enum
699 return wxWEB_VIEW_ZOOM_TINY
;
701 else if (zoom
> 0.65 && zoom
<= 0.90)
703 return wxWEB_VIEW_ZOOM_SMALL
;
705 else if (zoom
> 0.90 && zoom
<= 1.15)
707 return wxWEB_VIEW_ZOOM_MEDIUM
;
709 else if (zoom
> 1.15 && zoom
<= 1.45)
711 return wxWEB_VIEW_ZOOM_LARGE
;
713 else if (zoom
> 1.45)
715 return wxWEB_VIEW_ZOOM_LARGEST
;
718 // to shut up compilers, this can never be reached logically
720 return wxWEB_VIEW_ZOOM_MEDIUM
;
724 void wxWebViewWebKit
::SetZoom(wxWebViewZoom zoom
)
726 // arbitrary way to map our common zoom enum to float zoom
729 case wxWEB_VIEW_ZOOM_TINY
:
733 case wxWEB_VIEW_ZOOM_SMALL
:
737 case wxWEB_VIEW_ZOOM_MEDIUM
:
741 case wxWEB_VIEW_ZOOM_LARGE
:
745 case wxWEB_VIEW_ZOOM_LARGEST
:
754 void wxWebViewWebKit
::SetZoomType(wxWebViewZoomType type
)
756 webkit_web_view_set_full_content_zoom(WEBKIT_WEB_VIEW(web_view
),
757 (type
== wxWEB_VIEW_ZOOM_TYPE_LAYOUT ?
761 wxWebViewZoomType wxWebViewWebKit
::GetZoomType() const
763 gboolean fczoom
= webkit_web_view_get_full_content_zoom(
764 WEBKIT_WEB_VIEW(web_view
));
766 if (fczoom
) return wxWEB_VIEW_ZOOM_TYPE_LAYOUT
;
767 else return wxWEB_VIEW_ZOOM_TYPE_TEXT
;
770 bool wxWebViewWebKit
::CanSetZoomType(wxWebViewZoomType
) const
772 // this port supports all zoom types
776 void wxWebViewWebKit
::SetPage(const wxString
& html
, const wxString
& baseUri
)
778 webkit_web_view_load_string (WEBKIT_WEB_VIEW(web_view
),
779 html
.mb_str(wxConvUTF8
),
782 baseUri
.mb_str(wxConvUTF8
));
785 void wxWebViewWebKit
::Print()
787 WebKitWebFrame
* frame
= webkit_web_view_get_main_frame(
788 WEBKIT_WEB_VIEW(web_view
));
789 webkit_web_frame_print (frame
);
791 // GtkPrintOperationResult webkit_web_frame_print_full
792 // (WebKitWebFrame *frame,
793 // GtkPrintOperation *operation,
794 // GtkPrintOperationAction action,
800 bool wxWebViewWebKit
::IsBusy() const
804 // This code looks nice but returns true after a page was cancelled
806 WebKitLoadStatus status = webkit_web_view_get_load_status
807 (WEBKIT_WEB_VIEW(web_view));
810 #if WEBKIT_CHECK_VERSION(1,1,16)
811 // WEBKIT_LOAD_FAILED is new in webkit 1.1.16
812 if (status == WEBKIT_LOAD_FAILED)
817 if (status == WEBKIT_LOAD_FINISHED)
826 void wxWebViewWebKit
::SetEditable(bool enable
)
828 webkit_web_view_set_editable(WEBKIT_WEB_VIEW(web_view
), enable
);
831 bool wxWebViewWebKit
::IsEditable() const
833 return webkit_web_view_get_editable(WEBKIT_WEB_VIEW(web_view
));
836 void wxWebViewWebKit
::DeleteSelection()
838 webkit_web_view_delete_selection(WEBKIT_WEB_VIEW(web_view
));
841 bool wxWebViewWebKit
::HasSelection() const
843 return webkit_web_view_has_selection(WEBKIT_WEB_VIEW(web_view
));
846 void wxWebViewWebKit
::SelectAll()
848 webkit_web_view_select_all(WEBKIT_WEB_VIEW(web_view
));
851 wxString wxWebViewWebKit
::GetSelectedText() const
853 WebKitDOMDocument
* doc
;
854 WebKitDOMDOMWindow
* win
;
855 WebKitDOMDOMSelection
* sel
;
856 WebKitDOMRange
* range
;
858 doc
= webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(web_view
));
859 win
= webkit_dom_document_get_default_view(WEBKIT_DOM_DOCUMENT(doc
));
860 sel
= webkit_dom_dom_window_get_selection(WEBKIT_DOM_DOM_WINDOW(win
));
861 range
= webkit_dom_dom_selection_get_range_at(WEBKIT_DOM_DOM_SELECTION(sel
),
863 return wxString(webkit_dom_range_get_text(WEBKIT_DOM_RANGE(range
)),
867 wxString wxWebViewWebKit
::GetSelectedSource() const
869 WebKitDOMDocument
* doc
;
870 WebKitDOMDOMWindow
* win
;
871 WebKitDOMDOMSelection
* sel
;
872 WebKitDOMRange
* range
;
873 WebKitDOMElement
* div
;
874 WebKitDOMDocumentFragment
* clone
;
875 WebKitDOMHTMLElement
* html
;
877 doc
= webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(web_view
));
878 win
= webkit_dom_document_get_default_view(WEBKIT_DOM_DOCUMENT(doc
));
879 sel
= webkit_dom_dom_window_get_selection(WEBKIT_DOM_DOM_WINDOW(win
));
880 range
= webkit_dom_dom_selection_get_range_at(WEBKIT_DOM_DOM_SELECTION(sel
),
882 div
= webkit_dom_document_create_element(WEBKIT_DOM_DOCUMENT(doc
), "div", NULL
);
884 clone
= webkit_dom_range_clone_contents(WEBKIT_DOM_RANGE(range
), NULL
);
885 webkit_dom_node_append_child(&div
->parent_instance
, &clone
->parent_instance
, NULL
);
886 html
= (WebKitDOMHTMLElement
*)div
;
888 return wxString(webkit_dom_html_element_get_inner_html(WEBKIT_DOM_HTML_ELEMENT(html
)),
892 void wxWebViewWebKit
::ClearSelection()
894 WebKitDOMDocument
* doc
;
895 WebKitDOMDOMWindow
* win
;
896 WebKitDOMDOMSelection
* sel
;
898 doc
= webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(web_view
));
899 win
= webkit_dom_document_get_default_view(WEBKIT_DOM_DOCUMENT(doc
));
900 sel
= webkit_dom_dom_window_get_selection(WEBKIT_DOM_DOM_WINDOW(win
));
901 webkit_dom_dom_selection_remove_all_ranges(WEBKIT_DOM_DOM_SELECTION(sel
));
905 wxString wxWebViewWebKit
::GetPageText() const
907 WebKitDOMDocument
* doc
;
908 WebKitDOMHTMLElement
* body
;
910 doc
= webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(web_view
));
911 body
= webkit_dom_document_get_body(WEBKIT_DOM_DOCUMENT(doc
));
912 return wxString(webkit_dom_html_element_get_inner_text(WEBKIT_DOM_HTML_ELEMENT(body
)),
916 void wxWebViewWebKit
::RunScript(const wxString
& javascript
)
918 webkit_web_view_execute_script(WEBKIT_WEB_VIEW(web_view
),
919 javascript
.mb_str(wxConvUTF8
));
922 void wxWebViewWebKit
::RegisterHandler(wxSharedPtr
<wxWebViewHandler
> handler
)
924 m_handlerList
.push_back(handler
);
929 wxWebViewWebKit
::GetClassDefaultAttributes(wxWindowVariant
WXUNUSED(variant
))
931 return GetDefaultAttributesFromGTKWidget(webkit_web_view_new
);
935 #endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT