summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-06-01 10:36:58 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-06-01 10:36:58 +0200
commitb1e9e47fa11f608ae16bc07f97a2acf95bf80272 (patch)
treec88c45e80c9c44506e7cdf9a3bb39ebf82a8cd5b /Source/WebKit2/UIProcess/API
parentbe01689f43cf6882cf670d33df49ead1f570c53a (diff)
downloadqtwebkit-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')
-rw-r--r--Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp9
-rw-r--r--Source/WebKit2/UIProcess/API/efl/PageClientImpl.h3
-rw-r--r--Source/WebKit2/UIProcess/API/efl/ewk_view_private.h (renamed from Source/WebKit2/UIProcess/API/efl/ewk_private.h)6
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitDownload.cpp22
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitDownload.h4
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp3
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitUIClient.cpp1
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.cpp34
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.h3
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp57
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h4
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp4
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt3
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/tests/TestDownloads.cpp10
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp48
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp15
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/webkit2.h2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp215
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h7
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h11
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider.cpp43
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qwebiconimageprovider_p.h12
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qwebkittest.cpp96
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qwebkittest_p.h3
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/publicapi/tst_publicapi.cpp4
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView.pro2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_favIconLoad.qml3
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_itemSelector.qml (renamed from Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_itemSelector.qml)4
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_messaging.qml (renamed from Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_messaging.qml)2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_multiFileUpload.qml (renamed from Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_multiFileUpload.qml)4
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_singleFileUpload.qml (renamed from Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_singleFileUpload.qml)4
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_userScripts.qml113
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/append-document-title.js1
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/big-user-script.js110
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/change-document-title.js1
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/resources.qrc5
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/tests.pri1
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\\\"