summaryrefslogtreecommitdiffstats
path: root/WebKitTools/WebKitTestRunner
diff options
context:
space:
mode:
Diffstat (limited to 'WebKitTools/WebKitTestRunner')
-rw-r--r--WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/LayoutTestController.idl2
-rw-r--r--WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundleMain.cpp2
-rw-r--r--WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp12
-rw-r--r--WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.h4
-rw-r--r--WebKitTools/WebKitTestRunner/TestController.cpp37
-rw-r--r--WebKitTools/WebKitTestRunner/TestController.h13
-rw-r--r--WebKitTools/WebKitTestRunner/TestInvocation.cpp12
-rw-r--r--WebKitTools/WebKitTestRunner/mac/TestControllerMac.mm7
-rw-r--r--WebKitTools/WebKitTestRunner/qt/TestControllerQt.cpp5
-rw-r--r--WebKitTools/WebKitTestRunner/win/TestControllerWin.cpp22
10 files changed, 90 insertions, 26 deletions
diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/LayoutTestController.idl b/WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/LayoutTestController.idl
index a0e36ad..583eb0a 100644
--- a/WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/LayoutTestController.idl
+++ b/WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/LayoutTestController.idl
@@ -64,6 +64,8 @@ module WTR {
// Animation testing.
int numberOfActiveAnimations();
boolean pauseAnimationAtTimeOnElementWithId(in DOMString animationName, in double time, in DOMString elementId);
+ void suspendAnimations();
+ void resumeAnimations();
// UserContent testing.
void addUserScript(in DOMString source, in boolean runAtStart, in boolean allFrames);
diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundleMain.cpp b/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundleMain.cpp
index b1bc89d..c4cf892 100644
--- a/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundleMain.cpp
+++ b/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundleMain.cpp
@@ -31,7 +31,7 @@ extern "C" __declspec(dllexport)
#else
extern "C"
#endif
-void WKBundleInitialize(WKBundleRef bundle)
+void WKBundleInitialize(WKBundleRef bundle, WKTypeRef initializationUserData)
{
WTR::InjectedBundle::shared().initialize(bundle);
}
diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp b/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp
index e828c46..de37383 100644
--- a/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp
+++ b/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp
@@ -150,6 +150,18 @@ bool LayoutTestController::pauseAnimationAtTimeOnElementWithId(JSStringRef anima
return WKBundleFramePauseAnimationOnElementWithId(mainFrame, toWK(animationName).get(), toWK(elementId).get(), time);
}
+void LayoutTestController::suspendAnimations()
+{
+ WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
+ WKBundleFrameSuspendAnimations(mainFrame);
+}
+
+void LayoutTestController::resumeAnimations()
+{
+ WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
+ WKBundleFrameResumeAnimations(mainFrame);
+}
+
JSRetainPtr<JSStringRef> LayoutTestController::layerTreeAsText() const
{
WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::shared().page()->page());
diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.h b/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.h
index dfafb55..427d05e 100644
--- a/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.h
+++ b/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.h
@@ -91,7 +91,9 @@ public:
// Animation testing.
unsigned numberOfActiveAnimations() const;
bool pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId);
-
+ void suspendAnimations();
+ void resumeAnimations();
+
// Compositing testing.
JSRetainPtr<JSStringRef> layerTreeAsText() const;
diff --git a/WebKitTools/WebKitTestRunner/TestController.cpp b/WebKitTools/WebKitTestRunner/TestController.cpp
index c88062a..8ca0529 100644
--- a/WebKitTools/WebKitTestRunner/TestController.cpp
+++ b/WebKitTools/WebKitTestRunner/TestController.cpp
@@ -35,6 +35,9 @@
namespace WTR {
+static const double defaultLongTimeout = 30;
+static const double defaultShortTimeout = 5;
+
static WKURLRef blankURL()
{
static WKURLRef staticBlankURL = WKURLCreateWithUTF8CString("about:blank");
@@ -56,6 +59,8 @@ TestController::TestController(int argc, const char* argv[])
, m_usingServerMode(false)
, m_state(Initial)
, m_doneResetting(false)
+ , m_longTimeout(defaultLongTimeout)
+ , m_shortTimeout(defaultShortTimeout)
{
initialize(argc, argv);
controller = this;
@@ -146,6 +151,12 @@ void TestController::initialize(int argc, const char* argv[])
for (int i = 1; i < argc; ++i) {
std::string argument(argv[i]);
+ if (argument == "--timeout" && i + 1 < argc) {
+ m_longTimeout = atoi(argv[++i]);
+ // Scale up the short timeout to match.
+ m_shortTimeout = defaultShortTimeout * m_longTimeout / defaultLongTimeout;
+ continue;
+ }
if (argument == "--pixel-tests") {
m_dumpPixels = true;
continue;
@@ -253,7 +264,7 @@ void TestController::initialize(int argc, const char* argv[])
WKPageSetPageLoaderClient(m_mainWebView->page(), &pageLoaderClient);
}
-void TestController::resetStateToConsistentValues()
+bool TestController::resetStateToConsistentValues()
{
m_state = Resetting;
@@ -285,17 +296,21 @@ void TestController::resetStateToConsistentValues()
m_doneResetting = false;
WKPageLoadURL(m_mainWebView->page(), blankURL());
- TestController::runUntil(m_doneResetting);
+ runUntil(m_doneResetting, ShortTimeout);
+ return m_doneResetting;
}
-void TestController::runTest(const char* test)
+bool TestController::runTest(const char* test)
{
- resetStateToConsistentValues();
+ if (!resetStateToConsistentValues())
+ return false;
m_state = RunningTest;
m_currentInvocation.set(new TestInvocation(test));
m_currentInvocation->invoke();
m_currentInvocation.clear();
+
+ return true;
}
void TestController::runTestingServerLoop()
@@ -309,7 +324,8 @@ void TestController::runTestingServerLoop()
if (strlen(filenameBuffer) == 0)
continue;
- runTest(filenameBuffer);
+ if (!runTest(filenameBuffer))
+ break;
}
}
@@ -318,11 +334,18 @@ void TestController::run()
if (m_usingServerMode)
runTestingServerLoop();
else {
- for (size_t i = 0; i < m_paths.size(); ++i)
- runTest(m_paths[i].c_str());
+ for (size_t i = 0; i < m_paths.size(); ++i) {
+ if (!runTest(m_paths[i].c_str()))
+ break;
+ }
}
}
+void TestController::runUntil(bool& done, TimeoutDuration timeoutDuration)
+{
+ platformRunUntil(done, timeoutDuration == ShortTimeout ? m_shortTimeout : m_longTimeout);
+}
+
// WKContextInjectedBundleClient
void TestController::didReceiveMessageFromInjectedBundle(WKContextRef context, WKStringRef messageName, WKTypeRef messageBody, const void* clientInfo)
diff --git a/WebKitTools/WebKitTestRunner/TestController.h b/WebKitTools/WebKitTestRunner/TestController.h
index b12f1b2..1396c94 100644
--- a/WebKitTools/WebKitTestRunner/TestController.h
+++ b/WebKitTools/WebKitTestRunner/TestController.h
@@ -53,22 +53,24 @@ public:
WKPageNamespaceRef pageNamespace() { return m_pageNamespace.get(); }
WKContextRef context() { return m_context.get(); }
- // Helper
- static void runUntil(bool& done);
+ // Runs the run loop until `done` is true or the timeout elapses.
+ enum TimeoutDuration { ShortTimeout, LongTimeout };
+ void runUntil(bool& done, TimeoutDuration);
private:
void initialize(int argc, const char* argv[]);
void run();
void runTestingServerLoop();
- void runTest(const char* pathOrURL);
+ bool runTest(const char* pathOrURL);
void platformInitialize();
void platformInitializeContext();
+ void platformRunUntil(bool& done, double timeout);
void initializeInjectedBundlePath();
void initializeTestPluginDirectory();
- void resetStateToConsistentValues();
+ bool resetStateToConsistentValues();
// WKContextInjectedBundleClient
static void didReceiveMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, const void*);
@@ -102,6 +104,9 @@ private:
};
State m_state;
bool m_doneResetting;
+
+ double m_longTimeout;
+ double m_shortTimeout;
};
} // namespace WTR
diff --git a/WebKitTools/WebKitTestRunner/TestInvocation.cpp b/WebKitTools/WebKitTestRunner/TestInvocation.cpp
index 04a56f1..e88de53 100644
--- a/WebKitTools/WebKitTestRunner/TestInvocation.cpp
+++ b/WebKitTools/WebKitTestRunner/TestInvocation.cpp
@@ -120,7 +120,11 @@ void TestInvocation::invoke()
WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("BeginTest"));
WKContextPostMessageToInjectedBundle(TestController::shared().context(), messageName.get(), 0);
- TestController::runUntil(m_gotInitialResponse);
+ TestController::shared().runUntil(m_gotInitialResponse, TestController::ShortTimeout);
+ if (!m_gotInitialResponse) {
+ dump("Timed out waiting for initial response from web process\n");
+ return;
+ }
if (m_error) {
dump("FAIL\n");
return;
@@ -128,7 +132,11 @@ void TestInvocation::invoke()
WKPageLoadURL(TestController::shared().mainWebView()->page(), m_url.get());
- TestController::runUntil(m_gotFinalMessage);
+ TestController::shared().runUntil(m_gotFinalMessage, TestController::LongTimeout);
+ if (!m_gotFinalMessage) {
+ dump("Timed out waiting for final message from web process\n");
+ return;
+ }
if (m_error) {
dump("FAIL\n");
return;
diff --git a/WebKitTools/WebKitTestRunner/mac/TestControllerMac.mm b/WebKitTools/WebKitTestRunner/mac/TestControllerMac.mm
index be9aa33..268f718 100644
--- a/WebKitTools/WebKitTestRunner/mac/TestControllerMac.mm
+++ b/WebKitTools/WebKitTestRunner/mac/TestControllerMac.mm
@@ -45,10 +45,11 @@ void TestController::initializeTestPluginDirectory()
m_testPluginDirectory.adopt(WKStringCreateWithCFString((CFStringRef)[[NSBundle mainBundle] bundlePath]));
}
-void TestController::runUntil(bool& done)
+void TestController::platformRunUntil(bool& done, double timeout)
{
- while (!done)
- [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
+ CFAbsoluteTime end = CFAbsoluteTimeGetCurrent() + timeout;
+ while (!done && CFAbsoluteTimeGetCurrent() < end)
+ [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
}
void TestController::platformInitializeContext()
diff --git a/WebKitTools/WebKitTestRunner/qt/TestControllerQt.cpp b/WebKitTools/WebKitTestRunner/qt/TestControllerQt.cpp
index d3aee4a..d4de1ba 100644
--- a/WebKitTools/WebKitTestRunner/qt/TestControllerQt.cpp
+++ b/WebKitTools/WebKitTestRunner/qt/TestControllerQt.cpp
@@ -83,8 +83,9 @@ void TestController::platformInitialize()
{
}
-void TestController::runUntil(bool& done)
+void TestController::platformRunUntil(bool& done, double)
{
+ // FIXME: Honor the timeout parameter <http://webkit.org/b/48941>.
RunUntilConditionLoop::start(done);
ASSERT(done);
}
@@ -93,7 +94,7 @@ static bool isExistingLibrary(const QString& path)
{
#if OS(WINDOWS) || OS(SYMBIAN)
const char* librarySuffixes[] = { ".dll" };
-#elif PLATFORM(MAC)
+#elif OS(MAC_OS_X)
const char* librarySuffixes[] = { ".bundle", ".dylib", ".so" };
#elif OS(UNIX)
const char* librarySuffixes[] = { ".so" };
diff --git a/WebKitTools/WebKitTestRunner/win/TestControllerWin.cpp b/WebKitTools/WebKitTestRunner/win/TestControllerWin.cpp
index 9643c40..3fd853f 100644
--- a/WebKitTools/WebKitTestRunner/win/TestControllerWin.cpp
+++ b/WebKitTools/WebKitTestRunner/win/TestControllerWin.cpp
@@ -120,15 +120,25 @@ void TestController::initializeTestPluginDirectory()
m_testPluginDirectory.adopt(WKStringCreateWithCFString(testPluginDirectoryPath.get()));
}
-void TestController::runUntil(bool& done)
+void TestController::platformRunUntil(bool& done, double timeout)
{
+ DWORD end = ::GetTickCount() + timeout * 1000;
while (!done) {
- MSG msg;
- BOOL result = GetMessage(&msg, 0, 0, 0);
- if (result == -1)
+ DWORD now = ::GetTickCount();
+ if (now > end)
+ return;
+
+ DWORD result = ::MsgWaitForMultipleObjectsEx(0, 0, end - now, QS_ALLINPUT, 0);
+ if (result == WAIT_TIMEOUT)
return;
- TranslateMessage(&msg);
- DispatchMessage(&msg);
+
+ ASSERT(result == WAIT_OBJECT_0);
+ // There are messages in the queue. Process them.
+ MSG msg;
+ while (::PeekMessageW(&msg, 0, 0, 0, PM_REMOVE)) {
+ ::TranslateMessage(&msg);
+ ::DispatchMessageW(&msg);
+ }
}
}