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