diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-03-12 14:11:15 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-03-12 14:11:15 +0100 |
commit | dd91e772430dc294e3bf478c119ef8d43c0a3358 (patch) | |
tree | 6f33ce4d5872a5691e0291eb45bf6ab373a5f567 /Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp | |
parent | ad0d549d4cc13433f77c1ac8f0ab379c83d93f28 (diff) | |
download | qtwebkit-dd91e772430dc294e3bf478c119ef8d43c0a3358.tar.gz |
Imported WebKit commit 3db4eb1820ac8fb03065d7ea73a4d9db1e8fea1a (http://svn.webkit.org/repository/webkit/trunk@110422)
This includes build fixes for the latest qtbase/qtdeclarative as well as the final QML2 API.
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp | 256 |
1 files changed, 143 insertions, 113 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp index be590ff33..4f17d4669 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp @@ -30,6 +30,7 @@ #include "WebKitPolicyClient.h" #include "WebKitPrintOperationPrivate.h" #include "WebKitPrivate.h" +#include "WebKitScriptDialogPrivate.h" #include "WebKitSettingsPrivate.h" #include "WebKitUIClient.h" #include "WebKitWebContextPrivate.h" @@ -55,9 +56,7 @@ enum { READY_TO_SHOW, CLOSE, - SCRIPT_ALERT, - SCRIPT_CONFIRM, - SCRIPT_PROMPT, + SCRIPT_DIALOG, DECIDE_POLICY, @@ -78,13 +77,20 @@ enum { PROP_ZOOM_LEVEL }; +typedef enum { + NotReplacingContent, + WillReplaceContent, + ReplacingContent, + DidReplaceContent +} ReplaceContentStatus; + struct _WebKitWebViewPrivate { WebKitWebContext* context; CString title; CString customTextEncoding; double estimatedLoadProgress; CString activeURI; - bool replacingContent; + ReplaceContentStatus replaceContentStatus; GRefPtr<WebKitBackForwardList> backForwardList; GRefPtr<WebKitSettings> settings; @@ -92,6 +98,8 @@ struct _WebKitWebViewPrivate { GRefPtr<WebKitHitTestResult> mouseTargetHitTestResult; unsigned mouseTargetModifiers; + + GRefPtr<WebKitFindController> findController; }; static guint signals[LAST_SIGNAL] = { 0, }; @@ -128,39 +136,56 @@ static GtkWidget* webkitWebViewCreateJavaScriptDialog(WebKitWebView* webView, Gt return dialog; } -static gboolean webkitWebViewScriptAlert(WebKitWebView* webView, const char* message) +static gboolean webkitWebViewScriptDialog(WebKitWebView* webView, WebKitScriptDialog* scriptDialog) { - GtkWidget* dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE, message); - gtk_dialog_run(GTK_DIALOG(dialog)); + GtkWidget* dialog = 0; + + switch (scriptDialog->type) { + case WEBKIT_SCRIPT_DIALOG_ALERT: + dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE, scriptDialog->message.data()); + gtk_dialog_run(GTK_DIALOG(dialog)); + break; + case WEBKIT_SCRIPT_DIALOG_CONFIRM: + dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, scriptDialog->message.data()); + scriptDialog->confirmed = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK; + break; + case WEBKIT_SCRIPT_DIALOG_PROMPT: + dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, scriptDialog->message.data()); + GtkWidget* entry = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(entry), scriptDialog->defaultText.data()); + gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entry); + gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE); + gtk_widget_show(entry); + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) + scriptDialog->text = gtk_entry_get_text(GTK_ENTRY(entry)); + break; + } + gtk_widget_destroy(dialog); + return TRUE; } -static gboolean webkitWebViewScriptConfirm(WebKitWebView* webView, const char* message, gboolean* confirmed) +static gboolean webkitWebViewDecidePolicy(WebKitWebView*, WebKitPolicyDecision* decision, WebKitPolicyDecisionType) { - GtkWidget* dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, message); - *confirmed = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK; - gtk_widget_destroy(dialog); + webkit_policy_decision_use(decision); return TRUE; } -static gboolean webkitWebViewScriptPrompt(WebKitWebView* webView, const char* message, const char* defaultText, char** text) +static void zoomTextOnlyChanged(WebKitSettings* settings, GParamSpec*, WebKitWebView* webView) { - GtkWidget* dialog = webkitWebViewCreateJavaScriptDialog(webView, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, message); - GtkWidget* entry = gtk_entry_new(); - gtk_entry_set_text(GTK_ENTRY(entry), defaultText); - gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entry); - gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE); - gtk_widget_show(entry); - - *text = (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) ? g_strdup(gtk_entry_get_text(GTK_ENTRY(entry))) : 0; - return TRUE; + WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView))); + gboolean zoomTextOnly = webkit_settings_get_zoom_text_only(settings); + gdouble pageZoomLevel = zoomTextOnly ? 1 : WKPageGetTextZoomFactor(wkPage); + gdouble textZoomLevel = zoomTextOnly ? WKPageGetPageZoomFactor(wkPage) : 1; + WKPageSetPageAndTextZoomFactors(wkPage, pageZoomLevel, textZoomLevel); } -static gboolean webkitWebViewDecidePolicy(WebKitWebView*, WebKitPolicyDecision* decision, WebKitPolicyDecisionType) +static void webkitWebViewSetSettings(WebKitWebView* webView, WebKitSettings* settings, WKPageRef wkPage) { - webkit_policy_decision_use(decision); - return TRUE; + webView->priv->settings = settings; + webkitSettingsAttachSettingsToPage(webView->priv->settings.get(), wkPage); + g_signal_connect(settings, "notify::zoom-text-only", G_CALLBACK(zoomTextOnlyChanged), webView); } static void webkitWebViewConstructed(GObject* object) @@ -180,8 +205,9 @@ static void webkitWebViewConstructed(GObject* object) WebPageProxy* page = webkitWebViewBaseGetPage(webViewBase); priv->backForwardList = adoptGRef(webkitBackForwardListCreate(WKPageGetBackForwardList(toAPI(page)))); - priv->settings = adoptGRef(webkit_settings_new()); - webkitSettingsAttachSettingsToPage(priv->settings.get(), toAPI(page)); + + GRefPtr<WebKitSettings> settings = adoptGRef(webkit_settings_new()); + webkitWebViewSetSettings(webView, settings.get(), toAPI(page)); } static void webkitWebViewSetProperty(GObject* object, guint propId, const GValue* value, GParamSpec* paramSpec) @@ -262,9 +288,7 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass) webViewClass->load_failed = webkitWebViewLoadFail; webViewClass->create = webkitWebViewCreate; - webViewClass->script_alert = webkitWebViewScriptAlert; - webViewClass->script_confirm = webkitWebViewScriptConfirm; - webViewClass->script_prompt = webkitWebViewScriptPrompt; + webViewClass->script_dialog = webkitWebViewScriptDialog; webViewClass->decide_policy = webkitWebViewDecidePolicy; g_type_class_add_private(webViewClass, sizeof(WebKitWebViewPrivate)); @@ -494,75 +518,40 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass) G_TYPE_NONE, 0); /** - * WebKitWebView::script-alert: - * @web_view: the #WebKitWebView on which the signal is emitted - * @message: the message text - * - * Emitted when JavaScript code calls <function>window.alert</function>. If the - * signal is not handled a message dialog with a single Close button will be - * shown with the message text. - * - * Returns: %TRUE to stop other handlers from being invoked for the event. - * %FALSE to propagate the event further. - */ - signals[SCRIPT_ALERT] = - g_signal_new("script-alert", - G_TYPE_FROM_CLASS(webViewClass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(WebKitWebViewClass, script_alert), - g_signal_accumulator_true_handled, 0, - webkit_marshal_BOOLEAN__STRING, - G_TYPE_BOOLEAN, 1, - G_TYPE_STRING); - - /** - * WebKitWebView::script-confirm: - * @web_view: the #WebKitWebView on which the signal is emitted - * @message: the message text - * @confirmed: (out): return location for confirm dialog response - * - * Emitted when JavaScript code calls <function>confirm</function>. If the - * signal is not handled a message dialog with OK and Cancel buttons will be - * shown with the message text. If OK button is clicked @confirmed will be - * set to %TRUE, otherwise it will be %FALSE. - * - * Returns: %TRUE to stop other handlers from being invoked for the event. - * %FALSE to propagate the event further. - */ - signals[SCRIPT_CONFIRM] = - g_signal_new("script-confirm", - G_TYPE_FROM_CLASS(webViewClass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(WebKitWebViewClass, script_confirm), - g_signal_accumulator_true_handled, 0, - webkit_marshal_BOOLEAN__STRING_POINTER, - G_TYPE_BOOLEAN, 2, - G_TYPE_STRING, G_TYPE_POINTER); - - /** - * WebKitWebView::script-prompt: + * WebKitWebView::script-dialog: * @web_view: the #WebKitWebView on which the signal is emitted - * @message: the message text - * @default (allow-none): the default text - * @text: (out): return location for prompt dialog text response + * @dialog: the #WebKitScriptDialog to show * - * Emitted when JavaScript code calls <function>prompt</function>. If the - * signal is not handled a message dialog with OK and Cancel buttons and - * a text entry will be shown with the message text. If OK button is clicked - * @text will contain the text entered by the user, otherwise it will be %NULL. + * Emitted when JavaScript code calls <function>window.alert</function>, + * <function>window.confirm</function> or <function>window.prompt</function>. + * The @dialog parameter should be used to build the dialog. + * If the signal is not handled a different dialog will be built and shown depending + * on the dialog type: + * <itemizedlist> + * <listitem><para> + * %WEBKIT_SCRIPT_DIALOG_ALERT: message dialog with a single Close button. + * </para></listitem> + * <listitem><para> + * %WEBKIT_SCRIPT_DIALOG_CONFIRM: message dialog with OK and Cancel buttons. + * </para></listitem> + * <listitem><para> + * %WEBKIT_SCRIPT_DIALOG_PROMPT: message dialog with OK and Cancel buttons and + * a text entry with the default text. + * </para></listitem> + * </itemizedlist> * * Returns: %TRUE to stop other handlers from being invoked for the event. * %FALSE to propagate the event further. */ - signals[SCRIPT_PROMPT] = - g_signal_new("script-prompt", - G_TYPE_FROM_CLASS(webViewClass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(WebKitWebViewClass, script_prompt), - g_signal_accumulator_true_handled, 0, - webkit_marshal_BOOLEAN__STRING_STRING_POINTER, - G_TYPE_BOOLEAN, 3, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); + signals[SCRIPT_DIALOG] = + g_signal_new("script-dialog", + G_TYPE_FROM_CLASS(webViewClass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(WebKitWebViewClass, script_dialog), + g_signal_accumulator_true_handled, 0, + webkit_marshal_BOOLEAN__BOXED, + G_TYPE_BOOLEAN, 1, + WEBKIT_TYPE_SCRIPT_DIALOG | G_SIGNAL_TYPE_STATIC_SCOPE); /** * WebKitWebView::decide-policy: @@ -679,14 +668,30 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass) WEBKIT_TYPE_PRINT_OPERATION); } -void webkitWebViewLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent) +static bool updateReplaceContentStatus(WebKitWebView* webView, WebKitLoadEvent loadEvent) { - if (webView->priv->replacingContent) { + if (webView->priv->replaceContentStatus == ReplacingContent) { if (loadEvent == WEBKIT_LOAD_FINISHED) - webView->priv->replacingContent = false; - return; + webView->priv->replaceContentStatus = DidReplaceContent; + return true; + } + + if (loadEvent == WEBKIT_LOAD_STARTED) { + if (webView->priv->replaceContentStatus == WillReplaceContent) { + webView->priv->replaceContentStatus = ReplacingContent; + return true; + } + webView->priv->replaceContentStatus = NotReplacingContent; } + return false; +} + +void webkitWebViewLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent) +{ + if (updateReplaceContentStatus(webView, loadEvent)) + return; + if (loadEvent != WEBKIT_LOAD_FINISHED) webkitWebViewUpdateURI(webView); g_signal_emit(webView, signals[LOAD_CHANGED], 0, loadEvent); @@ -694,7 +699,7 @@ void webkitWebViewLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent) void webkitWebViewLoadFailed(WebKitWebView* webView, WebKitLoadEvent loadEvent, const char* failingURI, GError *error) { - if (webView->priv->replacingContent) + if (webView->priv->replaceContentStatus == ReplacingContent) return; gboolean returnValue; @@ -714,7 +719,7 @@ void webkitWebViewSetTitle(WebKitWebView* webView, const CString& title) void webkitWebViewSetEstimatedLoadProgress(WebKitWebView* webView, double estimatedLoadProgress) { - if (webView->priv->replacingContent) + if (webView->priv->replaceContentStatus != NotReplacingContent) return; if (webView->priv->estimatedLoadProgress == estimatedLoadProgress) @@ -763,23 +768,25 @@ void webkitWebViewClosePage(WebKitWebView* webView) void webkitWebViewRunJavaScriptAlert(WebKitWebView* webView, const CString& message) { + WebKitScriptDialog dialog(WEBKIT_SCRIPT_DIALOG_ALERT, message); gboolean returnValue; - g_signal_emit(webView, signals[SCRIPT_ALERT], 0, message.data(), &returnValue); + g_signal_emit(webView, signals[SCRIPT_DIALOG], 0, &dialog, &returnValue); } bool webkitWebViewRunJavaScriptConfirm(WebKitWebView* webView, const CString& message) { - gboolean returnValue, confirmed; - g_signal_emit(webView, signals[SCRIPT_CONFIRM], 0, message.data(), &confirmed, &returnValue); - return confirmed; + WebKitScriptDialog dialog(WEBKIT_SCRIPT_DIALOG_CONFIRM, message); + gboolean returnValue; + g_signal_emit(webView, signals[SCRIPT_DIALOG], 0, &dialog, &returnValue); + return dialog.confirmed; } WKStringRef webkitWebViewRunJavaScriptPrompt(WebKitWebView* webView, const CString& message, const CString& defaultText) { + WebKitScriptDialog dialog(WEBKIT_SCRIPT_DIALOG_PROMPT, message, defaultText); gboolean returnValue; - GOwnPtr<char> text; - g_signal_emit(webView, signals[SCRIPT_PROMPT], 0, message.data(), defaultText.data(), &text.outPtr(), &returnValue); - return text ? WKStringCreateWithUTF8CString(text.get()) : 0; + g_signal_emit(webView, signals[SCRIPT_DIALOG], 0, &dialog, &returnValue); + return dialog.text.isNull() ? 0 : WKStringCreateWithUTF8CString(dialog.text.data()); } void webkitWebViewMakePolicyDecision(WebKitWebView* webView, WebKitPolicyDecisionType type, WebKitPolicyDecision* decision) @@ -965,7 +972,7 @@ void webkit_web_view_replace_content(WebKitWebView* webView, const gchar* conten g_return_if_fail(content); g_return_if_fail(contentURI); - webView->priv->replacingContent = true; + webView->priv->replaceContentStatus = WillReplaceContent; WKRetainPtr<WKStringRef> htmlString(AdoptWK, WKStringCreateWithUTF8CString(content)); WKRetainPtr<WKURLRef> contentURL(AdoptWK, WKURLCreateWithUTF8CString(contentURI)); @@ -1279,8 +1286,8 @@ void webkit_web_view_set_settings(WebKitWebView* webView, WebKitSettings* settin if (webView->priv->settings == settings) return; - webView->priv->settings = settings; - webkitSettingsAttachSettingsToPage(settings, toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView)))); + g_signal_handlers_disconnect_by_func(webView->priv->settings.get(), reinterpret_cast<gpointer>(zoomTextOnlyChanged), webView); + webkitWebViewSetSettings(webView, settings, toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView)))); } /** @@ -1338,11 +1345,14 @@ void webkit_web_view_set_zoom_level(WebKitWebView* webView, gdouble zoomLevel) { g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView)); - WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView))); - if (WKPageGetPageZoomFactor(wkPage) == zoomLevel) + if (webkit_web_view_get_zoom_level(webView) == zoomLevel) return; - WKPageSetPageZoomFactor(wkPage, zoomLevel); + WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView))); + if (webkit_settings_get_zoom_text_only(webView->priv->settings.get())) + WKPageSetTextZoomFactor(wkPage, zoomLevel); + else + WKPageSetPageZoomFactor(wkPage, zoomLevel); g_object_notify(G_OBJECT(webView), "zoom-level"); } @@ -1360,10 +1370,10 @@ gdouble webkit_web_view_get_zoom_level(WebKitWebView* webView) g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 1); WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView))); - return WKPageGetPageZoomFactor(wkPage); + gboolean zoomTextOnly = webkit_settings_get_zoom_text_only(webView->priv->settings.get()); + return zoomTextOnly ? WKPageGetTextZoomFactor(wkPage) : WKPageGetPageZoomFactor(wkPage); } - static void didValidateCommand(WKStringRef command, bool isEnabled, int32_t state, WKErrorRef, void* context) { GRefPtr<GSimpleAsyncResult> result = adoptGRef(G_SIMPLE_ASYNC_RESULT(context)); @@ -1436,3 +1446,23 @@ void webkit_web_view_execute_editing_command(WebKitWebView* webView, const char* WKRetainPtr<WKStringRef> wkCommand(AdoptWK, WKStringCreateWithUTF8CString(command)); WKPageExecuteCommand(toAPI(page), wkCommand.get()); } + +/** + * webkit_web_view_get_find_controller: + * @web_view: the #WebKitWebView + * + * Gets the #WebKitFindController that will allow the caller to query + * the #WebKitWebView for the text to look for. + * + * Returns: (transfer none): the #WebKitFindController associated to + * this particular #WebKitWebView. + */ +WebKitFindController* webkit_web_view_get_find_controller(WebKitWebView* webView) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0); + + if (!webView->priv->findController) + webView->priv->findController = adoptGRef(WEBKIT_FIND_CONTROLLER(g_object_new(WEBKIT_TYPE_FIND_CONTROLLER, "web-view", webView, NULL))); + + return webView->priv->findController.get(); +} |