2ee67bb5ad094b2fb28b85e759e5245fd6a43b05
[WebKit-https.git] / Tools / WebKitTestRunner / InjectedBundle / TestRunner.h
1 /*
2  * Copyright (C) 2010, 2011, 2012 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 #ifndef TestRunner_h
27 #define TestRunner_h
28
29 #include "JSWrappable.h"
30 #include "StringFunctions.h"
31 #include <JavaScriptCore/JSRetainPtr.h>
32 #include <WebKit/WKBundleScriptWorld.h>
33 #include <WebKit/WKRetainPtr.h>
34 #include <string>
35 #include <wtf/PassRefPtr.h>
36 #include <wtf/text/WTFString.h>
37
38 #if PLATFORM(COCOA)
39 #include <wtf/RetainPtr.h>
40 #include <CoreFoundation/CFRunLoop.h>
41 typedef RetainPtr<CFRunLoopTimerRef> PlatformTimerRef;
42 #elif PLATFORM(GTK)
43 #include <wtf/RunLoop.h>
44 namespace WTR {
45 class TestRunner;
46 typedef RunLoop::Timer<TestRunner> PlatformTimerRef;
47 }
48 #elif PLATFORM(EFL)
49 typedef Ecore_Timer* PlatformTimerRef;
50 #endif
51
52 namespace WTR {
53
54 class TestRunner : public JSWrappable {
55 public:
56     static PassRefPtr<TestRunner> create();
57     virtual ~TestRunner();
58
59     // JSWrappable
60     virtual JSClassRef wrapperClass();
61
62     void makeWindowObject(JSContextRef, JSObjectRef windowObject, JSValueRef* exception);
63
64     // The basics.
65     WKURLRef testURL() const { return m_testURL.get(); }
66     void setTestURL(WKURLRef url) { m_testURL = url; }
67     void dumpAsText(bool dumpPixels);
68     void waitForPolicyDelegate();
69     void dumpChildFramesAsText() { m_whatToDump = AllFramesText; }
70     void waitUntilDone();
71     void notifyDone();
72     double preciseTime();
73
74     // Other dumping.
75     void dumpBackForwardList() { m_shouldDumpBackForwardListsForAllWindows = true; }
76     void dumpChildFrameScrollPositions() { m_shouldDumpAllFrameScrollPositions = true; }
77     void dumpEditingCallbacks() { m_dumpEditingCallbacks = true; }
78     void dumpSelectionRect() { m_dumpSelectionRect = true; }
79     void dumpStatusCallbacks() { m_dumpStatusCallbacks = true; }
80     void dumpTitleChanges() { m_dumpTitleChanges = true; }
81     void dumpFullScreenCallbacks() { m_dumpFullScreenCallbacks = true; }
82     void dumpFrameLoadCallbacks() { setShouldDumpFrameLoadCallbacks(true); }
83     void dumpProgressFinishedCallback() { setShouldDumpProgressFinishedCallback(true); }
84     void dumpResourceLoadCallbacks() { m_dumpResourceLoadCallbacks = true; }
85     void dumpResourceResponseMIMETypes() { m_dumpResourceResponseMIMETypes = true; }
86     void dumpWillCacheResponse() { m_dumpWillCacheResponse = true; }
87     void dumpApplicationCacheDelegateCallbacks() { m_dumpApplicationCacheDelegateCallbacks = true; }
88     void dumpDatabaseCallbacks() { m_dumpDatabaseCallbacks = true; }
89     void dumpDOMAsWebArchive() { m_whatToDump = DOMAsWebArchive; }
90     void dumpPolicyDelegateCallbacks() { m_dumpPolicyCallbacks = true; }
91
92     void setShouldDumpFrameLoadCallbacks(bool value) { m_dumpFrameLoadCallbacks = value; }
93     void setShouldDumpProgressFinishedCallback(bool value) { m_dumpProgressFinishedCallback = value; }
94
95     // Special options.
96     void keepWebHistory();
97     void setAcceptsEditing(bool value) { m_shouldAllowEditing = value; }
98     void setCanOpenWindows(bool);
99     void setCloseRemainingWindowsWhenComplete(bool value) { m_shouldCloseExtraWindows = value; }
100     void setXSSAuditorEnabled(bool);
101     void setShadowDOMEnabled(bool);
102     void setCustomElementsEnabled(bool);
103     void setAllowUniversalAccessFromFileURLs(bool);
104     void setAllowFileAccessFromFileURLs(bool);
105     void setPluginsEnabled(bool);
106     void setJavaScriptCanAccessClipboard(bool);
107     void setPrivateBrowsingEnabled(bool);
108     void setPopupBlockingEnabled(bool);
109     void setAuthorAndUserStylesEnabled(bool);
110     void setCustomPolicyDelegate(bool enabled, bool permissive = false);
111     void addOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains);
112     void removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains);
113     void setUserStyleSheetEnabled(bool);
114     void setUserStyleSheetLocation(JSStringRef);
115     void setSpatialNavigationEnabled(bool);
116     void setTabKeyCyclesThroughElements(bool);
117     void setSerializeHTTPLoads();
118     void dispatchPendingLoadRequests();
119     void setCacheModel(int);
120     void setAsynchronousSpellCheckingEnabled(bool);
121
122     // Special DOM functions.
123     void clearBackForwardList();
124     void execCommand(JSStringRef name, JSStringRef argument);
125     bool isCommandEnabled(JSStringRef name);
126     unsigned windowCount();
127
128     // Repaint testing.
129     void testRepaint() { m_testRepaint = true; }
130     void repaintSweepHorizontally() { m_testRepaintSweepHorizontally = true; }
131     void display();
132     
133     // UserContent testing.
134     void addUserScript(JSStringRef source, bool runAtStart, bool allFrames);
135     void addUserStyleSheet(JSStringRef source, bool allFrames);
136
137     // Text search testing.
138     bool findString(JSStringRef, JSValueRef optionsArray);
139
140     // Local storage
141     void clearAllDatabases();
142     void setDatabaseQuota(uint64_t);
143     JSRetainPtr<JSStringRef> pathToLocalResource(JSStringRef);
144
145     // Application Cache
146     void clearAllApplicationCaches();
147     void clearApplicationCacheForOrigin(JSStringRef origin);
148     void setAppCacheMaximumSize(uint64_t);
149     long long applicationCacheDiskUsageForOrigin(JSStringRef origin);
150     void disallowIncreaseForApplicationCacheQuota();
151     bool shouldDisallowIncreaseForApplicationCacheQuota() { return m_disallowIncreaseForApplicationCacheQuota; }
152     JSValueRef originsWithApplicationCache();
153
154     // Printing
155     bool isPageBoxVisible(int pageIndex);
156     bool isPrinting() { return m_isPrinting; }
157     void setPrinting() { m_isPrinting = true; }
158
159     // Authentication
160     void setHandlesAuthenticationChallenges(bool);
161     void setAuthenticationUsername(JSStringRef);
162     void setAuthenticationPassword(JSStringRef);
163
164     void setValueForUser(JSContextRef, JSValueRef element, JSStringRef value);
165
166     // Audio testing.
167     void setAudioResult(JSContextRef, JSValueRef data);
168
169     void setBlockAllPlugins(bool shouldBlock);
170
171     enum WhatToDump { RenderTree, MainFrameText, AllFramesText, Audio, DOMAsWebArchive };
172     WhatToDump whatToDump() const { return m_whatToDump; }
173
174     bool shouldDumpAllFrameScrollPositions() const { return m_shouldDumpAllFrameScrollPositions; }
175     bool shouldDumpBackForwardListsForAllWindows() const { return m_shouldDumpBackForwardListsForAllWindows; }
176     bool shouldDumpEditingCallbacks() const { return m_dumpEditingCallbacks; }
177     bool shouldDumpMainFrameScrollPosition() const { return m_whatToDump == RenderTree; }
178     bool shouldDumpStatusCallbacks() const { return m_dumpStatusCallbacks; }
179     bool shouldDumpTitleChanges() const { return m_dumpTitleChanges; }
180     bool shouldDumpPixels() const { return m_dumpPixels; }
181     bool shouldDumpFullScreenCallbacks() const { return m_dumpFullScreenCallbacks; }
182     bool shouldDumpFrameLoadCallbacks() const { return m_dumpFrameLoadCallbacks; }
183     bool shouldDumpProgressFinishedCallback() const { return m_dumpProgressFinishedCallback; }
184     bool shouldDumpResourceLoadCallbacks() const { return m_dumpResourceLoadCallbacks; }
185     bool shouldDumpResourceResponseMIMETypes() const { return m_dumpResourceResponseMIMETypes; }
186     bool shouldDumpWillCacheResponse() const { return m_dumpWillCacheResponse; }
187     bool shouldDumpApplicationCacheDelegateCallbacks() const { return m_dumpApplicationCacheDelegateCallbacks; }
188     bool shouldDumpDatabaseCallbacks() const { return m_dumpDatabaseCallbacks; }
189     bool shouldDumpSelectionRect() const { return m_dumpSelectionRect; }
190     bool shouldDumpPolicyCallbacks() const { return m_dumpPolicyCallbacks; }
191
192     bool isPolicyDelegateEnabled() const { return m_policyDelegateEnabled; }
193     bool isPolicyDelegatePermissive() const { return m_policyDelegatePermissive; }
194
195     bool waitToDump() const { return m_waitToDump; }
196     void waitToDumpWatchdogTimerFired();
197     void invalidateWaitToDumpWatchdogTimer();
198
199     bool shouldAllowEditing() const { return m_shouldAllowEditing; }
200
201     bool shouldCloseExtraWindowsAfterRunningTest() const { return m_shouldCloseExtraWindows; }
202
203     void evaluateScriptInIsolatedWorld(JSContextRef, unsigned worldID, JSStringRef script);
204     static unsigned worldIDForWorld(WKBundleScriptWorldRef);
205
206     void showWebInspector();
207     void closeWebInspector();
208     void evaluateInWebInspector(JSStringRef script);
209     JSRetainPtr<JSStringRef> inspectorTestStubURL();
210
211     void setPOSIXLocale(JSStringRef);
212
213     bool willSendRequestReturnsNull() const { return m_willSendRequestReturnsNull; }
214     void setWillSendRequestReturnsNull(bool f) { m_willSendRequestReturnsNull = f; }
215     bool willSendRequestReturnsNullOnRedirect() const { return m_willSendRequestReturnsNullOnRedirect; }
216     void setWillSendRequestReturnsNullOnRedirect(bool f) { m_willSendRequestReturnsNullOnRedirect = f; }
217     void setWillSendRequestAddsHTTPBody(JSStringRef body) { m_willSendRequestHTTPBody = toWTFString(toWK(body)); }
218     String willSendRequestHTTPBody() const { return m_willSendRequestHTTPBody; }
219
220     void setTextDirection(JSStringRef);
221
222     void setShouldStayOnPageAfterHandlingBeforeUnload(bool);
223
224     void setDefersLoading(bool);
225
226     void setStopProvisionalFrameLoads() { m_shouldStopProvisionalFrameLoads = true; }
227     bool shouldStopProvisionalFrameLoads() const { return m_shouldStopProvisionalFrameLoads; }
228     
229     bool globalFlag() const { return m_globalFlag; }
230     void setGlobalFlag(bool value) { m_globalFlag = value; }
231
232     double databaseDefaultQuota() const { return m_databaseDefaultQuota; }
233     void setDatabaseDefaultQuota(double quota) { m_databaseDefaultQuota = quota; }
234
235     double databaseMaxQuota() const { return m_databaseMaxQuota; }
236     void setDatabaseMaxQuota(double quota) { m_databaseMaxQuota = quota; }
237
238     void addChromeInputField(JSValueRef);
239     void removeChromeInputField(JSValueRef);
240     void focusWebView(JSValueRef);
241     void setBackingScaleFactor(double, JSValueRef);
242
243     void setWindowIsKey(bool);
244
245     void callAddChromeInputFieldCallback();
246     void callRemoveChromeInputFieldCallback();
247     void callFocusWebViewCallback();
248     void callSetBackingScaleFactorCallback();
249
250     void overridePreference(JSStringRef preference, JSStringRef value);
251
252     // Cookies testing
253     void setAlwaysAcceptCookies(bool);
254
255     // Custom full screen behavior.
256     void setHasCustomFullScreenBehavior(bool value) { m_customFullScreenBehavior = value; }
257     bool hasCustomFullScreenBehavior() const { return m_customFullScreenBehavior; }
258
259     // Web notifications.
260     void grantWebNotificationPermission(JSStringRef origin);
261     void denyWebNotificationPermission(JSStringRef origin);
262     void removeAllWebNotificationPermissions();
263     void simulateWebNotificationClick(JSValueRef notification);
264
265     // Geolocation.
266     void setGeolocationPermission(bool);
267     void setMockGeolocationPosition(double latitude, double longitude, double accuracy, JSValueRef altitude, JSValueRef altitudeAccuracy, JSValueRef heading, JSValueRef speed);
268     void setMockGeolocationPositionUnavailableError(JSStringRef message);
269     bool isGeolocationProviderActive();
270
271     // MediaStream
272     void setUserMediaPermission(bool);
273     void setUserMediaPermissionForOrigin(bool permission, JSStringRef origin, JSStringRef parentOrigin);
274
275     void setPageVisibility(JSStringRef state);
276     void resetPageVisibility();
277
278     bool callShouldCloseOnWebView();
279
280     void setCustomTimeout(int duration) { m_timeout = duration; }
281
282     // Work queue.
283     void queueBackNavigation(unsigned howFarBackward);
284     void queueForwardNavigation(unsigned howFarForward);
285     void queueLoad(JSStringRef url, JSStringRef target, bool shouldOpenExternalURLs);
286     void queueLoadHTMLString(JSStringRef content, JSStringRef baseURL, JSStringRef unreachableURL);
287     void queueReload();
288     void queueLoadingScript(JSStringRef script);
289     void queueNonLoadingScript(JSStringRef script);
290
291     bool secureEventInputIsEnabled() const;
292     
293     JSValueRef failNextNewCodeBlock();
294     JSValueRef numberOfDFGCompiles(JSValueRef theFunction);
295     JSValueRef neverInlineFunction(JSValueRef theFunction);
296
297     bool shouldDecideNavigationPolicyAfterDelay() const { return m_shouldDecideNavigationPolicyAfterDelay; }
298     void setShouldDecideNavigationPolicyAfterDelay(bool);
299     void setNavigationGesturesEnabled(bool);
300
301     void runUIScript(JSStringRef script, JSValueRef callback);
302     void runUIScriptCallback(unsigned callbackID, JSStringRef result);
303
304     void installDidBeginSwipeCallback(JSValueRef);
305     void installWillEndSwipeCallback(JSValueRef);
306     void installDidEndSwipeCallback(JSValueRef);
307     void installDidRemoveSwipeSnapshotCallback(JSValueRef);
308     void callDidBeginSwipeCallback();
309     void callWillEndSwipeCallback();
310     void callDidEndSwipeCallback();
311     void callDidRemoveSwipeSnapshotCallback();
312
313     void clearTestRunnerCallbacks();
314
315 private:
316     TestRunner();
317
318     void platformInitialize();
319     void initializeWaitToDumpWatchdogTimerIfNeeded();
320
321     WKRetainPtr<WKURLRef> m_testURL; // Set by InjectedBundlePage once provisional load starts.
322
323     WhatToDump m_whatToDump;
324     bool m_shouldDumpAllFrameScrollPositions;
325     bool m_shouldDumpBackForwardListsForAllWindows;
326
327     bool m_shouldAllowEditing;
328     bool m_shouldCloseExtraWindows;
329
330     bool m_dumpEditingCallbacks;
331     bool m_dumpStatusCallbacks;
332     bool m_dumpTitleChanges;
333     bool m_dumpPixels;
334     bool m_dumpSelectionRect;
335     bool m_dumpFullScreenCallbacks;
336     bool m_dumpFrameLoadCallbacks;
337     bool m_dumpProgressFinishedCallback;
338     bool m_dumpResourceLoadCallbacks;
339     bool m_dumpResourceResponseMIMETypes;
340     bool m_dumpWillCacheResponse;
341     bool m_dumpApplicationCacheDelegateCallbacks;
342     bool m_dumpDatabaseCallbacks;
343     bool m_dumpPolicyCallbacks { false };
344     bool m_disallowIncreaseForApplicationCacheQuota;
345     bool m_waitToDump; // True if waitUntilDone() has been called, but notifyDone() has not yet been called.
346     bool m_testRepaint;
347     bool m_testRepaintSweepHorizontally;
348     bool m_isPrinting;
349
350     bool m_willSendRequestReturnsNull;
351     bool m_willSendRequestReturnsNullOnRedirect;
352     bool m_shouldStopProvisionalFrameLoads;
353     String m_willSendRequestHTTPBody;
354
355     bool m_policyDelegateEnabled;
356     bool m_policyDelegatePermissive;
357     
358     bool m_globalFlag;
359     bool m_customFullScreenBehavior;
360
361     int m_timeout;
362
363     double m_databaseDefaultQuota;
364     double m_databaseMaxQuota;
365
366     bool m_shouldDecideNavigationPolicyAfterDelay { false };
367
368     bool m_userStyleSheetEnabled;
369     WKRetainPtr<WKStringRef> m_userStyleSheetLocation;
370
371     WKRetainPtr<WKArrayRef> m_allowedHosts;
372
373     PlatformTimerRef m_waitToDumpWatchdogTimer;
374 };
375
376 } // namespace WTR
377
378 #endif // TestRunner_h