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