Add tests that require layoutTestController.layerTreeAsText to WebKit2 skipped list
[WebKit.git] / WebKitTools / WebKitTestRunner / InjectedBundle / InjectedBundle.cpp
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "InjectedBundle.h"
27
28 #include "InjectedBundlePage.h"
29 #include <WebKit2/WKBundle.h>
30 #include <WebKit2/WKBundlePage.h>
31 #include <WebKit2/WKRetainPtr.h>
32 #include <WebKit2/WKStringCF.h>
33 #include <WebKit2/WebKit2.h>
34 #include <wtf/RetainPtr.h>
35
36 namespace WTR {
37
38 InjectedBundle& InjectedBundle::shared()
39 {
40     static InjectedBundle& shared = *new InjectedBundle;
41     return shared;
42 }
43
44 InjectedBundle::InjectedBundle()
45     : m_bundle(0)
46 {
47 }
48
49 void InjectedBundle::_didCreatePage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo)
50 {
51     static_cast<InjectedBundle*>(const_cast<void*>(clientInfo))->didCreatePage(page);
52 }
53
54 void InjectedBundle::_willDestroyPage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo)
55 {
56     static_cast<InjectedBundle*>(const_cast<void*>(clientInfo))->willDestroyPage(page);
57 }
58
59 void InjectedBundle::_didRecieveMessage(WKBundleRef bundle, WKStringRef message, const void *clientInfo)
60 {
61     static_cast<InjectedBundle*>(const_cast<void*>(clientInfo))->didRecieveMessage(message);
62 }
63
64 void InjectedBundle::initialize(WKBundleRef bundle)
65 {
66     m_bundle = bundle;
67
68     WKBundleClient client = {
69         0,
70         this,
71         _didCreatePage,
72         _willDestroyPage,
73         _didRecieveMessage
74     };
75     WKBundleSetClient(m_bundle, &client);
76 }
77
78 void InjectedBundle::done()
79 {
80     std::string output = m_outputStream.str();
81     RetainPtr<CFStringRef> outputCFString(AdoptCF, CFStringCreateWithCString(0, output.c_str(), kCFStringEncodingUTF8));
82     WKRetainPtr<WKStringRef> doneMessage(AdoptWK, WKStringCreateWithCFString(outputCFString.get()));
83     WKBundlePostMessage(m_bundle, doneMessage.get());
84 }
85
86 void InjectedBundle::didCreatePage(WKBundlePageRef page)
87 {
88     // FIXME: we really need the main page ref to be sent over from the ui process
89     m_mainPage = new InjectedBundlePage(page);
90     m_pages.add(page, m_mainPage);
91 }
92
93 void InjectedBundle::willDestroyPage(WKBundlePageRef page)
94 {
95     delete m_pages.take(page);
96 }
97
98 void InjectedBundle::didRecieveMessage(WKStringRef message)
99 {
100     CFStringRef cfMessage = WKStringCopyCFString(0, message);
101     if (CFEqual(cfMessage, CFSTR("BeginTest"))) {
102         WKRetainPtr<WKStringRef> ackMessage(AdoptWK, WKStringCreateWithCFString(CFSTR("BeginTestAck")));
103         WKBundlePostMessage(m_bundle, ackMessage.get());
104
105         reset();
106         return;
107     }
108
109     WKRetainPtr<WKStringRef> errorMessage(AdoptWK, WKStringCreateWithCFString(CFSTR("Error: Unknown.")));
110     WKBundlePostMessage(m_bundle, errorMessage.get());
111 }
112
113 void InjectedBundle::reset()
114 {
115     m_outputStream.str("");
116     m_layoutTestController = LayoutTestController::create(std::string(""));
117 }
118
119 } // namespace WTR