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
262bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "config.h"
2706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "TestInvocation.h"
2806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
29ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "PlatformWebView.h"
30dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "StringFunctions.h"
3106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "TestController.h"
32a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <climits>
33a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <cstdio>
3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <WebKit2/WKDictionary.h>
3506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <WebKit2/WKContextPrivate.h>
362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <WebKit2/WKInspector.h>
3706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <WebKit2/WKRetainPtr.h>
38a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <wtf/OwnArrayPtr.h>
39a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <wtf/PassOwnArrayPtr.h>
40a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
41a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if OS(WINDOWS)
42a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <direct.h> // For _getcwd.
43a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define getcwd _getcwd // MSDN says getcwd is deprecated.
44a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define PATH_MAX _MAX_PATH
45a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
4606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
4706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenusing namespace WebKit;
48dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochusing namespace std;
4906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
5006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsennamespace WTR {
5106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
52a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic WKURLRef createWKURL(const char* pathOrURL)
53a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
54a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (strstr(pathOrURL, "http://") || strstr(pathOrURL, "https://") || strstr(pathOrURL, "file://"))
55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return WKURLCreateWithUTF8CString(pathOrURL);
56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
57a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // Creating from filesytem path.
58a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    size_t length = strlen(pathOrURL);
59a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!length)
60a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return 0;
61a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // FIXME: Remove the "localhost/" suffix once <http://webkit.org/b/55683> is fixed.
6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const char* filePrefix = "file://localhost/";
64a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    static const size_t prefixLength = strlen(filePrefix);
65a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if OS(WINDOWS)
66a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    const char separator = '\\';
67a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool isAbsolutePath = length >= 3 && pathOrURL[1] == ':' && pathOrURL[2] == separator;
68a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#else
69a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    const char separator = '/';
70a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool isAbsolutePath = pathOrURL[0] == separator;
71a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
72a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
73a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    OwnArrayPtr<char> buffer;
74a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (isAbsolutePath) {
75a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        buffer = adoptArrayPtr(new char[prefixLength + length + 1]);
76a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        strcpy(buffer.get(), filePrefix);
77a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        strcpy(buffer.get() + prefixLength, pathOrURL);
78a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    } else {
79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        buffer = adoptArrayPtr(new char[prefixLength + PATH_MAX + length + 2]); // 1 for the separator
80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        strcpy(buffer.get(), filePrefix);
81a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!getcwd(buffer.get() + prefixLength, PATH_MAX))
82a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return 0;
83a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        size_t numCharacters = strlen(buffer.get());
84a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        buffer[numCharacters] = separator;
85a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        strcpy(buffer.get() + numCharacters + 1, pathOrURL);
86a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
87a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
88a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return WKURLCreateWithUTF8CString(buffer.get());
89a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
90a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochTestInvocation::TestInvocation(const std::string& pathOrURL)
9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : m_url(AdoptWK, createWKURL(pathOrURL.c_str()))
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_pathOrURL(pathOrURL)
9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_dumpPixels(false)
95ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    , m_gotInitialResponse(false)
96ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    , m_gotFinalMessage(false)
9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_gotRepaint(false)
98ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    , m_error(false)
9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenTestInvocation::~TestInvocation()
10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid TestInvocation::setIsPixelTest(const std::string& expectedPixelHash)
10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_dumpPixels = true;
10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_expectedPixelHash = expectedPixelHash;
110e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
111e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
112e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkestatic const unsigned w3cSVGWidth = 480;
113e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkestatic const unsigned w3cSVGHeight = 360;
114e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkestatic const unsigned normalWidth = 800;
115e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkestatic const unsigned normalHeight = 600;
116e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void sizeWebViewForCurrentTest(const char* pathOrURL)
118e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
119f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    bool isSVGW3CTest = strstr(pathOrURL, "svg/W3C-SVG-1.1") || strstr(pathOrURL, "svg\\W3C-SVG-1.1");
120e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
121e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (isSVGW3CTest)
122e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        TestController::shared().mainWebView()->resizeTo(w3cSVGWidth, w3cSVGHeight);
123e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    else
124e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        TestController::shared().mainWebView()->resizeTo(normalWidth, normalHeight);
12506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
12606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic bool shouldOpenWebInspector(const char* pathOrURL)
1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
12981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return strstr(pathOrURL, "inspector/") || strstr(pathOrURL, "inspector\\");
1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid TestInvocation::invoke()
13306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
13481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    sizeWebViewForCurrentTest(m_pathOrURL.c_str());
135967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
1362bde8e466a4451c7319e3a072d118917957d6554Steve Block    WKRetainPtr<WKStringRef> messageName = adoptWK(WKStringCreateWithUTF8CString("BeginTest"));
1372bde8e466a4451c7319e3a072d118917957d6554Steve Block    WKRetainPtr<WKBooleanRef> dumpPixels = adoptWK(WKBooleanCreate(m_dumpPixels));
1382bde8e466a4451c7319e3a072d118917957d6554Steve Block    WKContextPostMessageToInjectedBundle(TestController::shared().context(), messageName.get(), dumpPixels.get());
13906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
14028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    TestController::shared().runUntil(m_gotInitialResponse, TestController::ShortTimeout);
14128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!m_gotInitialResponse) {
14228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        dump("Timed out waiting for initial response from web process\n");
14328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return;
14428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    }
145ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_error) {
146ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        dump("FAIL\n");
14706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
148ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
14906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
15081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (shouldOpenWebInspector(m_pathOrURL.c_str()))
1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        WKInspectorShow(WKPageGetInspector(TestController::shared().mainWebView()->page()));
1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
153ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    WKPageLoadURL(TestController::shared().mainWebView()->page(), m_url.get());
154ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
15528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    TestController::shared().runUntil(m_gotFinalMessage, TestController::LongTimeout);
1562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_gotFinalMessage)
15728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        dump("Timed out waiting for final message from web process\n");
1582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if (m_error)
159ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        dump("FAIL\n");
1602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WKInspectorClose(WKPageGetInspector(TestController::shared().mainWebView()->page()));
16206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
16306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
16406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid TestInvocation::dump(const char* stringToDump)
16506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
16606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    printf("Content-Type: text/plain\n");
16706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    printf("%s", stringToDump);
16806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
169ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    fputs("#EOF\n", stdout);
170ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    fputs("#EOF\n", stderr);
1712bde8e466a4451c7319e3a072d118917957d6554Steve Block    fflush(stdout);
1722bde8e466a4451c7319e3a072d118917957d6554Steve Block    fflush(stderr);
17306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
17406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
175db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid TestInvocation::didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody)
17606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
177a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (WKStringIsEqualToUTF8CString(messageName, "Error")) {
178ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        // Set all states to true to stop spinning the runloop.
179ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        m_gotInitialResponse = true;
180ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        m_gotFinalMessage = true;
181ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        m_error = true;
1826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        TestController::shared().notifyDone();
183ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return;
184ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
18506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
186a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (WKStringIsEqualToUTF8CString(messageName, "Ack")) {
187db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        ASSERT(WKGetTypeID(messageBody) == WKStringGetTypeID());
188a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        WKStringRef messageBodyString = static_cast<WKStringRef>(messageBody);
189a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (WKStringIsEqualToUTF8CString(messageBodyString, "BeginTest")) {
190db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            m_gotInitialResponse = true;
1916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            TestController::shared().notifyDone();
192db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return;
193db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
194db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
195db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        ASSERT_NOT_REACHED();
196ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
19706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
198a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (WKStringIsEqualToUTF8CString(messageName, "Done")) {
19981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ASSERT(WKGetTypeID(messageBody) == WKDictionaryGetTypeID());
20081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody);
20181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
20281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        WKRetainPtr<WKStringRef> textOutputKey(AdoptWK, WKStringCreateWithUTF8CString("TextOutput"));
20381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        WKStringRef textOutput = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, textOutputKey.get()));
20481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2052bde8e466a4451c7319e3a072d118917957d6554Steve Block        WKRetainPtr<WKStringRef> pixelResultKey = adoptWK(WKStringCreateWithUTF8CString("PixelResult"));
2062bde8e466a4451c7319e3a072d118917957d6554Steve Block        WKImageRef pixelResult = static_cast<WKImageRef>(WKDictionaryGetItemForKey(messageBodyDictionary, pixelResultKey.get()));
2072bde8e466a4451c7319e3a072d118917957d6554Steve Block        ASSERT(!pixelResult || m_dumpPixels);
20881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
20981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Dump text.
21081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        dump(toSTD(textOutput).c_str());
211dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
21281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Dump pixels (if necessary).
2132bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (m_dumpPixels && pixelResult)
2142bde8e466a4451c7319e3a072d118917957d6554Steve Block            dumpPixelsAndCompareWithExpected(pixelResult);
215dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
21681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        fputs("#EOF\n", stdout);
21781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        fflush(stdout);
21881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        fflush(stderr);
21981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
220db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        m_gotFinalMessage = true;
2216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        TestController::shared().notifyDone();
222db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        return;
223db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    }
22406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
225db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    ASSERT_NOT_REACHED();
22606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
22706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
228e14391e94c850b8bd03680c23b38978db68687a8John ReckWKRetainPtr<WKTypeRef> TestInvocation::didReceiveSynchronousMessageFromInjectedBundle(WKStringRef /*messageName*/, WKTypeRef /*messageBody*/)
229e14391e94c850b8bd03680c23b38978db68687a8John Reck{
230e14391e94c850b8bd03680c23b38978db68687a8John Reck    ASSERT_NOT_REACHED();
231e14391e94c850b8bd03680c23b38978db68687a8John Reck    return 0;
232e14391e94c850b8bd03680c23b38978db68687a8John Reck}
233e14391e94c850b8bd03680c23b38978db68687a8John Reck
23406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} // namespace WTR
235