diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-06-01 10:36:58 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-06-01 10:36:58 +0200 |
commit | b1e9e47fa11f608ae16bc07f97a2acf95bf80272 (patch) | |
tree | c88c45e80c9c44506e7cdf9a3bb39ebf82a8cd5b /Source/WebKit2/UIProcess/API | |
parent | be01689f43cf6882cf670d33df49ead1f570c53a (diff) | |
download | qtwebkit-b1e9e47fa11f608ae16bc07f97a2acf95bf80272.tar.gz |
Imported WebKit commit 499c84c99aa98e9870fa7eaa57db476c6d160d46 (http://svn.webkit.org/repository/webkit/trunk@119200)
Weekly update :). Particularly relevant changes for Qt are the use of the WebCore image decoders and direct usage
of libpng/libjpeg if available in the system.
Diffstat (limited to 'Source/WebKit2/UIProcess/API')
38 files changed, 681 insertions, 190 deletions
diff --git a/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp b/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp index c7e5f029c..567548f5d 100644 --- a/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp +++ b/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp @@ -32,7 +32,7 @@ #include "WebContext.h" #include "WebContextMenuProxy.h" #include "WebPageProxy.h" -#include "ewk_private.h" +#include "ewk_view_private.h" using namespace WebCore; @@ -186,6 +186,13 @@ void PageClientImpl::doneWithKeyEvent(const NativeWebKeyboardEvent&, bool) notImplemented(); } +#if ENABLE(TOUCH_EVENTS) +void PageClientImpl::doneWithTouchEvent(const NativeWebTouchEvent&, bool wasEventHandled) +{ + notImplemented(); +} +#endif + PassRefPtr<WebPopupMenuProxy> PageClientImpl::createPopupMenuProxy(WebPageProxy*) { notImplemented(); diff --git a/Source/WebKit2/UIProcess/API/efl/PageClientImpl.h b/Source/WebKit2/UIProcess/API/efl/PageClientImpl.h index 0858fc33d..a4dcd93e3 100644 --- a/Source/WebKit2/UIProcess/API/efl/PageClientImpl.h +++ b/Source/WebKit2/UIProcess/API/efl/PageClientImpl.h @@ -77,6 +77,9 @@ private: virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&); virtual void doneWithKeyEvent(const NativeWebKeyboardEvent&, bool); +#if ENABLE(TOUCH_EVENTS) + virtual void doneWithTouchEvent(const NativeWebTouchEvent&, bool wasEventHandled); +#endif virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*); virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*); diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_private.h b/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h index d331d996f..e776725cc 100644 --- a/Source/WebKit2/UIProcess/API/efl/ewk_private.h +++ b/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h @@ -18,8 +18,8 @@ * */ -#ifndef ewk_private_h -#define ewk_private_h +#ifndef ewk_view_private_h +#define ewk_view_private_h #include <Evas.h> @@ -31,4 +31,4 @@ class IntSize; void ewk_view_display(Evas_Object* ewkView, const WebCore::IntRect& rect); void ewk_view_image_data_set(Evas_Object* ewkView, void* imageData, const WebCore::IntSize& size); -#endif // ewk_private_h +#endif // ewk_view_private_h diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitDownload.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitDownload.cpp index 018f08d3d..61d316f6c 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitDownload.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitDownload.cpp @@ -20,8 +20,10 @@ #include "config.h" #include "WebKitDownload.h" +#include "DownloadProxy.h" #include "WebKitDownloadPrivate.h" #include "WebKitMarshal.h" +#include "WebKitURIRequestPrivate.h" #include "WebKitURIResponsePrivate.h" #include <WebCore/ErrorsGtk.h> #include <WebCore/ResourceResponse.h> @@ -53,6 +55,7 @@ enum { struct _WebKitDownloadPrivate { WKRetainPtr<WKDownloadRef> wkDownload; + GRefPtr<WebKitURIRequest> request; GRefPtr<WebKitURIResponse> response; CString destinationURI; guint64 currentSize; @@ -360,6 +363,25 @@ void webkitDownloadDestinationCreated(WebKitDownload* download, const CString& d } /** + * webkit_download_get_request: + * @download: a #WebKitDownload + * + * Retrieves the #WebKitURIRequest object that backs the download + * process. + * + * Returns: (transfer none): the #WebKitURIRequest of @download + */ +WebKitURIRequest* webkit_download_get_request(WebKitDownload* download) +{ + g_return_val_if_fail(WEBKIT_IS_DOWNLOAD(download), 0); + + WebKitDownloadPrivate* priv = download->priv; + if (!priv->request) + priv->request = adoptGRef(webkitURIRequestCreateForResourceRequest(toImpl(priv->wkDownload.get())->request())); + return download->priv->request.get(); +} + +/** * webkit_download_get_destination: * @download: a #WebKitDownload * diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitDownload.h b/Source/WebKit2/UIProcess/API/gtk/WebKitDownload.h index b6c51fea5..b4a2d3bab 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitDownload.h +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitDownload.h @@ -26,6 +26,7 @@ #include <glib-object.h> #include <webkit2/WebKitDefines.h> +#include <webkit2/WebKitURIRequest.h> #include <webkit2/WebKitURIResponse.h> G_BEGIN_DECLS @@ -57,6 +58,9 @@ struct _WebKitDownloadClass { WEBKIT_API GType webkit_download_get_type (void); +WEBKIT_API WebKitURIRequest * +webkit_download_get_request (WebKitDownload *download); + WEBKIT_API const gchar * webkit_download_get_destination (WebKitDownload *download); diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp index 9476255c8..158c7fc42 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp @@ -147,7 +147,8 @@ void attachLoaderClientToView(WebKitWebView* webView) 0, // didDetectXSSForFrame 0, // didFirstVisuallyNonEmptyLayoutForFrame 0, // willGoToBackForwardListItem - 0 // interactionOccurredWhileProcessUnresponsive + 0, // interactionOccurredWhileProcessUnresponsive + 0, // pluginDidFail }; WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView))); WKPageSetPageLoaderClient(wkPage, &wkLoaderClient); diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp index 9f78c9cbf..2548d7b72 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp @@ -191,6 +191,7 @@ void attachUIClientToView(WebKitWebView* webView) createNewPage, mouseDidMoveOverElement, 0, // decidePolicyForNotificationPermissionRequest + 0, // unavailablePluginButtonClicked }; WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView))); WKPageSetPageUIClient(wkPage, &wkUIClient); diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.cpp index 174bf12f8..93f83c2de 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.cpp @@ -30,7 +30,8 @@ enum { PROP_URI, PROP_STATUS_CODE, - PROP_CONTENT_LENGTH + PROP_CONTENT_LENGTH, + PROP_MIME_TYPE }; using namespace WebCore; @@ -40,6 +41,7 @@ G_DEFINE_TYPE(WebKitURIResponse, webkit_uri_response, G_TYPE_OBJECT) struct _WebKitURIResponsePrivate { WebCore::ResourceResponse resourceResponse; CString uri; + CString mimeType; }; static void webkitURIResponseFinalize(GObject* object) @@ -62,6 +64,9 @@ static void webkitURIResponseGetProperty(GObject* object, guint propId, GValue* case PROP_CONTENT_LENGTH: g_value_set_uint64(value, webkit_uri_response_get_content_length(response)); break; + case PROP_MIME_TYPE: + g_value_set_string(value, webkit_uri_response_get_mime_type(response)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec); } @@ -112,6 +117,19 @@ static void webkit_uri_response_class_init(WebKitURIResponseClass* responseClass 0, G_MAXUINT64, 0, WEBKIT_PARAM_READABLE)); + /** + * WebKitURIResponse:mime-type: + * + * The MIME type of the response. + */ + g_object_class_install_property(objectClass, + PROP_MIME_TYPE, + g_param_spec_string("mime-type", + _("MIME Type"), + _("The MIME type of the response"), + 0, + WEBKIT_PARAM_READABLE)); + g_type_class_add_private(responseClass, sizeof(WebKitURIResponsePrivate)); } @@ -170,6 +188,20 @@ guint64 webkit_uri_response_get_content_length(WebKitURIResponse* response) return response->priv->resourceResponse.expectedContentLength(); } +/** + * webkit_uri_response_get_mime_type: + * @response: a #WebKitURIResponse + * + * Returns: the MIME type of the #WebKitURIResponse + */ +const gchar* webkit_uri_response_get_mime_type(WebKitURIResponse* response) +{ + g_return_val_if_fail(WEBKIT_IS_URI_RESPONSE(response), 0); + + response->priv->mimeType = response->priv->resourceResponse.mimeType().utf8(); + return response->priv->mimeType.data(); +} + WebKitURIResponse* webkitURIResponseCreateForResourceResponse(const WebCore::ResourceResponse& resourceResponse) { WebKitURIResponse* uriResponse = WEBKIT_URI_RESPONSE(g_object_new(WEBKIT_TYPE_URI_RESPONSE, NULL)); diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.h b/Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.h index cfbe4d819..0cc6c8959 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.h +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.h @@ -64,6 +64,9 @@ webkit_uri_response_get_status_code (WebKitURIResponse *response); WEBKIT_API guint64 webkit_uri_response_get_content_length (WebKitURIResponse *response); +WEBKIT_API const gchar * +webkit_uri_response_get_mime_type (WebKitURIResponse *response); + G_END_DECLS #endif diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp index 77ef6c1de..938f95fd1 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp @@ -33,9 +33,11 @@ #include "WebKitPrintOperationPrivate.h" #include "WebKitPrivate.h" #include "WebKitResourceLoadClient.h" +#include "WebKitResponsePolicyDecision.h" #include "WebKitScriptDialogPrivate.h" #include "WebKitSettingsPrivate.h" #include "WebKitUIClient.h" +#include "WebKitURIResponsePrivate.h" #include "WebKitWebContextPrivate.h" #include "WebKitWebInspectorPrivate.h" #include "WebKitWebResourcePrivate.h" @@ -190,9 +192,25 @@ static gboolean webkitWebViewScriptDialog(WebKitWebView* webView, WebKitScriptDi return TRUE; } -static gboolean webkitWebViewDecidePolicy(WebKitWebView*, WebKitPolicyDecision* decision, WebKitPolicyDecisionType) +static gboolean webkitWebViewDecidePolicy(WebKitWebView* webView, WebKitPolicyDecision* decision, WebKitPolicyDecisionType decisionType) { - webkit_policy_decision_use(decision); + if (decisionType != WEBKIT_POLICY_DECISION_TYPE_RESPONSE) { + webkit_policy_decision_use(decision); + return TRUE; + } + + WebKitURIResponse* response = webkit_response_policy_decision_get_response(WEBKIT_RESPONSE_POLICY_DECISION(decision)); + const ResourceResponse resourceResponse = webkitURIResponseGetResourceResponse(response); + if (resourceResponse.isAttachment()) { + webkit_policy_decision_download(decision); + return TRUE; + } + + if (webkit_web_view_can_show_mime_type(webView, webkit_uri_response_get_mime_type(response))) + webkit_policy_decision_use(decision); + else + webkit_policy_decision_ignore(decision); + return TRUE; } @@ -509,6 +527,9 @@ static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass) * * By default, if the signal is not handled, a stock error page will be displayed. * You need to handle the signal if you want to provide your own error page. + * + * Returns: %TRUE to stop other handlers from being invoked for the event. + * %FALSE to propagate the event further. */ signals[LOAD_FAILED] = g_signal_new("load-failed", @@ -1754,7 +1775,7 @@ void webkit_web_view_can_execute_editing_command(WebKitWebView* webView, const c * * Finish an asynchronous operation started with webkit_web_view_can_execute_editing_command(). * - * Returns: %TRUE if a selection can be cut or %FALSE otherwise + * Returns: %TRUE if the editing command can be executed or %FALSE otherwise */ gboolean webkit_web_view_can_execute_editing_command_finish(WebKitWebView* webView, GAsyncResult* result, GError** error) { @@ -1918,13 +1939,13 @@ void webkit_web_view_run_javascript(WebKitWebView* webView, const gchar* script, * context = webkit_javascript_result_get_global_context (js_result); * value = webkit_javascript_result_get_value (js_result); * if (JSValueIsString (context, value)) { - * JSStringRef *js_str_value; - * gchar *str_value; - * gsize str_length; + * JSStringRef js_str_value; + * gchar *str_value; + * gsize str_length; * - * js_str_value = JSValueToStringCopy (context, value, NULL)); + * js_str_value = JSValueToStringCopy (context, value, NULL); * str_length = JSStringGetMaximumUTF8CStringSize (js_str_value); - * str_value = (gchar *)g_malloc (str_length)); + * str_value = (gchar *)g_malloc (str_length); * JSStringGetUTF8CString (js_str_value, str_value, str_length); * JSStringRelease (js_str_value); * g_print ("Script result: %s\n", str_value); @@ -1942,7 +1963,7 @@ void webkit_web_view_run_javascript(WebKitWebView* webView, const gchar* script, * gchar *script; * * script = g_strdup_printf ("window.document.getElementById('%s').href;", link_id); - * webkit_web_view_run_javascript (web_view, script, web_view_javascript_finished, NULL); + * webkit_web_view_run_javascript (web_view, script, NULL, web_view_javascript_finished, NULL); * g_free (script); * } * </programlisting></informalexample> @@ -2023,3 +2044,21 @@ WebKitWebInspector* webkit_web_view_get_inspector(WebKitWebView* webView) return webView->priv->inspector.get(); } + +/** + * webkit_web_view_can_show_mime_type: + * @web_view: a #WebKitWebView + * @mime_type: a MIME type + * + * Whether or not a MIME type can be displayed in @web_view. + * + * Returns: %TRUE if the MIME type @mime_type can be displayed or %FALSE otherwise + */ +gboolean webkit_web_view_can_show_mime_type(WebKitWebView* webView, const char* mimeType) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE); + g_return_val_if_fail(mimeType, FALSE); + + WebPageProxy* page = webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView)); + return page->canShowMIMEType(String::fromUTF8(mimeType)); +} diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h index 7f9fb9e36..716fbbd08 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h @@ -306,6 +306,10 @@ webkit_web_view_get_subresources (WebKitWebView *w WEBKIT_API WebKitWebInspector * webkit_web_view_get_inspector (WebKitWebView *web_view); +WEBKIT_API gboolean +webkit_web_view_can_show_mime_type (WebKitWebView *web_view, + const gchar *mime_type); + G_END_DECLS #endif diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp index 4faa75fb0..f8308aa14 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp @@ -675,8 +675,8 @@ void webkitWebViewBaseStartDrag(WebKitWebViewBase* webViewBase, const DragData& { WebKitWebViewBasePrivate* priv = webViewBase->priv; - RefPtr<DataObjectGtk> dataObject(dragData.platformData()); - GRefPtr<GtkTargetList> targetList(PasteboardHelper::defaultPasteboardHelper()->targetListForDataObject(dataObject.get())); + RefPtr<DataObjectGtk> dataObject = adoptRef(dragData.platformData()); + GRefPtr<GtkTargetList> targetList = adoptGRef(PasteboardHelper::defaultPasteboardHelper()->targetListForDataObject(dataObject.get())); GOwnPtr<GdkEvent> currentEvent(gtk_get_current_event()); GdkDragContext* context = gtk_drag_begin(GTK_WIDGET(webViewBase), targetList.get(), diff --git a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt b/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt index 4251cc4a6..6dde0866d 100644 --- a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt +++ b/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt @@ -95,6 +95,7 @@ webkit_web_view_get_inspector webkit_web_view_get_javascript_global_context webkit_web_view_run_javascript webkit_web_view_run_javascript_finish +webkit_web_view_can_show_mime_type <SUBSECTION WebKitJavascriptResult> WebKitJavascriptResult @@ -302,6 +303,7 @@ WebKitURIResponse webkit_uri_response_get_uri webkit_uri_response_get_status_code webkit_uri_response_get_content_length +webkit_uri_response_get_mime_type <SUBSECTION Standard> WebKitURIResponseClass @@ -346,6 +348,7 @@ webkit_window_properties_get_type <SECTION> <FILE>WebKitDownload</FILE> WebKitDownload +webkit_download_get_request webkit_download_get_destination webkit_download_set_destination webkit_download_get_response diff --git a/Source/WebKit2/UIProcess/API/gtk/tests/TestDownloads.cpp b/Source/WebKit2/UIProcess/API/gtk/tests/TestDownloads.cpp index a119e4477..acec9ece1 100644 --- a/Source/WebKit2/UIProcess/API/gtk/tests/TestDownloads.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/tests/TestDownloads.cpp @@ -88,6 +88,7 @@ public: static void downloadStartedCallback(WebKitWebContext* context, WebKitDownload* download, DownloadTest* test) { + g_assert(webkit_download_get_request(download)); test->started(download); g_signal_connect(download, "notify::response", G_CALLBACK(receivedResponseCallback), test); g_signal_connect(download, "created-destination", G_CALLBACK(createdDestinationCallback), test); @@ -191,6 +192,10 @@ static void testDownloadLocalFile(DownloadTest* test, gconstpointer) g_assert_cmpint(events[3], ==, DownloadTest::ReceivedData); g_assert_cmpint(events[4], ==, DownloadTest::Finished); + WebKitURIRequest* request = webkit_download_get_request(download.get()); + g_assert(request); + g_assert_cmpstr(webkit_uri_request_get_uri(request), ==, sourceURI.get()); + g_assert_cmpint(test->m_downloadSize, ==, g_file_info_get_size(sourceInfo.get())); g_assert(webkit_download_get_destination(download.get())); g_assert_cmpfloat(webkit_download_get_estimated_progress(download.get()), ==, 1); @@ -328,6 +333,11 @@ static void testDownloadRemoteFile(DownloadTest* test, gconstpointer) g_assert_cmpint(events[4], ==, DownloadTest::Finished); events.clear(); + WebKitURIRequest* request = webkit_download_get_request(download.get()); + g_assert(request); + CString requestURI = kServer->getURIForPath("/test.pdf"); + g_assert_cmpstr(webkit_uri_request_get_uri(request), ==, requestURI.data()); + g_assert(webkit_download_get_destination(download.get())); g_assert_cmpfloat(webkit_download_get_estimated_progress(download.get()), ==, 1); test->checkDestinationAndDeleteFile(download.get(), kServerSuggestedFilename); diff --git a/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp b/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp index 39841756d..7de95e0f0 100644 --- a/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp @@ -300,13 +300,11 @@ public: g_main_loop_run(m_mainLoop); } - int waitUntilResourceLoadFinsihedAndReturnHTTPStatusResponse() + WebKitURIResponse* waitUntilResourceLoadFinsihedAndReturnURIResponse() { waitUntilResourceLoadFinsihed(); g_assert(m_resource); - WebKitURIResponse* response = webkit_web_resource_get_response(m_resource.get()); - g_assert(response); - return webkit_uri_response_get_status_code(response); + return webkit_web_resource_get_response(m_resource.get()); } GRefPtr<WebKitWebResource> m_resource; @@ -355,33 +353,48 @@ static void testWebResourceResponse(SingleResourceLoadTest* test, gconstpointer) { // No cached resource: First load. test->loadURI(kServer->getURIForPath("/javascript.html").data()); - gint statusCode = test->waitUntilResourceLoadFinsihedAndReturnHTTPStatusResponse(); - g_assert_cmpint(statusCode, ==, SOUP_STATUS_OK); + WebKitURIResponse* response = test->waitUntilResourceLoadFinsihedAndReturnURIResponse(); + g_assert_cmpint(webkit_uri_response_get_status_code(response), ==, SOUP_STATUS_OK); // No cached resource: Second load. test->loadURI(kServer->getURIForPath("/javascript.html").data()); - statusCode = test->waitUntilResourceLoadFinsihedAndReturnHTTPStatusResponse(); - g_assert_cmpint(statusCode, ==, SOUP_STATUS_OK); + response = test->waitUntilResourceLoadFinsihedAndReturnURIResponse(); + g_assert_cmpint(webkit_uri_response_get_status_code(response), ==, SOUP_STATUS_OK); // No cached resource: Reload. webkit_web_view_reload(test->m_webView); - statusCode = test->waitUntilResourceLoadFinsihedAndReturnHTTPStatusResponse(); - g_assert_cmpint(statusCode, ==, SOUP_STATUS_OK); + response = test->waitUntilResourceLoadFinsihedAndReturnURIResponse(); + g_assert_cmpint(webkit_uri_response_get_status_code(response), ==, SOUP_STATUS_OK); // Cached resource: First load. test->loadURI(kServer->getURIForPath("/image.html").data()); - statusCode = test->waitUntilResourceLoadFinsihedAndReturnHTTPStatusResponse(); - g_assert_cmpint(statusCode, ==, SOUP_STATUS_OK); + response = test->waitUntilResourceLoadFinsihedAndReturnURIResponse(); + g_assert_cmpint(webkit_uri_response_get_status_code(response), ==, SOUP_STATUS_OK); // Cached resource: Second load. test->loadURI(kServer->getURIForPath("/image.html").data()); - statusCode = test->waitUntilResourceLoadFinsihedAndReturnHTTPStatusResponse(); - g_assert_cmpint(statusCode, ==, SOUP_STATUS_OK); + response = test->waitUntilResourceLoadFinsihedAndReturnURIResponse(); + g_assert_cmpint(webkit_uri_response_get_status_code(response), ==, SOUP_STATUS_OK); // Cached resource: Reload. webkit_web_view_reload(test->m_webView); - statusCode = test->waitUntilResourceLoadFinsihedAndReturnHTTPStatusResponse(); - g_assert_cmpint(statusCode, ==, SOUP_STATUS_NOT_MODIFIED); + response = test->waitUntilResourceLoadFinsihedAndReturnURIResponse(); + g_assert_cmpint(webkit_uri_response_get_status_code(response), ==, SOUP_STATUS_NOT_MODIFIED); +} + +static void testWebResourceMimeType(SingleResourceLoadTest* test, gconstpointer) +{ + test->loadURI(kServer->getURIForPath("/javascript.html").data()); + WebKitURIResponse* response = test->waitUntilResourceLoadFinsihedAndReturnURIResponse(); + g_assert_cmpstr(webkit_uri_response_get_mime_type(response), ==, "text/javascript"); + + test->loadURI(kServer->getURIForPath("/image.html").data()); + response = test->waitUntilResourceLoadFinsihedAndReturnURIResponse(); + g_assert_cmpstr(webkit_uri_response_get_mime_type(response), ==, "image/vnd.microsoft.icon"); + + test->loadURI(kServer->getURIForPath("/redirected-css.html").data()); + response = test->waitUntilResourceLoadFinsihedAndReturnURIResponse(); + g_assert_cmpstr(webkit_uri_response_get_mime_type(response), ==, "text/css"); } class ResourceURITrackingTest: public SingleResourceLoadTest { @@ -555,6 +568,7 @@ static void serverCallback(SoupServer* server, SoupMessage* message, const char* addCacheHTTPHeadersToResponse(message); } else if (g_str_equal(path, "/javascript.js")) { soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, kJavascript, strlen(kJavascript)); + soup_message_headers_append(message->response_headers, "Content-Type", "text/javascript"); } else if (g_str_equal(path, "/blank.ico")) { GOwnPtr<char> filePath(g_build_filename(Test::getWebKit1TestResoucesDir().data(), path, NULL)); char* contents; @@ -569,6 +583,7 @@ static void serverCallback(SoupServer* server, SoupMessage* message, const char* " padding: 0px;" "}"; soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, simpleCSS, strlen(simpleCSS)); + soup_message_headers_append(message->response_headers, "Content-Type", "text/css"); } else if (g_str_equal(path, "/redirected.css")) { soup_message_set_status(message, SOUP_STATUS_MOVED_PERMANENTLY); soup_message_headers_append(message->response_headers, "Location", "/simple-style.css"); @@ -585,6 +600,7 @@ void beforeAll() ResourcesTest::add("WebKitWebView", "resources", testWebViewResources); SingleResourceLoadTest::add("WebKitWebResource", "loading", testWebResourceLoading); SingleResourceLoadTest::add("WebKitWebResource", "response", testWebResourceResponse); + SingleResourceLoadTest::add("WebKitWebResource", "mime-type", testWebResourceMimeType); ResourceURITrackingTest::add("WebKitWebResource", "active-uri", testWebResourceActiveURI); ResourcesTest::add("WebKitWebResource", "get-data", testWebResourceGetData); ResourcesTest::add("WebKitWebView", "replaced-content", testWebViewResourcesReplacedContent); diff --git a/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp b/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp index e4c60bebc..6ede533d4 100644 --- a/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp @@ -706,6 +706,20 @@ static void testWebViewFullScreen(FullScreenClientTest* test, gconstpointer) g_assert_cmpint(test->m_event, ==, FullScreenClientTest::Leave); } +static void testWebViewCanShowMIMEType(WebViewTest* test, gconstpointer) +{ + // Supported MIME types. + g_assert(webkit_web_view_can_show_mime_type(test->m_webView, "text/html")); + g_assert(webkit_web_view_can_show_mime_type(test->m_webView, "text/plain")); + g_assert(webkit_web_view_can_show_mime_type(test->m_webView, "image/jpeg")); + + // Unsupported MIME types. + g_assert(!webkit_web_view_can_show_mime_type(test->m_webView, "text/vcard")); + g_assert(!webkit_web_view_can_show_mime_type(test->m_webView, "application/pdf")); + g_assert(!webkit_web_view_can_show_mime_type(test->m_webView, "application/zip")); + g_assert(!webkit_web_view_can_show_mime_type(test->m_webView, "application/octet-stream")); +} + void beforeAll() { WebViewTest::add("WebKitWebView", "default-context", testWebViewDefaultContext); @@ -720,6 +734,7 @@ void beforeAll() WebViewTest::add("WebKitWebView", "run-javascript", testWebViewRunJavaScript); FileChooserTest::add("WebKitWebView", "file-chooser-request", testWebViewFileChooserRequest); FullScreenClientTest::add("WebKitWebView", "fullscreen", testWebViewFullScreen); + WebViewTest::add("WebKitWebView", "can-show-mime-type", testWebViewCanShowMIMEType); } void afterAll() diff --git a/Source/WebKit2/UIProcess/API/gtk/webkit2.h b/Source/WebKit2/UIProcess/API/gtk/webkit2.h index b58210a80..cc5c349e2 100644 --- a/Source/WebKit2/UIProcess/API/gtk/webkit2.h +++ b/Source/WebKit2/UIProcess/API/gtk/webkit2.h @@ -36,9 +36,11 @@ #include <webkit2/WebKitHitTestResult.h> #include <webkit2/WebKitJavascriptResult.h> #include <webkit2/WebKitMimeInfo.h> +#include <webkit2/WebKitNavigationPolicyDecision.h> #include <webkit2/WebKitPermissionRequest.h> #include <webkit2/WebKitPlugin.h> #include <webkit2/WebKitPrintOperation.h> +#include <webkit2/WebKitResponsePolicyDecision.h> #include <webkit2/WebKitScriptDialog.h> #include <webkit2/WebKitSettings.h> #include <webkit2/WebKitURIRequest.h> diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp index 178e2dade..e0d6012d2 100644 --- a/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp +++ b/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp @@ -124,7 +124,7 @@ void QQuickWebPage::setContentsScale(qreal scale) ASSERT(scale > 0); d->contentsScale = scale; d->updateSize(); - emit d->viewportItem->experimental()->test()->contentsScaleCommitted(); + emit d->viewportItem->experimental()->test()->contentsScaleChanged(); } qreal QQuickWebPage::contentsScale() const diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp index 9d77171cc..5b43e337d 100644 --- a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp +++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp @@ -44,6 +44,7 @@ #include "qquickwebpage_p_p.h" #include "qquickwebview_p_p.h" #include "qwebdownloaditem_p_p.h" +#include "qwebiconimageprovider_p.h" #include "qwebkittest_p.h" #include "qwebloadrequest_p.h" #include "qwebnavigationhistory_p.h" @@ -54,13 +55,16 @@ #include <JavaScriptCore/JSBase.h> #include <JavaScriptCore/JSRetainPtr.h> #include <QDateTime> +#include <QtCore/QFile> #include <QtQml/QJSValue> +#include <QtQuick/QQuickView> #include <WKOpenPanelResultListener.h> #include <WKSerializedScriptValue.h> #include <WebCore/IntPoint.h> #include <WebCore/IntRect.h> #include <wtf/Assertions.h> #include <wtf/MainThread.h> +#include <wtf/Vector.h> #include <wtf/text/WTFString.h> using namespace WebCore; @@ -303,7 +307,7 @@ void QQuickWebViewPrivate::initialize(WKContextRef contextRef, WKPageGroupRef pa navigationHistory = adoptPtr(QWebNavigationHistoryPrivate::createHistory(toAPI(webPageProxy.get()))); QtWebIconDatabaseClient* iconDatabase = context->iconDatabase(); - QObject::connect(iconDatabase, SIGNAL(iconChangedForPageURL(QUrl, QUrl)), q_ptr, SLOT(_q_onIconChangedForPageURL(QUrl, QUrl))); + QObject::connect(iconDatabase, SIGNAL(iconChangedForPageURL(QString)), q_ptr, SLOT(_q_onIconChangedForPageURL(QString))); // Any page setting should preferrable be set before creating the page. webPageProxy->pageGroup()->preferences()->setAcceleratedCompositingEnabled(true); @@ -373,9 +377,6 @@ void QQuickWebViewPrivate::loadProgressDidChange(int loadProgress) { Q_Q(QQuickWebView); - if (!loadProgress) - setIcon(QUrl()); - m_loadProgress = loadProgress; emit q->loadProgressChanged(); @@ -418,16 +419,6 @@ void QQuickWebViewPrivate::setNeedsDisplay() q->page()->update(); } -void QQuickWebViewPrivate::_q_onIconChangedForPageURL(const QUrl& pageURL, const QUrl& iconURL) -{ - Q_Q(QQuickWebView); - - if (q->url() != pageURL) - return; - - setIcon(iconURL); -} - void QQuickWebViewPrivate::processDidCrash() { Q_Q(QQuickWebView); @@ -452,6 +443,7 @@ void QQuickWebViewPrivate::didRelaunchProcess() webPageProxy->drawingArea()->setSize(viewSize(), IntSize()); updateViewportSize(); + updateUserScripts(); } PassOwnPtr<DrawingAreaProxy> QQuickWebViewPrivate::createDrawingAreaProxy() @@ -480,8 +472,38 @@ void QQuickWebViewPrivate::_q_onVisibleChanged() void QQuickWebViewPrivate::_q_onUrlChanged() { + updateIcon(); +} + +void QQuickWebViewPrivate::_q_onIconChangedForPageURL(const QString& pageUrl) +{ + if (pageUrl != QString(m_currentUrl)) + return; + + updateIcon(); +} + +/* Called either when the url changes, or when the icon for the current page changes */ +void QQuickWebViewPrivate::updateIcon() +{ Q_Q(QQuickWebView); - context->iconDatabase()->requestIconForPageURL(q->url()); + + QQuickView* view = qobject_cast<QQuickView*>(q->canvas()); + if (!view) + return; + + QWebIconImageProvider* provider = static_cast<QWebIconImageProvider*>( + view->engine()->imageProvider(QWebIconImageProvider::identifier())); + if (!provider) + return; + + WTF::String iconUrl = provider->iconURLForPageURLInContext(m_currentUrl, context.get()); + + if (iconUrl == m_iconUrl) + return; + + m_iconUrl = iconUrl; + emit q->iconChanged(); } void QQuickWebViewPrivate::_q_onReceivedResponseFromDownload(QWebDownloadItem* downloadItem) @@ -641,31 +663,6 @@ void QQuickWebViewPrivate::addAttachedPropertyTo(QObject* object) attached->setView(q); } -void QQuickWebViewPrivate::setIcon(const QUrl& iconURL) -{ - Q_Q(QQuickWebView); - if (m_iconURL == iconURL) - return; - - if (!webPageProxy->mainFrame()) - return; - - String oldPageURL = QUrl::fromPercentEncoding(m_iconURL.encodedFragment()); - String newPageURL = webPageProxy->mainFrame()->url(); - - if (oldPageURL != newPageURL) { - QtWebIconDatabaseClient* iconDatabase = context->iconDatabase(); - if (!oldPageURL.isEmpty()) - iconDatabase->releaseIconForPageURL(oldPageURL); - - if (!newPageURL.isEmpty()) - iconDatabase->retainIconForPageURL(newPageURL); - } - - m_iconURL = iconURL; - emit q->iconChanged(); -} - bool QQuickWebViewPrivate::navigatorQtObjectEnabled() const { return m_navigatorQtObjectEnabled; @@ -679,6 +676,52 @@ void QQuickWebViewPrivate::setNavigatorQtObjectEnabled(bool enabled) context->setNavigatorQtObjectEnabled(webPageProxy.get(), enabled); } +static QString readUserScript(const QUrl& url) +{ + QString path; + if (url.isLocalFile()) + path = url.toLocalFile(); + else if (url.scheme() == QLatin1String("qrc")) + path = QStringLiteral(":") + url.path(); + else { + qWarning("QQuickWebView: Couldn't open '%s' as user script because only file:/// and qrc:/// URLs are supported.", qPrintable(url.toString())); + return QString(); + } + + QFile file(path); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning("QQuickWebView: Couldn't open '%s' as user script due to error '%s'.", qPrintable(url.toString()), qPrintable(file.errorString())); + return QString(); + } + + QString contents = QString::fromUtf8(file.readAll()); + if (contents.isEmpty()) + qWarning("QQuickWebView: Ignoring '%s' as user script because file is empty.", qPrintable(url.toString())); + + return contents; +} + +void QQuickWebViewPrivate::updateUserScripts() +{ + Vector<String> scripts; + scripts.reserveCapacity(userScripts.size()); + + for (unsigned i = 0; i < userScripts.size(); ++i) { + const QUrl& url = userScripts.at(i); + if (!url.isValid()) { + qWarning("QQuickWebView: Couldn't open '%s' as user script because URL is invalid.", qPrintable(url.toString())); + continue; + } + + QString contents = readUserScript(url); + if (contents.isEmpty()) + continue; + scripts.append(String(contents)); + } + + webPageProxy->setUserScripts(scripts); +} + QPointF QQuickWebViewPrivate::contentPos() const { Q_Q(const QQuickWebView); @@ -727,12 +770,6 @@ void QQuickWebViewPrivate::didReceiveMessageFromNavigatorQtObject(const String& QQuickWebViewLegacyPrivate::QQuickWebViewLegacyPrivate(QQuickWebView* viewport) : QQuickWebViewPrivate(viewport) { - // Default values for the Legacy view. - attributes.devicePixelRatio = 1; - attributes.initialScale = 1; - attributes.minimumScale = 1; - attributes.maximumScale = 1; - attributes.userScalable = 0; } void QQuickWebViewLegacyPrivate::initialize(WKContextRef contextRef, WKPageGroupRef pageGroupRef) @@ -782,7 +819,8 @@ void QQuickWebViewLegacyPrivate::setZoomFactor(qreal factor) QQuickWebViewFlickablePrivate::QQuickWebViewFlickablePrivate(QQuickWebView* viewport) : QQuickWebViewPrivate(viewport) - , pageIsSuspended(true) + , pageIsSuspended(false) + , lastCommittedScale(-1) { // Disable mouse events on the flickable web view so we do not // select text during pan gestures on platforms which send both @@ -823,30 +861,7 @@ void QQuickWebViewFlickablePrivate::onComponentComplete() void QQuickWebViewFlickablePrivate::didChangeViewportProperties(const WebCore::ViewportAttributes& newAttributes) { - Q_Q(QQuickWebView); - - // FIXME: Revise these when implementing fit-to-width. - WebCore::ViewportAttributes attr = newAttributes; - WebCore::restrictScaleFactorToInitialScaleIfNotUserScalable(attr); - - // FIXME: Resetting here can reset more than needed. For instance it will end deferrers. - // This needs to be revised at some point. - interactionEngine->reset(); - - interactionEngine->setContentToDevicePixelRatio(attr.devicePixelRatio); - - interactionEngine->setAllowsUserScaling(!!attr.userScalable); - interactionEngine->setCSSScaleBounds(attr.minimumScale, attr.maximumScale); - - if (!interactionEngine->hadUserInteraction() && !pageIsSuspended) - interactionEngine->setCSSScale(attr.initialScale); - - this->attributes = attr; - emit q->experimental()->test()->viewportChanged(); - - // If the web app successively changes the viewport on purpose - // it wants to be in control and we should disable animations. - interactionEngine->setItemRectVisible(interactionEngine->nearestValidBounds()); + interactionEngine->viewportAttributesChanged(newAttributes); } void QQuickWebViewFlickablePrivate::updateViewportSize() @@ -876,14 +891,19 @@ void QQuickWebViewFlickablePrivate::_q_onInformVisibleContentChange(const QPoint if (!drawingArea) return; - const QRect visibleRect(visibleContentsRect()); + QRectF accurateVisibleRect(q->boundingRect()); + accurateVisibleRect.translate(contentPos()); + + if (accurateVisibleRect == drawingArea->contentsRect()) + return; + float scale = pageView->contentsScale(); - emit q->experimental()->test()->contentsScaleChanged(); + if (scale != lastCommittedScale) + emit q->experimental()->test()->contentsScaleCommitted(); + lastCommittedScale = scale; - QRectF accurateVisibleRect(q->boundingRect()); - accurateVisibleRect.translate(contentPos()); - drawingArea->setVisibleContentsRect(visibleRect, scale, trajectoryVector, FloatPoint(accurateVisibleRect.x(), accurateVisibleRect.y())); + drawingArea->setVisibleContentsRect(QRect(visibleContentsRect()), scale, trajectoryVector, FloatPoint(accurateVisibleRect.x(), accurateVisibleRect.y())); // Ensure that updatePaintNode is always called before painting. pageView->update(); @@ -908,38 +928,17 @@ void QQuickWebViewFlickablePrivate::_q_resume() void QQuickWebViewFlickablePrivate::pageDidRequestScroll(const QPoint& pos) { - interactionEngine->pagePositionRequest(pos); + interactionEngine->pageContentPositionRequest(pos); } void QQuickWebViewFlickablePrivate::didChangeContentsSize(const QSize& newSize) { Q_Q(QQuickWebView); - QSize viewportSize = q->boundingRect().size().toSize(); pageView->setContentsSize(newSize); // emits contentsSizeChanged() - - float minimumScale = WebCore::computeMinimumScaleFactorForContentContained(attributes, viewportSize, newSize); - - bool scaleCommitNotified = false; - - if (!qFuzzyCompare(minimumScale, attributes.minimumScale)) { - interactionEngine->setCSSScaleBounds(minimumScale, attributes.maximumScale); - emit q->experimental()->test()->viewportChanged(); - - if (!interactionEngine->hadUserInteraction() && !pageIsSuspended) { - // Emits contentsScaleCommitted(); - scaleCommitNotified = true; - interactionEngine->setCSSScale(minimumScale); - } - } - - // Emit for testing purposes, so that it can be verified that - // we didn't do scale adjustment. - if (!scaleCommitNotified) - emit q->experimental()->test()->contentsScaleCommitted(); + interactionEngine->pageContentsSizeChanged(newSize, q->boundingRect().size().toSize()); } - /*! \qmlsignal WebView::onNavigationRequested(WebNavigationRequest request) @@ -1296,6 +1295,22 @@ void QQuickWebViewExperimental::evaluateJavaScript(const QString& script, const d_ptr->webPageProxy.get()->runJavaScriptInMainFrame(script, ScriptValueCallback::create(closure, javaScriptCallback)); } +QList<QUrl> QQuickWebViewExperimental::userScripts() const +{ + Q_D(const QQuickWebView); + return d->userScripts; +} + +void QQuickWebViewExperimental::setUserScripts(const QList<QUrl>& userScripts) +{ + Q_D(QQuickWebView); + if (d->userScripts == userScripts) + return; + d->userScripts = userScripts; + d->updateUserScripts(); + emit userScriptsChanged(); +} + QQuickUrlSchemeDelegate* QQuickWebViewExperimental::schemeDelegates_At(QQmlListProperty<QQuickUrlSchemeDelegate>* property, int index) { const QObjectList children = property->object->children(); @@ -1494,7 +1509,7 @@ void QQuickWebView::emitUrlChangeIfNeeded() QUrl QQuickWebView::icon() const { Q_D(const QQuickWebView); - return d->m_iconURL; + return QUrl(d->m_iconUrl); } /*! diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h index f33c6e654..cf469fb1e 100644 --- a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h +++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h @@ -212,11 +212,12 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_onVisibleChanged()); Q_PRIVATE_SLOT(d_func(), void _q_onUrlChanged()); Q_PRIVATE_SLOT(d_func(), void _q_onReceivedResponseFromDownload(QWebDownloadItem*)); - Q_PRIVATE_SLOT(d_func(), void _q_onIconChangedForPageURL(const QUrl&, const QUrl&)); + Q_PRIVATE_SLOT(d_func(), void _q_onIconChangedForPageURL(const QString&)); // Hides QObject::d_ptr allowing us to use the convenience macros. QScopedPointer<QQuickWebViewPrivate> d_ptr; QQuickWebViewExperimental* m_experimental; + friend class QWebKitTest; friend class WebKit::QtViewportInteractionEngine; friend class WebKit::QtWebPageLoadClient; friend class WebKit::QtWebPagePolicyClient; @@ -268,6 +269,7 @@ class QWEBKIT_EXPORT QQuickWebViewExperimental : public QObject { Q_PROPERTY(QQmlListProperty<QQuickUrlSchemeDelegate> urlSchemeDelegates READ schemeDelegates) Q_PROPERTY(QString userAgent READ userAgent WRITE setUserAgent NOTIFY userAgentChanged) Q_PROPERTY(double devicePixelRatio READ devicePixelRatio WRITE setDevicePixelRatio NOTIFY devicePixelRatioChanged) + Q_PROPERTY(QList<QUrl> userScripts READ userScripts WRITE setUserScripts NOTIFY userScriptsChanged) Q_ENUMS(NavigationRequestActionExperimental) public: @@ -300,6 +302,8 @@ public: void setUserAgent(const QString& userAgent); double devicePixelRatio() const; void setDevicePixelRatio(double); + QList<QUrl> userScripts() const; + void setUserScripts(const QList<QUrl>& userScripts); QWebKitTest* test(); @@ -353,6 +357,7 @@ Q_SIGNALS: void devicePixelRatioChanged(); void enterFullScreenRequested(); void exitFullScreenRequested(); + void userScriptsChanged(); private: QQuickWebView* q_ptr; diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h index 572a7f226..69afc2d54 100644 --- a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h +++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h @@ -103,7 +103,7 @@ public: void _q_onVisibleChanged(); void _q_onUrlChanged(); void _q_onReceivedResponseFromDownload(QWebDownloadItem*); - void _q_onIconChangedForPageURL(const QUrl& pageURL, const QUrl& iconURLString); + void _q_onIconChangedForPageURL(const QString&); void chooseFiles(WKOpenPanelResultListenerRef, const QStringList& selectedFileNames, WebKit::QtWebPageUIClient::FileChooserType); quint64 exceededDatabaseQuota(const QString& databaseName, const QString& displayName, WKSecurityOriginRef securityOrigin, quint64 currentQuota, quint64 currentOriginUsage, quint64 currentDatabaseUsage, quint64 expectedUsage); @@ -118,12 +118,12 @@ public: void setRenderToOffscreenBuffer(bool enable) { m_renderToOffscreenBuffer = enable; } void setTransparentBackground(bool); void addAttachedPropertyTo(QObject*); - void setIcon(const QUrl&); bool navigatorQtObjectEnabled() const; bool renderToOffscreenBuffer() const { return m_renderToOffscreenBuffer; } bool transparentBackground() const; void setNavigatorQtObjectEnabled(bool); + void updateUserScripts(); QPointF contentPos() const; void setContentPos(const QPointF&); @@ -132,6 +132,8 @@ public: void setDialogActive(bool active) { m_dialogActive = active; } + void updateIcon(); + // PageClient. WebCore::IntSize viewSize() const; void didReceiveMessageFromNavigatorQtObject(const String& message); @@ -190,14 +192,14 @@ protected: QQmlComponent* filePicker; QQmlComponent* databaseQuotaDialog; - WebCore::ViewportAttributes attributes; + QList<QUrl> userScripts; bool m_useDefaultContentItemSize; bool m_navigatorQtObjectEnabled; bool m_renderToOffscreenBuffer; bool m_dialogActive; bool m_allowAnyHTTPSCertificateForLocalHost; - QUrl m_iconURL; + WTF::String m_iconUrl; int m_loadProgress; WTF::String m_currentUrl; }; @@ -239,6 +241,7 @@ public: private: QScopedPointer<WebKit::QtViewportInteractionEngine> interactionEngine; bool pageIsSuspended; + float lastCommittedScale; }; #endif // qquickwebview_p_p_h diff --git a/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider.cpp b/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider.cpp index 71342a1e3..63dce28d0 100644 --- a/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider.cpp +++ b/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider.cpp @@ -24,6 +24,7 @@ #include "QtWebIconDatabaseClient.h" #include <QtCore/QUrl> #include <QtGui/QImage> +#include <wtf/text/StringHash.h> #include <wtf/text/WTFString.h> using namespace WebKit; @@ -37,24 +38,52 @@ QWebIconImageProvider::~QWebIconImageProvider() { } -QImage QWebIconImageProvider::requestImage(const QString& id, QSize* size, const QSize& requestedSize) +WTF::String QWebIconImageProvider::iconURLForPageURLInContext(const WTF::String &pageURL, QtWebContext* context) { - QString decodedIconUrl = id; - decodedIconUrl.remove(0, decodedIconUrl.indexOf('#') + 1); - String pageURL = QString::fromUtf8(QUrl(decodedIconUrl).toEncoded()); + QtWebIconDatabaseClient* iconDatabase = context->iconDatabase(); + WTF::String iconURL = iconDatabase->iconForPageURL(pageURL); + + if (iconURL.isEmpty()) + return String(); + + QUrl url; + url.setScheme(QStringLiteral("image")); + url.setHost(QWebIconImageProvider::identifier()); + + QString path; + path.append(QLatin1Char('/')); + path.append(QString::number(context->contextID())); + path.append(QLatin1Char('/')); + path.append(QString::number(WTF::StringHash::hash(iconURL))); + url.setPath(path); + + // FIXME: Use QUrl::DecodedMode when landed in Qt + url.setFragment(QString::fromLatin1(QByteArray(QString(pageURL).toUtf8()).toBase64())); + + // FIXME: We can't know when the icon url is no longer in use, + // so we never release these icons. At some point we might want + // to introduce expiry of icons to elevate this issue. + iconDatabase->retainIconForPageURL(pageURL); + return url.toString(QUrl::FullyEncoded); +} + +QImage QWebIconImageProvider::requestImage(const QString& id, QSize* size, const QSize& requestedSize) +{ // The string identifier has the leading image://webicon/ already stripped, so we just // need to truncate from the first slash to get the context id. - QString contextIDAsString = id; - contextIDAsString.truncate(contextIDAsString.indexOf(QLatin1Char('/'))); + QString contextIDString = id.left(id.indexOf(QLatin1Char('/'))); bool ok = false; - uint64_t contextId = contextIDAsString.toUInt(&ok); + uint64_t contextId = contextIDString.toUInt(&ok); if (!ok) return QImage(); + QtWebContext* context = QtWebContext::contextByID(contextId); if (!context) return QImage(); + QString pageURL = QString::fromUtf8(QByteArray::fromBase64(id.midRef(id.indexOf('#') + 1).toLatin1())); + QtWebIconDatabaseClient* iconDatabase = context->iconDatabase(); QImage icon = requestedSize.isValid() ? iconDatabase->iconImageForPageURL(pageURL, requestedSize) : iconDatabase->iconImageForPageURL(pageURL); ASSERT(!icon.isNull()); diff --git a/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider_p.h b/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider_p.h index a54008a2c..7efe21a14 100644 --- a/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider_p.h +++ b/Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider_p.h @@ -21,13 +21,23 @@ #define qwebiconimageprovider_p_h #include "qwebkitglobal.h" +#include <QString> #include <QtQuick/QQuickImageProvider> +#include <wtf/text/WTFString.h> + +namespace WebKit { + class QtWebContext; +} class QWEBKIT_EXPORT QWebIconImageProvider : public QQuickImageProvider { public: QWebIconImageProvider(); ~QWebIconImageProvider(); - QImage requestImage(const QString& id, QSize* size, const QSize& requestedSize); + + static QString identifier() { return QStringLiteral("webicon"); } + + WTF::String iconURLForPageURLInContext(const WTF::String& pageURL, WebKit::QtWebContext* context); + virtual QImage requestImage(const QString& id, QSize* size, const QSize& requestedSize); }; #endif diff --git a/Source/WebKit2/UIProcess/API/qt/qwebkittest.cpp b/Source/WebKit2/UIProcess/API/qt/qwebkittest.cpp index 529df01eb..e0a441c0e 100644 --- a/Source/WebKit2/UIProcess/API/qt/qwebkittest.cpp +++ b/Source/WebKit2/UIProcess/API/qt/qwebkittest.cpp @@ -22,9 +22,10 @@ #include "qwebkittest_p.h" #include "QtViewportInteractionEngine.h" -#include "QtWebPageEventHandler.h" -#include "qquickwebview_p.h" #include "qquickwebview_p_p.h" +#include "qwindowsysteminterface_qpa.h" +#include <QMutableListIterator> +#include <QTouchEvent> using namespace WebKit; @@ -43,41 +44,71 @@ static QTouchEvent::TouchPoint touchPoint(qreal x, qreal y) QPointF localPos(x, y); QTouchEvent::TouchPoint point; + point.setId(1); point.setLastPos(localPos); QRectF touchRect(0, 0, 40, 40); touchRect.moveCenter(localPos); point.setRect(touchRect); + point.setPressure(1); return point; } +bool QWebKitTest::sendTouchEvent(QQuickWebView* window, QEvent::Type type, const QList<QTouchEvent::TouchPoint>& points, ulong timestamp) +{ + ASSERT(window); + + static QTouchDevice* device = 0; + if (!device) { + device = new QTouchDevice; + device->setType(QTouchDevice::TouchScreen); + QWindowSystemInterface::registerTouchDevice(device); + } + + Qt::TouchPointStates touchPointStates = 0; + foreach (const QTouchEvent::TouchPoint& touchPoint, points) + touchPointStates |= touchPoint.state(); + + QTouchEvent event(type, device, Qt::NoModifier, touchPointStates, points); + event.setTimestamp(timestamp); + event.setAccepted(false); + + window->touchEvent(&event); + + return event.isAccepted(); +} + bool QWebKitTest::touchTap(QObject* item, qreal x, qreal y, int delay) { - if (!qobject_cast<QQuickWebView*>(item)) { - // FIXME: We only support the actual web view for now. - qWarning("Touch event \"DoubleTap\" not accepted by receiving item"); + QQuickWebView* window = qobject_cast<QQuickWebView*>(item); + + if (!window) { + qWarning("Touch event \"TouchBegin\" not accepted by receiving item"); return false; } // FIXME: implement delay using QTest::qWait() or similar. Q_UNUSED(delay); - m_webViewPrivate->pageView->eventHandler()->handleSingleTapEvent(touchPoint(x, y)); + + QList<QTouchEvent::TouchPoint> points; + points.append(touchPoint(x, y)); + + points[0].setState(Qt::TouchPointPressed); + sendTouchEvent(window, QEvent::TouchBegin, points, QDateTime::currentMSecsSinceEpoch()); + + points[0].setState(Qt::TouchPointReleased); + sendTouchEvent(window, QEvent::TouchEnd, points, QDateTime::currentMSecsSinceEpoch()); return true; } bool QWebKitTest::touchDoubleTap(QObject* item, qreal x, qreal y, int delay) { - if (!qobject_cast<QQuickWebView*>(item)) { - // FIXME: We only support the actual web view for now. - qWarning("Touch event \"DoubleTap\" not accepted by receiving item"); + if (!touchTap(item, x, y, delay)) return false; - } - - // FIXME: implement delay using QTest::qWait() or similar. - Q_UNUSED(delay); - m_webViewPrivate->pageView->eventHandler()->handleDoubleTapEvent(touchPoint(x, y)); + if (!touchTap(item, x, y, delay)) + return false; return true; } @@ -89,44 +120,49 @@ QSize QWebKitTest::contentsSize() const QVariant QWebKitTest::contentsScale() const { - if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine()) - return interactionEngine->currentCSSScale(); - - return m_webViewPrivate->attributes.initialScale; + if (QtViewportInteractionEngine* viewport = m_webViewPrivate->viewportInteractionEngine()) + return viewport->currentCSSScale(); + return QVariant(); } QVariant QWebKitTest::devicePixelRatio() const { - return m_webViewPrivate->attributes.devicePixelRatio; + if (QtViewportInteractionEngine* viewport = m_webViewPrivate->viewportInteractionEngine()) + return viewport->m_devicePixelRatio; + return QVariant(); } QVariant QWebKitTest::initialScale() const { - return m_webViewPrivate->attributes.initialScale; + if (QtViewportInteractionEngine* viewport = m_webViewPrivate->viewportInteractionEngine()) + return viewport->m_rawAttributes.initialScale; + return QVariant(); } QVariant QWebKitTest::minimumScale() const { - if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine()) - return interactionEngine->m_minimumScale; - - return m_webViewPrivate->attributes.minimumScale; + if (QtViewportInteractionEngine* viewport = m_webViewPrivate->viewportInteractionEngine()) + return viewport->m_minimumScale; + return QVariant(); } QVariant QWebKitTest::maximumScale() const { - if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine()) - return interactionEngine->m_maximumScale; - - return m_webViewPrivate->attributes.maximumScale; + if (QtViewportInteractionEngine* viewport = m_webViewPrivate->viewportInteractionEngine()) + return viewport->m_maximumScale; + return QVariant(); } QVariant QWebKitTest::isScalable() const { - return !!m_webViewPrivate->attributes.userScalable; + if (QtViewportInteractionEngine* viewport = m_webViewPrivate->viewportInteractionEngine()) + return !!viewport->m_rawAttributes.userScalable; + return QVariant(); } QVariant QWebKitTest::layoutSize() const { - return QSizeF(m_webViewPrivate->attributes.layoutSize); + if (QtViewportInteractionEngine* viewport = m_webViewPrivate->viewportInteractionEngine()) + return QSizeF(viewport->m_rawAttributes.layoutSize); + return QVariant(); } diff --git a/Source/WebKit2/UIProcess/API/qt/qwebkittest_p.h b/Source/WebKit2/UIProcess/API/qt/qwebkittest_p.h index 613486409..982398d3a 100644 --- a/Source/WebKit2/UIProcess/API/qt/qwebkittest_p.h +++ b/Source/WebKit2/UIProcess/API/qt/qwebkittest_p.h @@ -22,6 +22,7 @@ #define qwebkittest_p_h #include "qwebkitglobal.h" +#include "qquickwebview_p.h" #include <QtCore/QObject> #include <QtCore/QPointer> @@ -60,6 +61,8 @@ public: QWebKitTest(QQuickWebViewPrivate* webviewPrivate, QObject* parent = 0); virtual ~QWebKitTest(); + bool sendTouchEvent(QQuickWebView* window, QEvent::Type type, const QList<QTouchEvent::TouchPoint>& points, ulong timestamp); + QSize contentsSize() const; QVariant contentsScale() const; diff --git a/Source/WebKit2/UIProcess/API/qt/tests/publicapi/tst_publicapi.cpp b/Source/WebKit2/UIProcess/API/qt/tests/publicapi/tst_publicapi.cpp index 6c0cb4b62..0e3b33cf7 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/publicapi/tst_publicapi.cpp +++ b/Source/WebKit2/UIProcess/API/qt/tests/publicapi/tst_publicapi.cpp @@ -17,6 +17,8 @@ Boston, MA 02110-1301, USA. */ +#include "config.h" + #include <QMetaEnum> #include <QMetaMethod> #include <QMetaObject> @@ -142,7 +144,7 @@ static void gatherAPI(const QString& prefix, const QMetaMethod& method, QStringL { if (method.access() != QMetaMethod::Private) { const char* methodTypeName = !!strlen(method.typeName()) ? method.typeName() : "void"; -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) +#if HAVE(QT5) *output << QString::fromLatin1("%1%2 --> %3").arg(prefix).arg(QString::fromLatin1(method.methodSignature())).arg(QString::fromLatin1(methodTypeName)); #else *output << QString::fromLatin1("%1%2 --> %3").arg(prefix).arg(method.signature()).arg(methodTypeName); diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView.pro b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView.pro index 5cc6f35f5..fd940d43d 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView.pro +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView.pro @@ -16,3 +16,5 @@ DEFINES += IMPORT_DIR=\"\\\"$${ROOT_BUILD_DIR}$${QMAKE_DIR_SEP}imports\\\"\" OTHER_FILES += \ WebView/* \ common/* + +RESOURCES = resources.qrc diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_favIconLoad.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_favIconLoad.qml index 8210040e8..f6ed4b261 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_favIconLoad.qml +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_favIconLoad.qml @@ -20,6 +20,7 @@ TestWebView { TestCase { id: test name: "WebViewLoadFavIcon" + when: windowShown function init() { if (webView.icon != '') { @@ -36,7 +37,6 @@ TestWebView { var url = Qt.resolvedUrl("../common/favicon.html") webView.url = url verify(webView.waitForLoadSucceeded()) - expectFail("", "https://bugs.webkit.org/show_bug.cgi?id=87133") compare(spy.count, 1) compare(favicon.width, 48) compare(favicon.height, 48) @@ -47,7 +47,6 @@ TestWebView { var url = Qt.resolvedUrl("../common/favicon2.html?favicon=load should work with#whitespace!") webView.url = url verify(webView.waitForLoadSucceeded()) - expectFail("", "https://bugs.webkit.org/show_bug.cgi?id=87133") compare(spy.count, 1) compare(favicon.width, 16) compare(favicon.height, 16) diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_itemSelector.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_itemSelector.qml index d3d7786a3..78ea6f94f 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_itemSelector.qml +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_itemSelector.qml @@ -4,8 +4,6 @@ import QtWebKit 3.0 import QtWebKit.experimental 1.0 import "../common" -// FIXME: Moved to Desktop tests because we want to have mouseClick() to open the <select> tag. We can move it back -// when TestCase starts supporting touch events, see https://bugreports.qt.nokia.com/browse/QTBUG-23083. TestWebView { id: webView @@ -59,7 +57,7 @@ TestWebView { } function openItemSelector() { - mouseClick(webView, 15, 15, Qt.LeftButton) + webView.experimental.test.touchTap(webView, 15, 15) } function test_accept() { diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_messaging.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_messaging.qml index 1b3ab6314..9f16bb8b6 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_messaging.qml +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_messaging.qml @@ -45,7 +45,7 @@ Item { } TestCase { - name: "DesktopWebViewMessaging" + name: "WebViewMessaging" property url testUrl: Qt.resolvedUrl("../common/messaging.html") function init() { diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_multiFileUpload.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_multiFileUpload.qml index f43f65672..73ea70845 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_multiFileUpload.qml +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_multiFileUpload.qml @@ -4,8 +4,6 @@ import QtWebKit 3.0 import QtWebKit.experimental 1.0 import "../common" -// FIXME: Added to Desktop tests because we want to have mouseClick() to open the <input> tag. We can move it back -// when TestCase starts supporting touch events, see https://bugreports.qt.nokia.com/browse/QTBUG-23083. TestWebView { id: webView @@ -46,7 +44,7 @@ TestWebView { } function openItemSelector() { - mouseClick(webView, 15, 15, Qt.LeftButton) + webView.experimental.test.touchTap(webView, 15, 15) } function test_accept() { diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_singleFileUpload.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_singleFileUpload.qml index 7ca9efa38..be1409b7f 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_singleFileUpload.qml +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_singleFileUpload.qml @@ -4,8 +4,6 @@ import QtWebKit 3.0 import QtWebKit.experimental 1.0 import "../common" -// FIXME: Added to Desktop tests because we want to have mouseClick() to open the <input> tag. We can move it back -// when TestCase starts supporting touch events, see https://bugreports.qt.nokia.com/browse/QTBUG-23083. TestWebView { id: webView @@ -51,7 +49,7 @@ TestWebView { } function openItemSelector() { - mouseClick(webView, 15, 15, Qt.LeftButton) + webView.experimental.test.touchTap(webView, 15, 15) } function test_accept() { diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_userScripts.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_userScripts.qml new file mode 100644 index 000000000..3d15aca05 --- /dev/null +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_userScripts.qml @@ -0,0 +1,113 @@ +import QtQuick 2.0 +import QtTest 1.0 +import QtWebKit 3.0 +import QtWebKit.experimental 1.0 +import "../common" + +Item { + TestWebView { + id: webView + width: 400 + height: 300 + } + + TestWebView { + id: webViewWithConditionalUserScripts + width: 400 + height: 300 + + onNavigationRequested: { + var urlString = request.url.toString(); + if (urlString.indexOf("test1.html") !== -1) + experimental.userScripts = [Qt.resolvedUrl("../common/change-document-title.js")]; + else if (urlString.indexOf("test2.html") !== -1) + experimental.userScripts = [Qt.resolvedUrl("../common/append-document-title.js")]; + else + experimental.userScripts = []; + } + } + + TestCase { + name: "WebViewUserScripts" + + function init() { + webView.url = ""; + webView.experimental.userScripts = []; + } + + function test_oneScript() { + webView.url = Qt.resolvedUrl("../common/test1.html"); + webView.waitForLoadSucceeded(); + compare(webView.title, "Test page 1"); + + webView.experimental.userScripts = [Qt.resolvedUrl("../common/change-document-title.js")]; + compare(webView.title, "Test page 1"); + + webView.reload(); + webView.waitForLoadSucceeded(); + compare(webView.title, "New title"); + + webView.url = Qt.resolvedUrl("../common/test2.html"); + webView.waitForLoadSucceeded(); + compare(webView.title, "New title"); + + webView.experimental.userScripts = []; + compare(webView.title, "New title"); + + webView.reload(); + webView.waitForLoadSucceeded(); + compare(webView.title, "Test page with huge link area"); + } + + function test_twoScripts() { + webView.url = Qt.resolvedUrl("../common/test1.html"); + webView.waitForLoadSucceeded(); + compare(webView.title, "Test page 1"); + + webView.experimental.userScripts = [Qt.resolvedUrl("../common/change-document-title.js"), Qt.resolvedUrl("../common/append-document-title.js")]; + webView.reload(); + webView.waitForLoadSucceeded(); + compare(webView.title, "New title with appendix"); + + // Make sure we can remove scripts from the preload list. + webView.experimental.userScripts = [Qt.resolvedUrl("../common/append-document-title.js")]; + webView.reload(); + webView.waitForLoadSucceeded(); + compare(webView.title, "Test page 1 with appendix"); + + // Make sure the scripts are loaded in order. + webView.experimental.userScripts = [Qt.resolvedUrl("../common/append-document-title.js"), Qt.resolvedUrl("../common/change-document-title.js")]; + webView.reload(); + webView.waitForLoadSucceeded(); + compare(webView.title, "New title"); + } + + function test_setUserScriptsConditionally() { + webViewWithConditionalUserScripts.url = Qt.resolvedUrl("../common/test1.html"); + webViewWithConditionalUserScripts.waitForLoadSucceeded(); + compare(webViewWithConditionalUserScripts.title, "New title"); + + webViewWithConditionalUserScripts.url = Qt.resolvedUrl("../common/test2.html"); + webViewWithConditionalUserScripts.waitForLoadSucceeded(); + compare(webViewWithConditionalUserScripts.title, "Test page with huge link area with appendix"); + + webViewWithConditionalUserScripts.url = Qt.resolvedUrl("../common/test3.html"); + webViewWithConditionalUserScripts.waitForLoadSucceeded(); + compare(webViewWithConditionalUserScripts.title, "Test page 3"); + } + + function test_bigScript() { + webView.experimental.userScripts = [Qt.resolvedUrl("../common/big-user-script.js")]; + webView.url = Qt.resolvedUrl("../common/test1.html"); + webView.waitForLoadSucceeded(); + compare(webView.title, "Big user script changed title"); + } + + function test_fromResourceFile() { + webView.experimental.userScripts = ["qrc:///common/change-document-title.js"]; + webView.url = Qt.resolvedUrl("../common/test1.html"); + webView.waitForLoadSucceeded(); + compare(webView.title, "New title"); + } + } +} diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/append-document-title.js b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/append-document-title.js new file mode 100644 index 000000000..fb4a2a6f2 --- /dev/null +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/append-document-title.js @@ -0,0 +1 @@ +document.title += " with appendix"; diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/big-user-script.js b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/big-user-script.js new file mode 100644 index 000000000..e6e3d2b44 --- /dev/null +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/big-user-script.js @@ -0,0 +1,110 @@ +// Used to make sure serialization of user scripts between UI process and Web process can handle files bigger +// than the maximum message size defined in ConnectionXXX classes. + +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////////////////////// + +document.title = "Big user script changed title"; diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/change-document-title.js b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/change-document-title.js new file mode 100644 index 000000000..bdae45c21 --- /dev/null +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/change-document-title.js @@ -0,0 +1 @@ +document.title = "New title"; diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/resources.qrc b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/resources.qrc new file mode 100644 index 000000000..1696aaac1 --- /dev/null +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/resources.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>common/change-document-title.js</file> + </qresource> +</RCC> diff --git a/Source/WebKit2/UIProcess/API/qt/tests/tests.pri b/Source/WebKit2/UIProcess/API/qt/tests/tests.pri index 358a2328c..2704efe4a 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/tests.pri +++ b/Source/WebKit2/UIProcess/API/qt/tests/tests.pri @@ -11,6 +11,7 @@ SOURCES += ../util.cpp \ INCLUDEPATH += $$PWD QT += testlib qml quick quick-private webkit +WEBKIT += wtf # For platform macros DEFINES += TESTS_SOURCE_DIR=\\\"$$PWD\\\" \ QWP_PATH=\\\"$${ROOT_BUILD_DIR}/bin\\\" |