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