diff options
Diffstat (limited to 'WebKitTools/WebKitTestRunner')
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); + } } } |