diff options
Diffstat (limited to 'Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestResources.cpp')
-rw-r--r-- | Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestResources.cpp | 108 |
1 files changed, 98 insertions, 10 deletions
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestResources.cpp b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestResources.cpp index 4d97846a2..1510e5d49 100644 --- a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestResources.cpp +++ b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestResources.cpp @@ -22,7 +22,8 @@ #include "WebKitTestServer.h" #include "WebViewTest.h" #include <wtf/Vector.h> -#include <wtf/gobject/GRefPtr.h> +#include <wtf/glib/GMutexLocker.h> +#include <wtf/glib/GRefPtr.h> static WebKitTestServer* kServer; @@ -189,6 +190,13 @@ public: } else if (uri == kServer->getURIForPath("/javascript.js")) { g_assert_cmpint(m_resourceDataSize, ==, strlen(kJavascript)); g_assert(!strncmp(m_resourceData.get(), kJavascript, m_resourceDataSize)); + } else if (uri == kServer->getURIForPath("/blank.ico")) { + GUniquePtr<char> filePath(g_build_filename(Test::getResourcesDir().data(), "blank.ico", nullptr)); + GUniqueOutPtr<char> contents; + gsize contentsLength; + g_file_get_contents(filePath.get(), &contents.outPtr(), &contentsLength, nullptr); + g_assert_cmpint(m_resourceDataSize, ==, contentsLength); + g_assert(!memcmp(m_resourceData.get(), contents.get(), contentsLength)); } else g_assert_not_reached(); m_resourceData.reset(); @@ -417,7 +425,7 @@ static void testWebResourceMimeType(SingleResourceLoadTest* test, gconstpointer) test->loadURI(kServer->getURIForPath("/image.html").data()); response = test->waitUntilResourceLoadFinishedAndReturnURIResponse(); - g_assert_cmpstr(webkit_uri_response_get_mime_type(response), ==, "image/vnd.microsoft.icon"); + g_assert_cmpstr(webkit_uri_response_get_mime_type(response), ==, "image/x-icon"); test->loadURI(kServer->getURIForPath("/redirected-css.html").data()); response = test->waitUntilResourceLoadFinishedAndReturnURIResponse(); @@ -517,9 +525,7 @@ static void testWebResourceActiveURI(ResourceURITrackingTest* test, gconstpointe static void testWebResourceGetData(ResourcesTest* test, gconstpointer) { test->loadURI(kServer->getURIForPath("/").data()); - // FIXME: this should be 4 instead of 3, but we don't get the css image resource - // due to bug https://bugs.webkit.org/show_bug.cgi?id=78510. - test->waitUntilResourcesLoaded(3); + test->waitUntilResourcesLoaded(4); WebKitWebResource* resource = webkit_web_view_get_main_resource(test->m_webView); g_assert(resource); @@ -667,6 +673,66 @@ static void testWebResourceSendRequest(SendRequestTest* test, gconstpointer) events.clear(); } +static GMutex s_serverMutex; +static const unsigned s_maxConnectionsPerHost = 6; + +class SyncRequestOnMaxConnsTest: public ResourcesTest { +public: + MAKE_GLIB_TEST_FIXTURE(SyncRequestOnMaxConnsTest); + + void resourceLoadStarted(WebKitWebResource*, WebKitURIRequest*) override + { + if (!m_resourcesToStartPending) + return; + + if (!--m_resourcesToStartPending) + g_main_loop_quit(m_mainLoop); + } + + void waitUntilResourcesStarted(unsigned requestCount) + { + m_resourcesToStartPending = requestCount; + g_main_loop_run(m_mainLoop); + } + + unsigned m_resourcesToStartPending; +}; + +static void testWebViewSyncRequestOnMaxConns(SyncRequestOnMaxConnsTest* test, gconstpointer) +{ + WTF::GMutexLocker<GMutex> lock(s_serverMutex); + test->loadURI(kServer->getURIForPath("/sync-request-on-max-conns-0").data()); + test->waitUntilResourcesStarted(s_maxConnectionsPerHost + 1); // s_maxConnectionsPerHost resource + main resource. + + for (unsigned i = 0; i < 2; ++i) { + GUniquePtr<char> xhr(g_strdup_printf("xhr = new XMLHttpRequest; xhr.open('GET', '/sync-request-on-max-conns-xhr%u', false); xhr.send();", i)); + webkit_web_view_run_javascript(test->m_webView, xhr.get(), nullptr, nullptr, nullptr); + } + + // By default sync XHRs have a 10 seconds timeout, we don't want to wait all that so use our own timeout. + guint timeoutSourceID = g_timeout_add(1000, [] (gpointer) -> gboolean { + g_assert_not_reached(); + return G_SOURCE_REMOVE; + }, nullptr); + + struct UnlockServerSourceContext { + WTF::GMutexLocker<GMutex>& lock; + guint unlockServerSourceID; + } context = { + lock, + g_idle_add_full(G_PRIORITY_DEFAULT, [](gpointer userData) -> gboolean { + auto& context = *static_cast<UnlockServerSourceContext*>(userData); + context.unlockServerSourceID = 0; + context.lock.unlock(); + return G_SOURCE_REMOVE; + }, &context, nullptr) + }; + test->waitUntilResourcesLoaded(s_maxConnectionsPerHost + 3); // s_maxConnectionsPerHost resource + main resource + 2 XHR. + g_source_remove(timeoutSourceID); + if (context.unlockServerSourceID) + g_source_remove(context.unlockServerSourceID); +} + static void addCacheHTTPHeadersToResponse(SoupMessage* message) { // The actual date doesn't really matter. @@ -734,7 +800,7 @@ static void serverCallback(SoupServer* server, SoupMessage* message, const char* static const char* javascriptRelativeHTML = "<html><head><script language='javascript' src='/redirected-to-cancel.js'></script></head><body></body></html>"; soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, javascriptRelativeHTML, strlen(javascriptRelativeHTML)); } else if (g_str_equal(path, "/blank.ico")) { - GUniquePtr<char> filePath(g_build_filename(Test::getWebKit1TestResoucesDir().data(), path, NULL)); + GUniquePtr<char> filePath(g_build_filename(Test::getResourcesDir().data(), path, nullptr)); char* contents; gsize contentsLength; g_file_get_contents(filePath.get(), &contents, &contentsLength, 0); @@ -760,18 +826,37 @@ static void serverCallback(SoupServer* server, SoupMessage* message, const char* soup_message_headers_append(message->response_headers, "Location", "/cancel-this.js"); } else if (g_str_equal(path, "/invalid.css")) soup_message_set_status(message, SOUP_STATUS_CANT_CONNECT); - else + else if (g_str_has_prefix(path, "/sync-request-on-max-conns-")) { + char* contents; + gsize contentsLength; + if (g_str_equal(path, "/sync-request-on-max-conns-0")) { + GString* imagesHTML = g_string_new("<html><body>"); + for (unsigned i = 1; i <= s_maxConnectionsPerHost; ++i) + g_string_append_printf(imagesHTML, "<img src='/sync-request-on-max-conns-%u'>", i); + g_string_append(imagesHTML, "</body></html>"); + + contentsLength = imagesHTML->len; + contents = g_string_free(imagesHTML, FALSE); + } else { + { + // We don't actually need to keep the mutex, so we release it as soon as we get it. + WTF::GMutexLocker<GMutex> lock(s_serverMutex); + } + + GUniquePtr<char> filePath(g_build_filename(Test::getResourcesDir().data(), "blank.ico", nullptr)); + g_file_get_contents(filePath.get(), &contents, &contentsLength, 0); + } + soup_message_body_append(message->response_body, SOUP_MEMORY_TAKE, contents, contentsLength); + } else soup_message_set_status(message, SOUP_STATUS_NOT_FOUND); soup_message_body_complete(message->response_body); } void beforeAll() { - kServer = new WebKitTestServer(); + kServer = new WebKitTestServer(WebKitTestServer::ServerOptions::ServerRunInThread); kServer->run(serverCallback); - webkit_web_context_set_web_extensions_directory(webkit_web_context_get_default(), WEBKIT_TEST_WEB_EXTENSIONS_DIR); - ResourcesTest::add("WebKitWebView", "resources", testWebViewResources); SingleResourceLoadTest::add("WebKitWebResource", "loading", testWebResourceLoading); SingleResourceLoadTest::add("WebKitWebResource", "response", testWebResourceResponse); @@ -781,6 +866,9 @@ void beforeAll() ResourcesTest::add("WebKitWebResource", "get-data", testWebResourceGetData); SingleResourceLoadTest::add("WebKitWebView", "history-cache", testWebViewResourcesHistoryCache); SendRequestTest::add("WebKitWebPage", "send-request", testWebResourceSendRequest); +#if SOUP_CHECK_VERSION(2, 49, 91) + SyncRequestOnMaxConnsTest::add("WebKitWebView", "sync-request-on-max-conns", testWebViewSyncRequestOnMaxConns); +#endif } void afterAll() |