4c670bd53edc9f9277e1b618ebbf285f0161bd5f
[WebKit-https.git] / Tools / TestWebKitAPI / Tests / WebKit / ReloadPageAfterCrash.cpp
1 /*
2  * Copyright (C) 2013 Adenilson Cavalcanti <cavalcantii@gmail.com>
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 "config.h"
27
28 #if WK_HAVE_C_SPI
29
30 #include "PlatformUtilities.h"
31 #include "PlatformWebView.h"
32 #include "Test.h"
33 #include <WebKit/WKPagePrivate.h>
34 #include <WebKit/WKRetainPtr.h>
35 #include <signal.h>
36
37 namespace TestWebKitAPI {
38
39 static bool loadBeforeCrash = false;
40 static bool loadAfterCrash = false;
41 static bool calledCrashHandler = false;
42
43 static void didFinishLoad(WKPageRef page, WKNavigationRef, WKTypeRef userData, const void* clientInfo)
44 {
45     // First load before WebProcess was terminated.
46     if (!loadBeforeCrash) {
47         loadBeforeCrash = true;
48         return;
49     }
50
51     // Next load after WebProcess was terminated (hopefully
52     // it will be correctly re-spawned).
53     EXPECT_EQ(static_cast<uint32_t>(kWKFrameLoadStateFinished), WKFrameGetFrameLoadState(WKPageGetMainFrame(page)));
54     EXPECT_FALSE(loadAfterCrash);
55
56     // Set it, otherwise the loop will not end.
57     loadAfterCrash = true;
58 }
59
60 static void didCrash(WKPageRef page, const void*)
61 {
62     // Test if first load actually worked.
63     EXPECT_TRUE(loadBeforeCrash);
64
65     // Reload should re-spawn webprocess.
66     WKPageReload(page);
67 }
68
69 TEST(WebKit, ReloadPageAfterCrash)
70 {
71     WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreateWithConfiguration(nullptr));
72     PlatformWebView webView(context.get());
73
74     WKPageNavigationClientV0 loaderClient;
75     memset(&loaderClient, 0, sizeof(loaderClient));
76
77     loaderClient.base.version = 0;
78     loaderClient.didFinishNavigation = didFinishLoad;
79     loaderClient.webProcessDidCrash = didCrash;
80
81     WKPageSetPageNavigationClient(webView.page(), &loaderClient.base);
82
83     WKRetainPtr<WKURLRef> url = adoptWK(WKURLCreateWithUTF8CString("about:blank"));
84     // Load a blank page and next kills WebProcess.
85     WKPageLoadURL(webView.page(), url.get());
86     Util::run(&loadBeforeCrash);
87     WKPageTerminate(webView.page());
88
89     // Let's try load a page and see what happens.
90     WKPageLoadURL(webView.page(), url.get());
91     Util::run(&loadAfterCrash);
92 }
93
94 static void nullJavaScriptCallback(WKSerializedScriptValueRef, WKErrorRef, void*)
95 {
96 }
97
98 static void didCrashCheckFrames(WKPageRef page, const void*)
99 {
100     // Test if first load actually worked.
101     EXPECT_TRUE(loadBeforeCrash);
102
103     EXPECT_TRUE(!WKPageGetMainFrame(page));
104     EXPECT_TRUE(!WKPageGetFocusedFrame(page));
105     EXPECT_TRUE(!WKPageGetFrameSetLargestFrame(page));
106
107     calledCrashHandler = true;
108 }
109
110 TEST(WebKit, FocusedFrameAfterCrash)
111 {
112     WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreateWithConfiguration(nullptr));
113     PlatformWebView webView(context.get());
114
115     WKPageNavigationClientV0 loaderClient;
116     memset(&loaderClient, 0, sizeof(loaderClient));
117
118     loaderClient.base.version = 0;
119     loaderClient.didFinishNavigation = didFinishLoad;
120     loaderClient.webProcessDidCrash = didCrashCheckFrames;
121
122     WKPageSetPageNavigationClient(webView.page(), &loaderClient.base);
123
124     WKRetainPtr<WKURLRef> url = adoptWK(Util::createURLForResource("many-iframes", "html"));
125     WKPageLoadURL(webView.page(), url.get());
126     Util::run(&loadBeforeCrash);
127
128     EXPECT_FALSE(!WKPageGetMainFrame(webView.page()));
129
130     WKRetainPtr<WKStringRef> javaScriptString(AdoptWK, WKStringCreateWithUTF8CString("frames[2].focus()"));
131     WKPageRunJavaScriptInMainFrame(webView.page(), javaScriptString.get(), 0, nullJavaScriptCallback);
132
133     while (!WKPageGetFocusedFrame(webView.page()))
134         Util::spinRunLoop(10);
135
136     kill(WKPageGetProcessIdentifier(webView.page()), 9);
137
138     Util::run(&calledCrashHandler);
139 }
140
141 TEST(WebKit, FrameSetLargestFrameAfterCrash)
142 {
143     WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreateWithConfiguration(nullptr));
144     PlatformWebView webView(context.get());
145
146     WKPageNavigationClientV0 loaderClient;
147     memset(&loaderClient, 0, sizeof(loaderClient));
148
149     loaderClient.base.version = 0;
150     loaderClient.didFinishNavigation = didFinishLoad;
151     loaderClient.webProcessDidCrash = didCrashCheckFrames;
152
153     WKPageSetPageNavigationClient(webView.page(), &loaderClient.base);
154
155     WKRetainPtr<WKURLRef> baseURL = adoptWK(WKURLCreateWithUTF8CString("about:blank"));
156     WKRetainPtr<WKStringRef> htmlString = Util::toWK("<frameset cols='25%,*,25%'><frame src='about:blank'><frame src='about:blank'><frame src='about:blank'></frameset>");
157
158     WKPageLoadHTMLString(webView.page(), htmlString.get(), baseURL.get());
159     Util::run(&loadBeforeCrash);
160
161     EXPECT_FALSE(!WKPageGetMainFrame(webView.page()));
162
163     while (!WKPageGetFrameSetLargestFrame(webView.page()))
164         Util::spinRunLoop(10);
165
166     kill(WKPageGetProcessIdentifier(webView.page()), 9);
167
168     Util::run(&calledCrashHandler);
169 }
170
171 } // namespace TestWebKitAPI
172
173 #endif