106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen/*
206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2010 Apple Inc. All rights reserved.
306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *
406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Redistribution and use in source and binary forms, with or without
506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * modification, are permitted provided that the following conditions
606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * are met:
706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 1. Redistributions of source code must retain the above copyright
806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    notice, this list of conditions and the following disclaimer.
906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright
1006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    notice, this list of conditions and the following disclaimer in the
1106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    documentation and/or other materials provided with the distribution.
1206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *
1306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THE POSSIBILITY OF SUCH DAMAGE.
2406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen */
2506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#ifndef TestController_h
2706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define TestController_h
2806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <WebKit2/WKRetainPtr.h>
3006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <string>
3106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <vector>
32ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include <wtf/OwnPtr.h>
3306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
3406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsennamespace WTR {
3506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
36ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass TestInvocation;
37ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass PlatformWebView;
38ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
39db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block// FIXME: Rename this TestRunner?
4006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenclass TestController {
4106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenpublic:
4206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static TestController& shared();
4306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
44db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    TestController(int argc, const char* argv[]);
45db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    ~TestController();
4606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
4706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool verbose() const { return m_verbose; }
4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
4906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    WKStringRef injectedBundlePath() { return m_injectedBundlePath.get(); }
50db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    WKStringRef testPluginDirectory() { return m_testPluginDirectory.get(); }
5106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
52db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    PlatformWebView* mainWebView() { return m_mainWebView.get(); }
53ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    WKContextRef context() { return m_context.get(); }
54ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
5528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // Runs the run loop until `done` is true or the timeout elapses.
5628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    enum TimeoutDuration { ShortTimeout, LongTimeout };
5728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void runUntil(bool& done, TimeoutDuration);
586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    void notifyDone();
59f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
6006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenprivate:
61db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    void initialize(int argc, const char* argv[]);
62db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    void run();
6306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void runTestingServerLoop();
6528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool runTest(const char* pathOrURL);
66967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
67967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    void platformInitialize();
68f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    void platformInitializeContext();
6928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void platformRunUntil(bool& done, double timeout);
7006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void initializeInjectedBundlePath();
71db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    void initializeTestPluginDirectory();
7206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
7328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool resetStateToConsistentValues();
74f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
75ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // WKContextInjectedBundleClient
76e14391e94c850b8bd03680c23b38978db68687a8John Reck    static void didReceiveMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, const void*);
77e14391e94c850b8bd03680c23b38978db68687a8John Reck    static void didReceiveSynchronousMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, WKTypeRef* returnData, const void*);
78db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    void didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
79e14391e94c850b8bd03680c23b38978db68687a8John Reck    WKRetainPtr<WKTypeRef> didReceiveSynchronousMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
80ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
81f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // WKPageLoaderClient
8268513a70bcd92384395513322f1b801e7bf9c729Steve Block    static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void*);
83f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame);
84f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static void processDidCrash(WKPageRef, const void* clientInfo);
8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void processDidCrash();
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
88ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    static WKPageRef createOtherPage(WKPageRef oldPage, WKDictionaryRef, WKEventModifiers, WKEventMouseButton, const void*);
89ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
90ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    static void runModal(WKPageRef, const void* clientInfo);
91ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    static void runModal(PlatformWebView*);
92f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const char* libraryPathForTesting();
942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const char* platformLibraryPathForTesting();
952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
96ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    OwnPtr<TestInvocation> m_currentInvocation;
97ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool m_dumpPixels;
9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool m_verbose;
10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool m_printSeparators;
10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool m_usingServerMode;
10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    std::vector<std::string> m_paths;
10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    WKRetainPtr<WKStringRef> m_injectedBundlePath;
104db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    WKRetainPtr<WKStringRef> m_testPluginDirectory;
105ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
106db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    OwnPtr<PlatformWebView> m_mainWebView;
107ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    WKRetainPtr<WKContextRef> m_context;
108f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WKRetainPtr<WKPageGroupRef> m_pageGroup;
109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
110f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    enum State {
111f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        Initial,
112f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        Resetting,
113f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        RunningTest
114f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    };
115f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    State m_state;
116f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    bool m_doneResetting;
11728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
11828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    double m_longTimeout;
11928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    double m_shortTimeout;
12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool m_didPrintWebProcessCrashedMessage;
12281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool m_shouldExitWhenWebProcessCrashes;
12306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
12406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
12506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} // namespace WTR
12606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
12706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif // TestController_h
128