blob: c3a14193d1760829e7affc9bd94d1b73a0100105 [file] [log] [blame]
/*
* Copyright (C) 2009, 2010 Gustavo Noronha Silva
* Copyright (C) 2009, 2011 Igalia S.L.
* Portions Copyright (c) 2011 Motorola Mobility, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include "LoadTrackingTest.h"
#include "WebKitTestServer.h"
#include <gtk/gtk.h>
#include <libsoup/soup.h>
#include <wtf/text/CString.h>
static WebKitTestServer* kServer;
static void testLoadingStatus(LoadTrackingTest* test, gconstpointer data)
{
test->setRedirectURI(kServer->getURIForPath("/normal").data());
test->loadURI(kServer->getURIForPath("/redirect").data());
test->waitUntilLoadFinished();
Vector<LoadTrackingTest::LoadEvents>& events = test->m_loadEvents;
g_assert_cmpint(events.size(), ==, 4);
g_assert_cmpint(events[0], ==, LoadTrackingTest::ProvisionalLoadStarted);
g_assert_cmpint(events[1], ==, LoadTrackingTest::ProvisionalLoadReceivedServerRedirect);
g_assert_cmpint(events[2], ==, LoadTrackingTest::LoadCommitted);
g_assert_cmpint(events[3], ==, LoadTrackingTest::LoadFinished);
}
static void testLoadingError(LoadTrackingTest* test, gconstpointer)
{
test->loadURI(kServer->getURIForPath("/error").data());
test->waitUntilLoadFinished();
Vector<LoadTrackingTest::LoadEvents>& events = test->m_loadEvents;
g_assert_cmpint(events.size(), ==, 3);
g_assert_cmpint(events[0], ==, LoadTrackingTest::ProvisionalLoadStarted);
g_assert_cmpint(events[1], ==, LoadTrackingTest::ProvisionalLoadFailed);
g_assert_cmpint(events[2], ==, LoadTrackingTest::LoadFinished);
}
static void assertNormalLoadHappened(Vector<LoadTrackingTest::LoadEvents>& events)
{
g_assert_cmpint(events.size(), ==, 3);
g_assert_cmpint(events[0], ==, LoadTrackingTest::ProvisionalLoadStarted);
g_assert_cmpint(events[1], ==, LoadTrackingTest::LoadCommitted);
g_assert_cmpint(events[2], ==, LoadTrackingTest::LoadFinished);
}
static void testLoadHtml(LoadTrackingTest* test, gconstpointer)
{
test->loadHtml("<html><body>Hello WebKit-GTK+</body></html>", 0);
test->waitUntilLoadFinished();
assertNormalLoadHappened(test->m_loadEvents);
}
static void testLoadAlternateHTML(LoadTrackingTest* test, gconstpointer)
{
test->loadAlternateHTML("<html><body>Alternate page</body></html>", "http://error-page.foo/", 0);
test->waitUntilLoadFinished();
assertNormalLoadHappened(test->m_loadEvents);
}
static void testLoadPlainText(LoadTrackingTest* test, gconstpointer)
{
test->loadPlainText("Hello WebKit-GTK+");
test->waitUntilLoadFinished();
assertNormalLoadHappened(test->m_loadEvents);
}
static void testLoadRequest(LoadTrackingTest* test, gconstpointer)
{
GRefPtr<WebKitURIRequest> request(webkit_uri_request_new(kServer->getURIForPath("/normal").data()));
test->loadRequest(request.get());
test->waitUntilLoadFinished();
assertNormalLoadHappened(test->m_loadEvents);
}
class LoadStopTrackingTest : public LoadTrackingTest {
public:
MAKE_GLIB_TEST_FIXTURE(LoadStopTrackingTest);
virtual void loadCommitted()
{
LoadTrackingTest::loadCommitted();
webkit_web_view_stop_loading(m_webView);
}
virtual void loadFailed(const gchar* failingURI, GError* error)
{
g_assert(g_error_matches(error, WEBKIT_NETWORK_ERROR, WEBKIT_NETWORK_ERROR_CANCELLED));
LoadTrackingTest::loadFailed(failingURI, error);
}
};
static void testLoadCancelled(LoadStopTrackingTest* test, gconstpointer)
{
test->loadURI(kServer->getURIForPath("/cancelled").data());
test->waitUntilLoadFinished();
Vector<LoadTrackingTest::LoadEvents>& events = test->m_loadEvents;
g_assert_cmpint(events.size(), ==, 4);
g_assert_cmpint(events[0], ==, LoadTrackingTest::ProvisionalLoadStarted);
g_assert_cmpint(events[1], ==, LoadTrackingTest::LoadCommitted);
g_assert_cmpint(events[2], ==, LoadTrackingTest::LoadFailed);
g_assert_cmpint(events[3], ==, LoadTrackingTest::LoadFinished);
}
static void testWebViewTitle(LoadTrackingTest* test, gconstpointer)
{
g_assert(!webkit_web_view_get_title(test->m_webView));
test->loadHtml("<html><head><title>Welcome to WebKit-GTK+!</title></head></html>", 0);
test->waitUntilLoadFinished();
g_assert_cmpstr(webkit_web_view_get_title(test->m_webView), ==, "Welcome to WebKit-GTK+!");
}
static void testWebViewReload(LoadTrackingTest* test, gconstpointer)
{
// Check that nothing happens when there's nothing to reload.
test->reload();
test->wait(0.25); // Wait for a quarter of a second.
test->loadURI(kServer->getURIForPath("/normal").data());
test->waitUntilLoadFinished();
assertNormalLoadHappened(test->m_loadEvents);
test->reload();
test->waitUntilLoadFinished();
assertNormalLoadHappened(test->m_loadEvents);
}
static void testLoadProgress(LoadTrackingTest* test, gconstpointer)
{
test->loadURI(kServer->getURIForPath("/normal").data());
test->waitUntilLoadFinished();
g_assert_cmpfloat(test->m_estimatedProgress, ==, 1);
}
static void testWebViewHistoryLoad(LoadTrackingTest* test, gconstpointer)
{
test->loadURI(kServer->getURIForPath("/normal").data());
test->waitUntilLoadFinished();
assertNormalLoadHappened(test->m_loadEvents);
test->loadURI(kServer->getURIForPath("/normal2").data());
test->waitUntilLoadFinished();
assertNormalLoadHappened(test->m_loadEvents);
// Check that load process is the same for pages loaded from history cache.
test->goBack();
test->waitUntilLoadFinished();
assertNormalLoadHappened(test->m_loadEvents);
test->goForward();
test->waitUntilLoadFinished();
assertNormalLoadHappened(test->m_loadEvents);
}
class ViewURITrackingTest: public LoadTrackingTest {
public:
MAKE_GLIB_TEST_FIXTURE(ViewURITrackingTest);
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);
}
ViewURITrackingTest()
: m_activeURI(webkit_web_view_get_uri(m_webView))
{
g_assert(m_activeURI.isNull());
g_signal_connect(m_webView, "notify::uri", G_CALLBACK(uriChanged), this);
}
void provisionalLoadStarted()
{
checkActiveURI("/redirect");
}
void provisionalLoadReceivedServerRedirect()
{
checkActiveURI("/normal");
}
void loadCommitted()
{
checkActiveURI("/normal");
}
void loadFinished()
{
checkActiveURI("/normal");
LoadTrackingTest::loadFinished();
}
CString m_activeURI;
private:
void checkActiveURI(const char* uri)
{
// g_assert_cmpstr is a macro, so we need to cache the temporary string.
CString serverURI = kServer->getURIForPath(uri);
g_assert_cmpstr(m_activeURI.data(), ==, serverURI.data());
}
};
static void testWebViewActiveURI(ViewURITrackingTest* test, gconstpointer)
{
test->loadURI(kServer->getURIForPath("/redirect").data());
test->waitUntilLoadFinished();
}
class ViewIsLoadingTest: public LoadTrackingTest {
public:
MAKE_GLIB_TEST_FIXTURE(ViewIsLoadingTest);
static void isLoadingChanged(GObject*, GParamSpec*, ViewIsLoadingTest* test)
{
if (webkit_web_view_is_loading(test->m_webView))
test->beginLoad();
else
test->endLoad();
}
ViewIsLoadingTest()
{
g_signal_connect(m_webView, "notify::is-loading", G_CALLBACK(isLoadingChanged), this);
}
void beginLoad()
{
// New load, load-started hasn't been emitted yet.
g_assert(m_loadEvents.isEmpty());
g_assert_cmpstr(webkit_web_view_get_uri(m_webView), ==, m_activeURI.data());
}
void endLoad()
{
// Load finish, load-finished and load-failed haven't been emitted yet.
g_assert(!m_loadEvents.isEmpty());
g_assert(!m_loadEvents.contains(LoadTrackingTest::LoadFinished));
g_assert(!m_loadEvents.contains(LoadTrackingTest::LoadFailed));
}
};
static void testWebViewIsLoading(ViewIsLoadingTest* test, gconstpointer)
{
test->loadURI(kServer->getURIForPath("/normal").data());
test->waitUntilLoadFinished();
test->reload();
test->waitUntilLoadFinished();
test->loadURI(kServer->getURIForPath("/error").data());
test->waitUntilLoadFinished();
test->loadURI(kServer->getURIForPath("/normal").data());
test->waitUntilLoadFinished();
test->loadURI(kServer->getURIForPath("/normal2").data());
test->waitUntilLoadFinished();
test->goBack();
test->waitUntilLoadFinished();
test->goForward();
test->waitUntilLoadFinished();
}
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!"
"Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!"
"Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!"
"Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!"
"Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!"
"Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!"
"Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!"
"Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!Testing!</body></html>";
if (message->method != SOUP_METHOD_GET) {
soup_message_set_status(message, SOUP_STATUS_NOT_IMPLEMENTED);
return;
}
soup_message_set_status(message, SOUP_STATUS_OK);
if (g_str_has_prefix(path, "/normal"))
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, "/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));
soup_server_unpause_message(server, message);
return;
}
soup_message_body_complete(message->response_body);
}
void beforeAll()
{
kServer = new WebKitTestServer();
kServer->run(serverCallback);
LoadTrackingTest::add("WebKitWebView", "loading-status", testLoadingStatus);
LoadTrackingTest::add("WebKitWebView", "loading-error", testLoadingError);
LoadTrackingTest::add("WebKitWebView", "load-html", testLoadHtml);
LoadTrackingTest::add("WebKitWebView", "load-alternate-html", testLoadAlternateHTML);
LoadTrackingTest::add("WebKitWebView", "load-plain-text", testLoadPlainText);
LoadTrackingTest::add("WebKitWebView", "load-request", testLoadRequest);
LoadStopTrackingTest::add("WebKitWebView", "stop-loading", testLoadCancelled);
LoadTrackingTest::add("WebKitWebView", "title", testWebViewTitle);
LoadTrackingTest::add("WebKitWebView", "progress", testLoadProgress);
LoadTrackingTest::add("WebKitWebView", "reload", testWebViewReload);
LoadTrackingTest::add("WebKitWebView", "history-load", testWebViewHistoryLoad);
// This test checks that web view notify::uri signal is correctly emitted
// and the uri is already updated when loader client signals are emitted.
ViewURITrackingTest::add("WebKitWebView", "active-uri", testWebViewActiveURI);
ViewIsLoadingTest::add("WebKitWebView", "is-loading", testWebViewIsLoading);
}
void afterAll()
{
delete kServer;
}