1/*
2 * Copyright (C) 2007, 2008, 2009 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 *
8 * 1.  Redistributions of source code must retain the above copyright
9 *     notice, this list of conditions and the following disclaimer.
10 * 2.  Redistributions in binary form must reproduce the above copyright
11 *     notice, this list of conditions and the following disclaimer in the
12 *     documentation and/or other materials provided with the distribution.
13 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 *     its contributors may be used to endorse or promote products derived
15 *     from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef LayoutTestController_h
30#define LayoutTestController_h
31
32#include <JavaScriptCore/JSObjectRef.h>
33#include <JavaScriptCore/JSRetainPtr.h>
34#include <map>
35#include <set>
36#include <string>
37#include <vector>
38#include <wtf/PassRefPtr.h>
39#include <wtf/RefCounted.h>
40
41class LayoutTestController : public RefCounted<LayoutTestController> {
42public:
43    static PassRefPtr<LayoutTestController> create(const std::string& testPathOrURL, const std::string& expectedPixelHash);
44    ~LayoutTestController();
45
46    void makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception);
47
48    void addDisallowedURL(JSStringRef url);
49    void addURLToRedirect(std::string origin, std::string destination);
50    const std::string& redirectionDestinationForURL(std::string);
51    void clearAllApplicationCaches();
52    void clearAllDatabases();
53    void clearApplicationCacheForOrigin(JSStringRef name);
54    void clearBackForwardList();
55    void clearPersistentUserStyleSheet();
56    bool callShouldCloseOnWebView();
57    JSStringRef copyDecodedHostName(JSStringRef name);
58    JSStringRef copyEncodedHostName(JSStringRef name);
59    JSRetainPtr<JSStringRef> counterValueForElementById(JSStringRef id);
60    void disableImageLoading();
61    void dispatchPendingLoadRequests();
62    void display();
63    void displayInvalidatedRegion();
64    void execCommand(JSStringRef name, JSStringRef value);
65    bool findString(JSContextRef, JSStringRef, JSObjectRef optionsArray);
66    JSValueRef originsWithApplicationCache(JSContextRef);
67    bool isCommandEnabled(JSStringRef name);
68    void keepWebHistory();
69    JSValueRef computedStyleIncludingVisitedInfo(JSContextRef, JSValueRef);
70    JSValueRef nodesFromRect(JSContextRef, JSValueRef, int x, int y, unsigned top, unsigned right, unsigned bottom, unsigned left, bool ignoreClipping);
71    void notifyDone();
72    int numberOfPages(float pageWidthInPixels, float pageHeightInPixels);
73    int numberOfPendingGeolocationPermissionRequests();
74    void overridePreference(JSStringRef key, JSStringRef value);
75    int pageNumberForElementById(JSStringRef id, float pageWidthInPixels, float pageHeightInPixels);
76    JSRetainPtr<JSStringRef> pageProperty(const char* propertyName, int pageNumber) const;
77    JSRetainPtr<JSStringRef> pageSizeAndMarginsInPixels(int pageNumber, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft) const;
78    bool isPageBoxVisible(int pageNumber) const;
79    JSStringRef pathToLocalResource(JSContextRef, JSStringRef url);
80    void queueBackNavigation(int howFarBackward);
81    void queueForwardNavigation(int howFarForward);
82    void queueLoad(JSStringRef url, JSStringRef target);
83    void queueLoadHTMLString(JSStringRef content, JSStringRef baseURL);
84    void queueLoadAlternateHTMLString(JSStringRef content, JSStringRef baseURL, JSStringRef unreachableURL);
85    void queueLoadingScript(JSStringRef script);
86    void queueNonLoadingScript(JSStringRef script);
87    void queueReload();
88    void removeAllVisitedLinks();
89    void setAcceptsEditing(bool acceptsEditing);
90    void setAllowUniversalAccessFromFileURLs(bool);
91    void setAllowFileAccessFromFileURLs(bool);
92    void setAppCacheMaximumSize(unsigned long long quota);
93    void setApplicationCacheOriginQuota(unsigned long long quota);
94    void setAuthorAndUserStylesEnabled(bool);
95    void setAutofilled(JSContextRef, JSValueRef nodeObject, bool autofilled);
96    void setCacheModel(int);
97    void setCustomPolicyDelegate(bool setDelegate, bool permissive);
98    void setDatabaseQuota(unsigned long long quota);
99    void setDomainRelaxationForbiddenForURLScheme(bool forbidden, JSStringRef scheme);
100    void setIconDatabaseEnabled(bool iconDatabaseEnabled);
101    void setJavaScriptProfilingEnabled(bool profilingEnabled);
102    void setJavaScriptCanAccessClipboard(bool flag);
103    void setMainFrameIsFirstResponder(bool flag);
104    void setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma);
105    void setMockGeolocationError(int code, JSStringRef message);
106    void setMockGeolocationPosition(double latitude, double longitude, double accuracy);
107    void addMockSpeechInputResult(JSStringRef result, double confidence, JSStringRef language);
108    void setPersistentUserStyleSheetLocation(JSStringRef path);
109    void setPluginsEnabled(bool flag);
110    void setPopupBlockingEnabled(bool flag);
111    void setPrivateBrowsingEnabled(bool flag);
112    void setSelectTrailingWhitespaceEnabled(bool flag);
113    void setSmartInsertDeleteEnabled(bool flag);
114    void setTabKeyCyclesThroughElements(bool cycles);
115    void setUseDashboardCompatibilityMode(bool flag);
116    void setUserStyleSheetEnabled(bool flag);
117    void setUserStyleSheetLocation(JSStringRef path);
118    void setValueForUser(JSContextRef, JSValueRef nodeObject, JSStringRef value);
119    void setViewModeMediaFeature(JSStringRef mode);
120    void setXSSAuditorEnabled(bool flag);
121    void setFrameFlatteningEnabled(bool enable);
122    void setSpatialNavigationEnabled(bool enable);
123    void setScrollbarPolicy(JSStringRef orientation, JSStringRef policy);
124    void setEditingBehavior(const char* editingBehavior);
125    JSValueRef shadowRoot(JSContextRef, JSValueRef);
126
127    void waitForPolicyDelegate();
128    size_t webHistoryItemCount();
129    unsigned workerThreadCount() const;
130    int windowCount();
131
132    void grantDesktopNotificationPermission(JSStringRef origin);
133    bool checkDesktopNotificationPermission(JSStringRef origin);
134
135    bool elementDoesAutoCompleteForElementWithId(JSStringRef id);
136
137    bool dumpAsAudio() const { return m_dumpAsAudio; }
138    void setDumpAsAudio(bool dumpAsAudio) { m_dumpAsAudio = dumpAsAudio; }
139
140    bool dumpAsPDF() const { return m_dumpAsPDF; }
141    void setDumpAsPDF(bool dumpAsPDF) { m_dumpAsPDF = dumpAsPDF; }
142
143    bool dumpAsText() const { return m_dumpAsText; }
144    void setDumpAsText(bool dumpAsText) { m_dumpAsText = dumpAsText; }
145
146    bool generatePixelResults() const { return m_generatePixelResults; }
147    void setGeneratePixelResults(bool generatePixelResults) { m_generatePixelResults = generatePixelResults; }
148
149    bool dumpApplicationCacheDelegateCallbacks() const { return m_dumpApplicationCacheDelegateCallbacks; }
150    void setDumpApplicationCacheDelegateCallbacks(bool dumpCallbacks) { m_dumpApplicationCacheDelegateCallbacks = dumpCallbacks; }
151
152    bool dumpBackForwardList() const { return m_dumpBackForwardList; }
153    void setDumpBackForwardList(bool dumpBackForwardList) { m_dumpBackForwardList = dumpBackForwardList; }
154
155    bool dumpChildFrameScrollPositions() const { return m_dumpChildFrameScrollPositions; }
156    void setDumpChildFrameScrollPositions(bool dumpChildFrameScrollPositions) { m_dumpChildFrameScrollPositions = dumpChildFrameScrollPositions; }
157
158    bool dumpChildFramesAsText() const { return m_dumpChildFramesAsText; }
159    void setDumpChildFramesAsText(bool dumpChildFramesAsText) { m_dumpChildFramesAsText = dumpChildFramesAsText; }
160
161    bool dumpDatabaseCallbacks() const { return m_dumpDatabaseCallbacks; }
162    void setDumpDatabaseCallbacks(bool dumpDatabaseCallbacks) { m_dumpDatabaseCallbacks = dumpDatabaseCallbacks; }
163
164    bool dumpDOMAsWebArchive() const { return m_dumpDOMAsWebArchive; }
165    void setDumpDOMAsWebArchive(bool dumpDOMAsWebArchive) { m_dumpDOMAsWebArchive = dumpDOMAsWebArchive; }
166
167    bool dumpEditingCallbacks() const { return m_dumpEditingCallbacks; }
168    void setDumpEditingCallbacks(bool dumpEditingCallbacks) { m_dumpEditingCallbacks = dumpEditingCallbacks; }
169
170    bool dumpFrameLoadCallbacks() const { return m_dumpFrameLoadCallbacks; }
171    void setDumpFrameLoadCallbacks(bool dumpFrameLoadCallbacks) { m_dumpFrameLoadCallbacks = dumpFrameLoadCallbacks; }
172
173    bool dumpUserGestureInFrameLoadCallbacks() const { return m_dumpUserGestureInFrameLoadCallbacks; }
174    void setDumpUserGestureInFrameLoadCallbacks(bool dumpUserGestureInFrameLoadCallbacks) { m_dumpUserGestureInFrameLoadCallbacks = dumpUserGestureInFrameLoadCallbacks; }
175
176    bool dumpHistoryDelegateCallbacks() const { return m_dumpHistoryDelegateCallbacks; }
177    void setDumpHistoryDelegateCallbacks(bool dumpHistoryDelegateCallbacks) { m_dumpHistoryDelegateCallbacks = dumpHistoryDelegateCallbacks; }
178
179    bool dumpResourceLoadCallbacks() const { return m_dumpResourceLoadCallbacks; }
180    void setDumpResourceLoadCallbacks(bool dumpResourceLoadCallbacks) { m_dumpResourceLoadCallbacks = dumpResourceLoadCallbacks; }
181
182    bool dumpResourceResponseMIMETypes() const { return m_dumpResourceResponseMIMETypes; }
183    void setDumpResourceResponseMIMETypes(bool dumpResourceResponseMIMETypes) { m_dumpResourceResponseMIMETypes = dumpResourceResponseMIMETypes; }
184
185    bool dumpSelectionRect() const { return m_dumpSelectionRect; }
186    void setDumpSelectionRect(bool dumpSelectionRect) { m_dumpSelectionRect = dumpSelectionRect; }
187
188    bool dumpSourceAsWebArchive() const { return m_dumpSourceAsWebArchive; }
189    void setDumpSourceAsWebArchive(bool dumpSourceAsWebArchive) { m_dumpSourceAsWebArchive = dumpSourceAsWebArchive; }
190
191    bool dumpStatusCallbacks() const { return m_dumpStatusCallbacks; }
192    void setDumpStatusCallbacks(bool dumpStatusCallbacks) { m_dumpStatusCallbacks = dumpStatusCallbacks; }
193
194    bool dumpTitleChanges() const { return m_dumpTitleChanges; }
195    void setDumpTitleChanges(bool dumpTitleChanges) { m_dumpTitleChanges = dumpTitleChanges; }
196
197    bool dumpIconChanges() const { return m_dumpIconChanges; }
198    void setDumpIconChanges(bool dumpIconChanges) { m_dumpIconChanges = dumpIconChanges; }
199
200    bool dumpVisitedLinksCallback() const { return m_dumpVisitedLinksCallback; }
201    void setDumpVisitedLinksCallback(bool dumpVisitedLinksCallback) { m_dumpVisitedLinksCallback = dumpVisitedLinksCallback; }
202
203    bool dumpWillCacheResponse() const { return m_dumpWillCacheResponse; }
204    void setDumpWillCacheResponse(bool dumpWillCacheResponse) { m_dumpWillCacheResponse = dumpWillCacheResponse; }
205
206    bool callCloseOnWebViews() const { return m_callCloseOnWebViews; }
207    void setCallCloseOnWebViews(bool callCloseOnWebViews) { m_callCloseOnWebViews = callCloseOnWebViews; }
208
209    bool canOpenWindows() const { return m_canOpenWindows; }
210    void setCanOpenWindows(bool canOpenWindows) { m_canOpenWindows = canOpenWindows; }
211
212    bool closeRemainingWindowsWhenComplete() const { return m_closeRemainingWindowsWhenComplete; }
213    void setCloseRemainingWindowsWhenComplete(bool closeRemainingWindowsWhenComplete) { m_closeRemainingWindowsWhenComplete = closeRemainingWindowsWhenComplete; }
214
215    bool newWindowsCopyBackForwardList() const { return m_newWindowsCopyBackForwardList; }
216    void setNewWindowsCopyBackForwardList(bool newWindowsCopyBackForwardList) { m_newWindowsCopyBackForwardList = newWindowsCopyBackForwardList; }
217
218    bool stopProvisionalFrameLoads() const { return m_stopProvisionalFrameLoads; }
219    void setStopProvisionalFrameLoads(bool stopProvisionalFrameLoads) { m_stopProvisionalFrameLoads = stopProvisionalFrameLoads; }
220
221    bool testOnscreen() const { return m_testOnscreen; }
222    void setTestOnscreen(bool testOnscreen) { m_testOnscreen = testOnscreen; }
223
224    bool testRepaint() const { return m_testRepaint; }
225    void setTestRepaint(bool testRepaint) { m_testRepaint = testRepaint; }
226
227    bool testRepaintSweepHorizontally() const { return m_testRepaintSweepHorizontally; }
228    void setTestRepaintSweepHorizontally(bool testRepaintSweepHorizontally) { m_testRepaintSweepHorizontally = testRepaintSweepHorizontally; }
229
230    bool waitToDump() const { return m_waitToDump; }
231    void setWaitToDump(bool waitToDump);
232    void waitToDumpWatchdogTimerFired();
233
234    const std::set<std::string>& willSendRequestClearHeaders() const { return m_willSendRequestClearHeaders; }
235    void setWillSendRequestClearHeader(std::string header) { m_willSendRequestClearHeaders.insert(header); }
236
237    bool willSendRequestReturnsNull() const { return m_willSendRequestReturnsNull; }
238    void setWillSendRequestReturnsNull(bool returnsNull) { m_willSendRequestReturnsNull = returnsNull; }
239
240    bool willSendRequestReturnsNullOnRedirect() const { return m_willSendRequestReturnsNullOnRedirect; }
241    void setWillSendRequestReturnsNullOnRedirect(bool returnsNull) { m_willSendRequestReturnsNullOnRedirect = returnsNull; }
242
243    bool windowIsKey() const { return m_windowIsKey; }
244    void setWindowIsKey(bool windowIsKey);
245
246    bool alwaysAcceptCookies() const { return m_alwaysAcceptCookies; }
247    void setAlwaysAcceptCookies(bool alwaysAcceptCookies);
248
249    bool handlesAuthenticationChallenges() const { return m_handlesAuthenticationChallenges; }
250    void setHandlesAuthenticationChallenges(bool handlesAuthenticationChallenges) { m_handlesAuthenticationChallenges = handlesAuthenticationChallenges; }
251
252    bool isPrinting() const { return m_isPrinting; }
253    void setIsPrinting(bool isPrinting) { m_isPrinting = isPrinting; }
254
255    const std::string& authenticationUsername() const { return m_authenticationUsername; }
256    void setAuthenticationUsername(std::string username) { m_authenticationUsername = username; }
257
258    const std::string& authenticationPassword() const { return m_authenticationPassword; }
259    void setAuthenticationPassword(std::string password) { m_authenticationPassword = password; }
260
261    bool globalFlag() const { return m_globalFlag; }
262    void setGlobalFlag(bool globalFlag) { m_globalFlag = globalFlag; }
263
264    bool deferMainResourceDataLoad() const { return m_deferMainResourceDataLoad; }
265    void setDeferMainResourceDataLoad(bool flag) { m_deferMainResourceDataLoad = flag; }
266
267    const std::string& testPathOrURL() const { return m_testPathOrURL; }
268    const std::string& expectedPixelHash() const { return m_expectedPixelHash; }
269
270    const std::string& encodedAudioData() const { return m_encodedAudioData; }
271    void setEncodedAudioData(const std::string& encodedAudioData) { m_encodedAudioData = encodedAudioData; }
272
273    bool pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId);
274    bool pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId);
275    bool sampleSVGAnimationForElementAtTime(JSStringRef animationId, double time, JSStringRef elementId);
276    unsigned numberOfActiveAnimations() const;
277    void suspendAnimations() const;
278    void resumeAnimations() const;
279
280    void addOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains);
281    void removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains);
282
283    void addUserScript(JSStringRef source, bool runAtStart, bool allFrames);
284    void addUserStyleSheet(JSStringRef source, bool allFrames);
285
286    void setGeolocationPermission(bool allow);
287    bool isGeolocationPermissionSet() const { return m_isGeolocationPermissionSet; }
288    bool geolocationPermission() const { return m_geolocationPermission; }
289
290    void setDeveloperExtrasEnabled(bool);
291    void setAsynchronousSpellCheckingEnabled(bool);
292    void showWebInspector();
293    void closeWebInspector();
294    void setTimelineProfilingEnabled(bool enabled);
295    void evaluateInWebInspector(long callId, JSStringRef script);
296    void evaluateScriptInIsolatedWorld(unsigned worldId, JSObjectRef globalObject, JSStringRef script);
297
298    void setPOSIXLocale(JSStringRef locale);
299
300    void setWebViewEditable(bool);
301
302    void abortModal();
303
304    bool hasSpellingMarker(int from, int length);
305    bool hasGrammarMarker(int from, int length);
306
307    void dumpConfigurationForViewport(int deviceDPI, int deviceWidth, int deviceHeight, int availableWidth, int availableHeight);
308
309    static void setSerializeHTTPLoads(bool serialize);
310
311    // The following API test functions should probably be moved to platform-specific
312    // unit tests outside of DRT once they exist.
313    void apiTestNewWindowDataLoadBaseURL(JSStringRef utf8Data, JSStringRef baseURL);
314    void apiTestGoToCurrentBackForwardItem();
315
316    // Simulate a request an embedding application could make, populating per-session credential storage.
317    void authenticateSession(JSStringRef url, JSStringRef username, JSStringRef password);
318
319    JSRetainPtr<JSStringRef> layerTreeAsText() const;
320
321    JSRetainPtr<JSStringRef> markerTextForListItem(JSContextRef context, JSValueRef nodeObject) const;
322
323    JSValueRef originsWithLocalStorage(JSContextRef);
324    void deleteAllLocalStorage();
325    void deleteLocalStorageForOrigin(JSStringRef originIdentifier);
326    void observeStorageTrackerNotifications(unsigned number);
327    void syncLocalStorage();
328
329    void setShouldPaintBrokenImage(bool);
330    bool shouldPaintBrokenImage() const { return m_shouldPaintBrokenImage; }
331
332    static const unsigned maxViewWidth;
333    static const unsigned maxViewHeight;
334
335    void setMinimumTimerInterval(double);
336
337private:
338    LayoutTestController(const std::string& testPathOrURL, const std::string& expectedPixelHash);
339
340    void setGeolocationPermissionCommon(bool allow);
341
342    bool m_dumpApplicationCacheDelegateCallbacks;
343    bool m_dumpAsAudio;
344    bool m_dumpAsPDF;
345    bool m_dumpAsText;
346    bool m_dumpBackForwardList;
347    bool m_dumpChildFrameScrollPositions;
348    bool m_dumpChildFramesAsText;
349    bool m_dumpDOMAsWebArchive;
350    bool m_dumpDatabaseCallbacks;
351    bool m_dumpEditingCallbacks;
352    bool m_dumpFrameLoadCallbacks;
353    bool m_dumpUserGestureInFrameLoadCallbacks;
354    bool m_dumpHistoryDelegateCallbacks;
355    bool m_dumpResourceLoadCallbacks;
356    bool m_dumpResourceResponseMIMETypes;
357    bool m_dumpSelectionRect;
358    bool m_dumpSourceAsWebArchive;
359    bool m_dumpStatusCallbacks;
360    bool m_dumpTitleChanges;
361    bool m_dumpIconChanges;
362    bool m_dumpVisitedLinksCallback;
363    bool m_dumpWillCacheResponse;
364    bool m_generatePixelResults;
365    bool m_callCloseOnWebViews;
366    bool m_canOpenWindows;
367    bool m_closeRemainingWindowsWhenComplete;
368    bool m_newWindowsCopyBackForwardList;
369    bool m_stopProvisionalFrameLoads;
370    bool m_testOnscreen;
371    bool m_testRepaint;
372    bool m_testRepaintSweepHorizontally;
373    bool m_waitToDump; // True if waitUntilDone() has been called, but notifyDone() has not yet been called.
374    bool m_willSendRequestReturnsNull;
375    bool m_willSendRequestReturnsNullOnRedirect;
376    bool m_windowIsKey;
377    bool m_alwaysAcceptCookies;
378    bool m_globalFlag;
379    bool m_isGeolocationPermissionSet;
380    bool m_geolocationPermission;
381    bool m_handlesAuthenticationChallenges;
382    bool m_isPrinting;
383    bool m_deferMainResourceDataLoad;
384    bool m_shouldPaintBrokenImage;
385
386    std::string m_authenticationUsername;
387    std::string m_authenticationPassword;
388    std::string m_testPathOrURL;
389    std::string m_expectedPixelHash;    // empty string if no hash
390
391    std::set<std::string> m_willSendRequestClearHeaders;
392
393    // base64 encoded WAV audio data is stored here.
394    std::string m_encodedAudioData;
395
396    // origins which have been granted desktop notification access
397    std::vector<JSStringRef> m_desktopNotificationAllowedOrigins;
398
399    std::map<std::string, std::string> m_URLsToRedirect;
400
401    static JSClassRef getJSClass();
402    static JSStaticValue* staticValues();
403    static JSStaticFunction* staticFunctions();
404};
405
406#endif // LayoutTestController_h
407