diff options
Diffstat (limited to 'Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestLoaderClient.cpp')
-rw-r--r-- | Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestLoaderClient.cpp | 211 |
1 files changed, 192 insertions, 19 deletions
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestLoaderClient.cpp b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestLoaderClient.cpp index 331915e00..7dd69f5f9 100644 --- a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestLoaderClient.cpp +++ b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestLoaderClient.cpp @@ -27,6 +27,7 @@ #include "WebViewTest.h" #include <gtk/gtk.h> #include <libsoup/soup.h> +#include <wtf/Vector.h> #include <wtf/text/CString.h> static WebKitTestBus* bus; @@ -82,6 +83,13 @@ static void testLoadAlternateHTML(LoadTrackingTest* test, gconstpointer) assertNormalLoadHappened(test->m_loadEvents); } +static void testLoadAlternateHTMLForLocalPage(LoadTrackingTest* test, gconstpointer) +{ + test->loadAlternateHTML("<html><body>Alternate page</body></html>", "file:///not/actually/loaded.html", 0); + test->waitUntilLoadFinished(); + assertNormalLoadHappened(test->m_loadEvents); +} + static void testLoadPlainText(LoadTrackingTest* test, gconstpointer) { test->loadPlainText("Hello WebKit-GTK+"); @@ -89,6 +97,18 @@ static void testLoadPlainText(LoadTrackingTest* test, gconstpointer) assertNormalLoadHappened(test->m_loadEvents); } +static void testLoadBytes(LoadTrackingTest* test, gconstpointer) +{ + GUniquePtr<char> filePath(g_build_filename(Test::getResourcesDir().data(), "blank.ico", nullptr)); + char* contents; + gsize contentsLength; + g_file_get_contents(filePath.get(), &contents, &contentsLength, nullptr); + GRefPtr<GBytes> bytes = adoptGRef(g_bytes_new_take(contents, contentsLength)); + test->loadBytes(bytes.get(), "image/vnd.microsoft.icon", nullptr, nullptr); + test->waitUntilLoadFinished(); + assertNormalLoadHappened(test->m_loadEvents); +} + static void testLoadRequest(LoadTrackingTest* test, gconstpointer) { GRefPtr<WebKitURIRequest> request(webkit_uri_request_new(kServer->getURIForPath("/normal").data())); @@ -97,6 +117,14 @@ static void testLoadRequest(LoadTrackingTest* test, gconstpointer) assertNormalLoadHappened(test->m_loadEvents); } +static void testLoadFromGResource(LoadTrackingTest* test, gconstpointer) +{ + GRefPtr<WebKitURIRequest> request(webkit_uri_request_new("resource:///org/webkit/webkit2gtk/tests/boring.html")); + test->loadRequest(request.get()); + test->waitUntilLoadFinished(); + assertNormalLoadHappened(test->m_loadEvents); +} + class LoadStopTrackingTest : public LoadTrackingTest { public: MAKE_GLIB_TEST_FIXTURE(LoadStopTrackingTest); @@ -182,51 +210,100 @@ public: static void uriChanged(GObject*, GParamSpec*, ViewURITrackingTest* test) { - g_assert_cmpstr(test->m_activeURI.data(), !=, webkit_web_view_get_uri(test->m_webView)); - test->m_activeURI = webkit_web_view_get_uri(test->m_webView); + g_assert_cmpstr(test->m_currentURI.data(), !=, webkit_web_view_get_uri(test->m_webView)); + test->m_currentURI = webkit_web_view_get_uri(test->m_webView); } ViewURITrackingTest() - : m_activeURI(webkit_web_view_get_uri(m_webView)) + : m_currentURI(webkit_web_view_get_uri(m_webView)) { - g_assert(m_activeURI.isNull()); + g_assert(m_currentURI.isNull()); + m_currentURIList.grow(m_currentURIList.capacity()); g_signal_connect(m_webView, "notify::uri", G_CALLBACK(uriChanged), this); } + enum State { Provisional, ProvisionalAfterRedirect, Commited, Finished }; + + void loadURI(const char* uri) + { + reset(); + LoadTrackingTest::loadURI(uri); + } + void provisionalLoadStarted() { - checkActiveURI("/redirect"); + m_currentURIList[Provisional] = m_currentURI; } void provisionalLoadReceivedServerRedirect() { - checkActiveURI("/normal"); + m_currentURIList[ProvisionalAfterRedirect] = m_currentURI; } void loadCommitted() { - checkActiveURI("/normal"); + m_currentURIList[Commited] = m_currentURI; } void loadFinished() { - checkActiveURI("/normal"); + m_currentURIList[Finished] = m_currentURI; LoadTrackingTest::loadFinished(); } - CString m_activeURI; + void checkURIAtState(State state, const char* path) + { + if (path) + ASSERT_CMP_CSTRING(m_currentURIList[state], ==, kServer->getURIForPath(path)); + else + g_assert(m_currentURIList[state].isNull()); + } private: - void checkActiveURI(const char* uri) + void reset() { - ASSERT_CMP_CSTRING(m_activeURI, ==, kServer->getURIForPath(uri)); + m_currentURI = CString(); + m_currentURIList.clear(); + m_currentURIList.grow(m_currentURIList.capacity()); } + + CString m_currentURI; + Vector<CString, 4> m_currentURIList; }; static void testWebViewActiveURI(ViewURITrackingTest* test, gconstpointer) { + // Normal load, the URL doesn't change. + test->loadURI(kServer->getURIForPath("/normal1").data()); + test->waitUntilLoadFinished(); + test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/normal1"); + test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, nullptr); + test->checkURIAtState(ViewURITrackingTest::State::Commited, "/normal1"); + test->checkURIAtState(ViewURITrackingTest::State::Finished, "/normal1"); + + // Redirect, the URL changes after the redirect. test->loadURI(kServer->getURIForPath("/redirect").data()); test->waitUntilLoadFinished(); + test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/redirect"); + test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, "/normal"); + test->checkURIAtState(ViewURITrackingTest::State::Commited, "/normal"); + test->checkURIAtState(ViewURITrackingTest::State::Finished, "/normal"); + + // Normal load, URL changed by WebKitPage::send-request. + test->loadURI(kServer->getURIForPath("/normal-change-request").data()); + test->waitUntilLoadFinished(); + test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/normal-change-request"); + test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, nullptr); + test->checkURIAtState(ViewURITrackingTest::State::Commited, "/request-changed"); + test->checkURIAtState(ViewURITrackingTest::State::Finished, "/request-changed"); + + // Redirect, URL changed by WebKitPage::send-request. + test->loadURI(kServer->getURIForPath("/redirect-to-change-request").data()); + test->waitUntilLoadFinished(); + test->checkURIAtState(ViewURITrackingTest::State::Provisional, "/redirect-to-change-request"); + test->checkURIAtState(ViewURITrackingTest::State::ProvisionalAfterRedirect, "/normal-change-request"); + test->checkURIAtState(ViewURITrackingTest::State::Commited, "/request-changed-on-redirect"); + test->checkURIAtState(ViewURITrackingTest::State::Finished, "/request-changed-on-redirect"); } class ViewIsLoadingTest: public LoadTrackingTest { @@ -303,7 +380,8 @@ public: WebPageURITest() { - GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy("org.webkit.gtk.WebExtensionTest", + GUniquePtr<char> extensionBusName(g_strdup_printf("org.webkit.gtk.WebExtensionTest%u", Test::s_webExtensionID)); + GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy(extensionBusName.get(), "/org/webkit/gtk/WebExtensionTest", "org.webkit.gtk.WebExtensionTest", m_mainLoop)); m_uriChangedSignalID = g_dbus_connection_signal_subscribe( g_dbus_proxy_get_connection(proxy.get()), @@ -327,6 +405,20 @@ public: g_dbus_connection_signal_unsubscribe(bus->connection(), m_uriChangedSignalID); } + void loadURI(const char* uri) + { + m_webPageURIs.clear(); + m_webViewURIs.clear(); + WebViewTest::loadURI(uri); + } + + void checkViewAndPageURIsMatch() const + { + g_assert_cmpint(m_webPageURIs.size(), ==, m_webViewURIs.size()); + for (size_t i = 0; i < m_webPageURIs.size(); ++i) + ASSERT_CMP_CSTRING(m_webPageURIs[i], ==, m_webViewURIs[i]); + } + unsigned m_uriChangedSignalID; Vector<CString> m_webPageURIs; Vector<CString> m_webViewURIs; @@ -334,17 +426,37 @@ public: static void testWebPageURI(WebPageURITest* test, gconstpointer) { - test->loadURI(kServer->getURIForPath("/redirect").data()); + // Normal load. + test->loadURI(kServer->getURIForPath("/normal1").data()); test->waitUntilLoadFinished(); + test->checkViewAndPageURIsMatch(); + g_assert_cmpint(test->m_webPageURIs.size(), ==, 1); + ASSERT_CMP_CSTRING(test->m_webPageURIs[0], ==, kServer->getURIForPath("/normal1")); - g_assert_cmpint(test->m_webPageURIs.size(), ==, test->m_webViewURIs.size()); - for (size_t i = 0; i < test->m_webPageURIs.size(); ++i) - ASSERT_CMP_CSTRING(test->m_webPageURIs[i], ==, test->m_webViewURIs[i]); - + // Redirect + test->loadURI(kServer->getURIForPath("/redirect").data()); + test->waitUntilLoadFinished(); + test->checkViewAndPageURIsMatch(); g_assert_cmpint(test->m_webPageURIs.size(), ==, 2); ASSERT_CMP_CSTRING(test->m_webPageURIs[0], ==, kServer->getURIForPath("/redirect")); ASSERT_CMP_CSTRING(test->m_webPageURIs[1], ==, kServer->getURIForPath("/normal")); + // Normal load, URL changed by WebKitPage::send-request. + test->loadURI(kServer->getURIForPath("/normal-change-request").data()); + test->waitUntilLoadFinished(); + test->checkViewAndPageURIsMatch(); + g_assert_cmpint(test->m_webPageURIs.size(), ==, 2); + ASSERT_CMP_CSTRING(test->m_webPageURIs[0], ==, kServer->getURIForPath("/normal-change-request")); + ASSERT_CMP_CSTRING(test->m_webPageURIs[1], ==, kServer->getURIForPath("/request-changed")); + + // Redirect, URL changed by WebKitPage::send-request. + test->loadURI(kServer->getURIForPath("/redirect-to-change-request").data()); + test->waitUntilLoadFinished(); + test->checkViewAndPageURIsMatch(); + g_assert_cmpint(test->m_webPageURIs.size(), ==, 3); + ASSERT_CMP_CSTRING(test->m_webPageURIs[0], ==, kServer->getURIForPath("/redirect-to-change-request")); + ASSERT_CMP_CSTRING(test->m_webPageURIs[1], ==, kServer->getURIForPath("/normal-change-request")); + ASSERT_CMP_CSTRING(test->m_webPageURIs[2], ==, kServer->getURIForPath("/request-changed-on-redirect")); } static void testURIRequestHTTPHeaders(WebViewTest* test, gconstpointer) @@ -384,6 +496,53 @@ static void testURIRequestHTTPHeaders(WebViewTest* test, gconstpointer) g_assert(!strncmp(mainResourceData, "1", mainResourceDataSize)); } +static void testURIRequestHTTPMethod(WebViewTest* test, gconstpointer) +{ + GRefPtr<WebKitURIRequest> uriRequest = adoptGRef(webkit_uri_request_new("file:///foo/bar")); + g_assert(uriRequest.get()); + g_assert_cmpstr(webkit_uri_request_get_uri(uriRequest.get()), ==, "file:///foo/bar"); + g_assert(!webkit_uri_request_get_http_method(uriRequest.get())); + + webkit_uri_request_set_uri(uriRequest.get(), kServer->getURIForPath("/http-get-method").data()); + test->loadRequest(uriRequest.get()); + test->waitUntilLoadFinished(); + + test->runJavaScriptAndWaitUntilFinished("xhr = new XMLHttpRequest; xhr.open('POST', '/http-post-method', false); xhr.send();", nullptr); +} + +static void testURIResponseHTTPHeaders(WebViewTest* test, gconstpointer) +{ + test->loadHtml("<html><body>No HTTP headers</body></html>", "file:///"); + test->waitUntilLoadFinished(); + WebKitWebResource* resource = webkit_web_view_get_main_resource(test->m_webView); + g_assert(WEBKIT_IS_WEB_RESOURCE(resource)); + WebKitURIResponse* response = webkit_web_resource_get_response(resource); + g_assert(WEBKIT_IS_URI_RESPONSE(response)); + g_assert(!webkit_uri_response_get_http_headers(response)); + + test->loadURI(kServer->getURIForPath("/headers").data()); + test->waitUntilLoadFinished(); + resource = webkit_web_view_get_main_resource(test->m_webView); + g_assert(WEBKIT_IS_WEB_RESOURCE(resource)); + response = webkit_web_resource_get_response(resource); + g_assert(WEBKIT_IS_URI_RESPONSE(response)); + SoupMessageHeaders* headers = webkit_uri_response_get_http_headers(response); + g_assert(headers); + g_assert_cmpstr(soup_message_headers_get_one(headers, "Foo"), ==, "bar"); +} + +static void testRedirectToDataURI(WebViewTest* test, gconstpointer) +{ + test->loadURI(kServer->getURIForPath("/redirect-to-data").data()); + test->waitUntilLoadFinished(); + + static const char* expectedData = "data-uri"; + size_t mainResourceDataSize = 0; + const char* mainResourceData = test->mainResourceData(mainResourceDataSize); + g_assert_cmpint(mainResourceDataSize, ==, strlen(expectedData)); + g_assert(!strncmp(mainResourceData, expectedData, mainResourceDataSize)); +} + static void serverCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer) { static const char* responseString = "<html><body>Testing!Testing!Testing!Testing!Testing!Testing!Testing!" @@ -402,13 +561,16 @@ static void serverCallback(SoupServer* server, SoupMessage* message, const char* soup_message_set_status(message, SOUP_STATUS_OK); - if (g_str_has_prefix(path, "/normal")) + if (g_str_has_prefix(path, "/normal") || g_str_has_prefix(path, "/http-get-method")) soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, responseString, strlen(responseString)); else if (g_str_equal(path, "/error")) soup_message_set_status(message, SOUP_STATUS_CANT_CONNECT); else if (g_str_equal(path, "/redirect")) { soup_message_set_status(message, SOUP_STATUS_MOVED_PERMANENTLY); soup_message_headers_append(message->response_headers, "Location", "/normal"); + } else if (g_str_equal(path, "/redirect-to-change-request")) { + soup_message_set_status(message, SOUP_STATUS_MOVED_PERMANENTLY); + soup_message_headers_append(message->response_headers, "Location", "/normal-change-request"); } else if (g_str_equal(path, "/cancelled")) { soup_message_headers_set_encoding(message->response_headers, SOUP_ENCODING_CHUNKED); soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, responseString, strlen(responseString)); @@ -421,6 +583,12 @@ static void serverCallback(SoupServer* server, SoupMessage* message, const char* else soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, kDNTHeaderNotPresent, strlen(kDNTHeaderNotPresent)); soup_message_set_status(message, SOUP_STATUS_OK); + } else if (g_str_equal(path, "/headers")) { + soup_message_headers_append(message->response_headers, "Foo", "bar"); + soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, responseString, strlen(responseString)); + } else if (g_str_equal(path, "/redirect-to-data")) { + soup_message_set_status(message, SOUP_STATUS_MOVED_PERMANENTLY); + soup_message_headers_append(message->response_headers, "Location", "data:text/plain;charset=utf-8,data-uri"); } else soup_message_set_status(message, SOUP_STATUS_NOT_FOUND); @@ -429,7 +597,6 @@ static void serverCallback(SoupServer* server, SoupMessage* message, const char* void beforeAll() { - webkit_web_context_set_web_extensions_directory(webkit_web_context_get_default(), WEBKIT_TEST_WEB_EXTENSIONS_DIR); bus = new WebKitTestBus(); if (!bus->run()) return; @@ -441,8 +608,11 @@ void beforeAll() LoadTrackingTest::add("WebKitWebView", "loading-error", testLoadingError); LoadTrackingTest::add("WebKitWebView", "load-html", testLoadHtml); LoadTrackingTest::add("WebKitWebView", "load-alternate-html", testLoadAlternateHTML); + LoadTrackingTest::add("WebKitWebView", "load-alternate-html-for-local-page", testLoadAlternateHTMLForLocalPage); LoadTrackingTest::add("WebKitWebView", "load-plain-text", testLoadPlainText); + LoadTrackingTest::add("WebKitWebView", "load-bytes", testLoadBytes); LoadTrackingTest::add("WebKitWebView", "load-request", testLoadRequest); + LoadTrackingTest::add("WebKitWebView", "load-gresource", testLoadFromGResource); LoadStopTrackingTest::add("WebKitWebView", "stop-loading", testLoadCancelled); LoadTrackingTest::add("WebKitWebView", "title", testWebViewTitle); LoadTrackingTest::add("WebKitWebView", "progress", testLoadProgress); @@ -456,6 +626,9 @@ void beforeAll() ViewIsLoadingTest::add("WebKitWebView", "is-loading", testWebViewIsLoading); WebPageURITest::add("WebKitWebPage", "get-uri", testWebPageURI); WebViewTest::add("WebKitURIRequest", "http-headers", testURIRequestHTTPHeaders); + WebViewTest::add("WebKitURIRequest", "http-method", testURIRequestHTTPMethod); + WebViewTest::add("WebKitURIResponse", "http-headers", testURIResponseHTTPHeaders); + WebViewTest::add("WebKitWebPage", "redirect-to-data-uri", testRedirectToDataURI); } void afterAll() |