55c8c8bb238264c023ed692b44d4ab99e4f5c60e
[WebKit-https.git] / WebKitTools / DumpRenderTree / chromium / LayoutTestController.h
1 /*
2  * Copyright (C) 2010 Google Inc. All rights reserved.
3  * Copyright (C) 2010 Pawel Hajdan (phajdan.jr@chromium.org)
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  *     * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *     * Redistributions in binary form must reproduce the above
12  * copyright notice, this list of conditions and the following disclaimer
13  * in the documentation and/or other materials provided with the
14  * distribution.
15  *     * Neither the name of Google Inc. nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 /*
33   LayoutTestController class:
34   Bound to a JavaScript window.layoutTestController object using the
35   CppBoundClass::bindToJavascript(), this allows layout tests that are run in
36   the test_shell (or, in principle, any web page loaded into a client app built
37   with this class) to control various aspects of how the tests are run and what
38   sort of output they produce.
39 */
40
41 #ifndef LayoutTestController_h
42 #define LayoutTestController_h
43
44 #include "CppBoundClass.h"
45 #include "Task.h"
46 #include "public/WebString.h"
47 #include "public/WebURL.h"
48 #include <wtf/Deque.h>
49 #include <wtf/OwnPtr.h>
50
51 namespace WebKit {
52 class WebSpeechInputController;
53 class WebSpeechInputControllerMock;
54 class WebSpeechInputListener;
55 }
56
57 class TestShell;
58
59 class LayoutTestController : public CppBoundClass {
60 public:
61     // Builds the property and method lists needed to bind this class to a JS
62     // object.
63     LayoutTestController(TestShell*);
64
65     // This function sets a flag that tells the test_shell to dump pages as
66     // plain text, rather than as a text representation of the renderer's state.
67     // It takes an optional argument, whether to dump pixels results or not.
68     void dumpAsText(const CppArgumentList&, CppVariant*);
69
70     // This function should set a flag that tells the test_shell to print a line
71     // of descriptive text for each database command.  It should take no
72     // arguments, and ignore any that may be present. However, at the moment, we
73     // don't have any DB function that prints messages, so for now this function
74     // doesn't do anything.
75     void dumpDatabaseCallbacks(const CppArgumentList&, CppVariant*);
76
77     // This function sets a flag that tells the test_shell to print a line of
78     // descriptive text for each editing command.  It takes no arguments, and
79     // ignores any that may be present.
80     void dumpEditingCallbacks(const CppArgumentList&, CppVariant*);
81
82     // This function sets a flag that tells the test_shell to print a line of
83     // descriptive text for each frame load callback.  It takes no arguments, and
84     // ignores any that may be present.
85     void dumpFrameLoadCallbacks(const CppArgumentList&, CppVariant*);
86
87     // This function sets a flag that tells the test_shell to print out a text
88     // representation of the back/forward list.  It ignores all arguments.
89     void dumpBackForwardList(const CppArgumentList&, CppVariant*);
90
91     // This function sets a flag that tells the test_shell to print out the
92     // scroll offsets of the child frames.  It ignores all.
93     void dumpChildFrameScrollPositions(const CppArgumentList&, CppVariant*);
94
95     // This function sets a flag that tells the test_shell to recursively
96     // dump all frames as plain text if the dumpAsText flag is set.
97     // It takes no arguments, and ignores any that may be present.
98     void dumpChildFramesAsText(const CppArgumentList&, CppVariant*);
99
100     // This function sets a flag that tells the test_shell to dump all calls
101     // to window.status().
102     // It takes no arguments, and ignores any that may be present.
103     void dumpWindowStatusChanges(const CppArgumentList&, CppVariant*);
104
105     // When called with a boolean argument, this sets a flag that controls
106     // whether content-editable elements accept editing focus when an editing
107     // attempt is made. It ignores any additional arguments.
108     void setAcceptsEditing(const CppArgumentList&, CppVariant*);
109
110     // Functions for dealing with windows.  By default we block all new windows.
111     void windowCount(const CppArgumentList&, CppVariant*);
112     void setCanOpenWindows(const CppArgumentList&, CppVariant*);
113     void setCloseRemainingWindowsWhenComplete(const CppArgumentList&, CppVariant*);
114
115     // By default, tests end when page load is complete.  These methods are used
116     // to delay the completion of the test until notifyDone is called.
117     void waitUntilDone(const CppArgumentList&, CppVariant*);
118     void notifyDone(const CppArgumentList&, CppVariant*);
119
120     // Methods for adding actions to the work queue.  Used in conjunction with
121     // waitUntilDone/notifyDone above.
122     void queueBackNavigation(const CppArgumentList&, CppVariant*);
123     void queueForwardNavigation(const CppArgumentList&, CppVariant*);
124     void queueReload(const CppArgumentList&, CppVariant*);
125     void queueLoadingScript(const CppArgumentList&, CppVariant*);
126     void queueNonLoadingScript(const CppArgumentList&, CppVariant*);
127     void queueLoad(const CppArgumentList&, CppVariant*);
128
129     // Although this is named "objC" to match the Mac version, it actually tests
130     // the identity of its two arguments in C++.
131     void objCIdentityIsEqual(const CppArgumentList&, CppVariant*);
132
133     // Changes the cookie policy from the default to allow all cookies.
134     void setAlwaysAcceptCookies(const CppArgumentList&, CppVariant*);
135
136     // Shows DevTools window.
137     void showWebInspector(const CppArgumentList&, CppVariant*);
138     void closeWebInspector(const CppArgumentList&, CppVariant*);
139
140     // Gives focus to the window.
141     void setWindowIsKey(const CppArgumentList&, CppVariant*);
142
143     // Method that controls whether pressing Tab key cycles through page elements
144     // or inserts a '\t' char in text area
145     void setTabKeyCyclesThroughElements(const CppArgumentList&, CppVariant*);
146
147     // Passes through to WebPreferences which allows the user to have a custom
148     // style sheet.
149     void setUserStyleSheetEnabled(const CppArgumentList&, CppVariant*);
150     void setUserStyleSheetLocation(const CppArgumentList&, CppVariant*);
151
152     // Passes this preference through to WebSettings.
153     void setAuthorAndUserStylesEnabled(const CppArgumentList&, CppVariant*);
154
155     // Puts Webkit in "dashboard compatibility mode", which is used in obscure
156     // Mac-only circumstances. It's not really necessary, and will most likely
157     // never be used by Chrome, but some layout tests depend on its presence.
158     void setUseDashboardCompatibilityMode(const CppArgumentList&, CppVariant*);
159
160     void setScrollbarPolicy(const CppArgumentList&, CppVariant*);
161
162     // Causes navigation actions just printout the intended navigation instead
163     // of taking you to the page. This is used for cases like mailto, where you
164     // don't actually want to open the mail program.
165     void setCustomPolicyDelegate(const CppArgumentList&, CppVariant*);
166
167     // Delays completion of the test until the policy delegate runs.
168     void waitForPolicyDelegate(const CppArgumentList&, CppVariant*);
169
170     // Causes WillSendRequest to clear certain headers.
171     void setWillSendRequestClearHeader(const CppArgumentList&, CppVariant*);
172
173     // Causes WillSendRequest to block redirects.
174     void setWillSendRequestReturnsNullOnRedirect(const CppArgumentList&, CppVariant*);
175
176     // Causes WillSendRequest to return an empty request.
177     void setWillSendRequestReturnsNull(const CppArgumentList&, CppVariant*);
178
179     // Converts a URL starting with file:///tmp/ to the local mapping.
180     void pathToLocalResource(const CppArgumentList&, CppVariant*);
181
182     // Sets a bool such that when a drag is started, we fill the drag clipboard
183     // with a fake file object.
184     void addFileToPasteboardOnDrag(const CppArgumentList&, CppVariant*);
185
186     // Executes an internal command (superset of document.execCommand() commands).
187     void execCommand(const CppArgumentList&, CppVariant*);
188
189     // Checks if an internal command is currently available.
190     void isCommandEnabled(const CppArgumentList&, CppVariant*);
191
192     // Set the WebPreference that controls webkit's popup blocking.
193     void setPopupBlockingEnabled(const CppArgumentList&, CppVariant*);
194
195     // If true, causes provisional frame loads to be stopped for the remainder of
196     // the test.
197     void setStopProvisionalFrameLoads(const CppArgumentList&, CppVariant*);
198
199     // Enable or disable smart insert/delete.  This is enabled by default.
200     void setSmartInsertDeleteEnabled(const CppArgumentList&, CppVariant*);
201
202     // Enable or disable trailing whitespace selection on double click.
203     void setSelectTrailingWhitespaceEnabled(const CppArgumentList&, CppVariant*);
204
205     void pauseAnimationAtTimeOnElementWithId(const CppArgumentList&, CppVariant*);
206     void pauseTransitionAtTimeOnElementWithId(const CppArgumentList&, CppVariant*);
207     void elementDoesAutoCompleteForElementWithId(const CppArgumentList&, CppVariant*);
208     void numberOfActiveAnimations(const CppArgumentList&, CppVariant*);
209     void suspendAnimations(const CppArgumentList&, CppVariant*);
210     void resumeAnimations(const CppArgumentList&, CppVariant*);
211
212     void disableImageLoading(const CppArgumentList&, CppVariant*);
213
214     void setIconDatabaseEnabled(const CppArgumentList&, CppVariant*);
215
216     void dumpSelectionRect(const CppArgumentList&, CppVariant*);
217
218     // Grants permission for desktop notifications to an origin
219     void grantDesktopNotificationPermission(const CppArgumentList&, CppVariant*);
220     // Simulates a click on a desktop notification.
221     void simulateDesktopNotificationClick(const CppArgumentList&, CppVariant*);
222
223     void setEditingBehavior(const CppArgumentList&, CppVariant*);
224
225     // The following are only stubs.  TODO(pamg): Implement any of these that
226     // are needed to pass the layout tests.
227     void dumpAsWebArchive(const CppArgumentList&, CppVariant*);
228     void dumpTitleChanges(const CppArgumentList&, CppVariant*);
229     void dumpResourceLoadCallbacks(const CppArgumentList&, CppVariant*);
230     void setMainFrameIsFirstResponder(const CppArgumentList&, CppVariant*);
231     void display(const CppArgumentList&, CppVariant*);
232     void testRepaint(const CppArgumentList&, CppVariant*);
233     void repaintSweepHorizontally(const CppArgumentList&, CppVariant*);
234     void clearBackForwardList(const CppArgumentList&, CppVariant*);
235     void keepWebHistory(const CppArgumentList&, CppVariant*);
236     void storeWebScriptObject(const CppArgumentList&, CppVariant*);
237     void accessStoredWebScriptObject(const CppArgumentList&, CppVariant*);
238     void objCClassNameOf(const CppArgumentList&, CppVariant*);
239     void addDisallowedURL(const CppArgumentList&, CppVariant*);
240     void callShouldCloseOnWebView(const CppArgumentList&, CppVariant*);
241     void setCallCloseOnWebViews(const CppArgumentList&, CppVariant*);
242     void setPrivateBrowsingEnabled(const CppArgumentList&, CppVariant*);
243
244     void setJavaScriptCanAccessClipboard(const CppArgumentList&, CppVariant*);
245     void setXSSAuditorEnabled(const CppArgumentList&, CppVariant*);
246     void evaluateScriptInIsolatedWorld(const CppArgumentList&, CppVariant*);
247     void overridePreference(const CppArgumentList&, CppVariant*);
248     void setAllowUniversalAccessFromFileURLs(const CppArgumentList&, CppVariant*);
249     void setAllowFileAccessFromFileURLs(const CppArgumentList&, CppVariant*);
250
251
252     // The fallback method is called when a nonexistent method is called on
253     // the layout test controller object.
254     // It is usefull to catch typos in the JavaScript code (a few layout tests
255     // do have typos in them) and it allows the script to continue running in
256     // that case (as the Mac does).
257     void fallbackMethod(const CppArgumentList&, CppVariant*);
258
259     // Allows layout tests to manage origins' whitelisting.
260     void addOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
261     void removeOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
262
263     // Clears all Application Caches.
264     void clearAllApplicationCaches(const CppArgumentList&, CppVariant*);
265     // Sets the Application Quota for the localhost origin.
266     void setApplicationCacheOriginQuota(const CppArgumentList&, CppVariant*);
267
268     // Clears all databases.
269     void clearAllDatabases(const CppArgumentList&, CppVariant*);
270     // Sets the default quota for all origins
271     void setDatabaseQuota(const CppArgumentList&, CppVariant*);
272
273     // Calls setlocale(LC_ALL, ...) for a specified locale.
274     // Resets between tests.
275     void setPOSIXLocale(const CppArgumentList&, CppVariant*);
276
277     // Gets the value of the counter in the element specified by its ID.
278     void counterValueForElementById(const CppArgumentList&, CppVariant*);
279
280     // Gets the number of page where the specified element will be put.
281     void pageNumberForElementById(const CppArgumentList&, CppVariant*);
282
283     // Gets the number of pages to be printed.
284     void numberOfPages(const CppArgumentList&, CppVariant*);
285
286
287     // Allows layout tests to start Timeline profiling.
288     void setTimelineProfilingEnabled(const CppArgumentList&, CppVariant*);
289
290     // Allows layout tests to exec scripts at WebInspector side.
291     void evaluateInWebInspector(const CppArgumentList&, CppVariant*);
292
293     // Forces the selection colors for testing under Linux.
294     void forceRedSelectionColors(const CppArgumentList&, CppVariant*);
295
296     // Adds a user script or user style sheet to be injected into new documents.
297     void addUserScript(const CppArgumentList&, CppVariant*);
298     void addUserStyleSheet(const CppArgumentList&, CppVariant*);
299
300     // DeviceOrientation related functions
301     void setMockDeviceOrientation(const CppArgumentList&, CppVariant*);
302
303     // Geolocation related functions.
304     void setGeolocationPermission(const CppArgumentList&, CppVariant*);
305     void setMockGeolocationPosition(const CppArgumentList&, CppVariant*);
306     void setMockGeolocationError(const CppArgumentList&, CppVariant*);
307
308     // Empty stub method to keep parity with object model exposed by global LayoutTestController.
309     void abortModal(const CppArgumentList&, CppVariant*);
310
311     // Speech input related functions.
312     void setMockSpeechInputResult(const CppArgumentList&, CppVariant*);
313
314     void markerTextForListItem(const CppArgumentList&, CppVariant*);
315
316 public:
317     // The following methods are not exposed to JavaScript.
318     void setWorkQueueFrozen(bool frozen) { m_workQueue.setFrozen(frozen); }
319
320     WebKit::WebSpeechInputController* speechInputController(WebKit::WebSpeechInputListener*);
321     bool shouldDumpAsText() { return m_dumpAsText; }
322     bool shouldDumpEditingCallbacks() { return m_dumpEditingCallbacks; }
323     bool shouldDumpFrameLoadCallbacks() { return m_dumpFrameLoadCallbacks; }
324     void setShouldDumpFrameLoadCallbacks(bool value) { m_dumpFrameLoadCallbacks = value; }
325     bool shouldDumpResourceLoadCallbacks() {return m_dumpResourceLoadCallbacks; }
326     bool shouldDumpStatusCallbacks() { return m_dumpWindowStatusChanges; }
327     bool shouldDumpSelectionRect() { return m_dumpSelectionRect; }
328     bool shouldDumpBackForwardList() { return m_dumpBackForwardList; }
329     bool shouldDumpTitleChanges() { return m_dumpTitleChanges; }
330     bool shouldDumpChildFrameScrollPositions() { return m_dumpChildFrameScrollPositions; }
331     bool shouldDumpChildFramesAsText() { return m_dumpChildFramesAsText; }
332     bool shouldGeneratePixelResults() { return m_generatePixelResults; }
333     bool acceptsEditing() { return m_acceptsEditing; }
334     bool canOpenWindows() { return m_canOpenWindows; }
335     bool shouldAddFileToPasteboard() { return m_shouldAddFileToPasteboard; }
336     bool stopProvisionalFrameLoads() { return m_stopProvisionalFrameLoads; }
337
338     bool testRepaint() const { return m_testRepaint; }
339     bool sweepHorizontally() const { return m_sweepHorizontally; }
340
341     // Called by the webview delegate when the toplevel frame load is done.
342     void locationChangeDone();
343
344     // Called by the webview delegate when the policy delegate runs if the
345     // waitForPolicyDelegate was called.
346     void policyDelegateDone();
347
348     // Reinitializes all static values.  The reset() method should be called
349     // before the start of each test (currently from
350     // TestShell::runFileTest).
351     void reset();
352
353     // A single item in the work queue.
354     class WorkItem {
355     public:
356         virtual ~WorkItem() {}
357
358         // Returns true if this started a load.
359         virtual bool run(TestShell* shell) = 0;
360     };
361
362     TaskList* taskList() { return &m_taskList; }
363
364 private:
365     friend class WorkItem;
366     friend class WorkQueue;
367
368     // Helper class for managing events queued by methods like queueLoad or
369     // queueScript.
370     class WorkQueue {
371     public:
372         WorkQueue(LayoutTestController* controller) : m_frozen(false), m_controller(controller) {}
373         virtual ~WorkQueue();
374         void processWorkSoon();
375
376         // Reset the state of the class between tests.
377         void reset();
378
379         void addWork(WorkItem* work);
380
381         void setFrozen(bool frozen) { m_frozen = frozen; }
382         bool isEmpty() { return m_queue.isEmpty(); }
383         TaskList* taskList() { return &m_taskList; }
384
385     private:
386         void processWork();
387         class WorkQueueTask: public MethodTask<WorkQueue> {
388         public:
389             WorkQueueTask(WorkQueue* object): MethodTask<WorkQueue>(object) {}
390             virtual void runIfValid() { m_object->processWork(); }
391         };
392
393         TaskList m_taskList;
394         Deque<WorkItem*> m_queue;
395         bool m_frozen;
396         LayoutTestController* m_controller;
397     };
398
399     // Support for overridePreference.
400     bool cppVariantToBool(const CppVariant&);
401     int32_t cppVariantToInt32(const CppVariant&);
402     WebKit::WebString cppVariantToWebString(const CppVariant&);
403
404     void logErrorToConsole(const std::string&);
405     void completeNotifyDone(bool isTimeout);
406     class NotifyDoneTimedOutTask: public MethodTask<LayoutTestController> {
407     public:
408         NotifyDoneTimedOutTask(LayoutTestController* object): MethodTask<LayoutTestController>(object) {}
409         virtual void runIfValid() { m_object->completeNotifyDone(true); }
410     };
411
412
413     bool pauseAnimationAtTimeOnElementWithId(const WebKit::WebString& animationName, double time, const WebKit::WebString& elementId);
414     bool pauseTransitionAtTimeOnElementWithId(const WebKit::WebString& propertyName, double time, const WebKit::WebString& elementId);
415     bool elementDoesAutoCompleteForElementWithId(const WebKit::WebString&);
416     int numberOfActiveAnimations();
417     void suspendAnimations();
418     void resumeAnimations();
419
420     // Used for test timeouts.
421     TaskList m_taskList;
422
423     // Non-owning pointer.  The LayoutTestController is owned by the host.
424     TestShell* m_shell;
425
426     // If true, the test_shell will produce a plain text dump rather than a
427     // text representation of the renderer.
428     bool m_dumpAsText;
429
430     // If true, the test_shell will write a descriptive line for each editing
431     // command.
432     bool m_dumpEditingCallbacks;
433
434     // If true, the test_shell will draw the bounds of the current selection rect
435     // taking possible transforms of the selection rect into account.
436     bool m_dumpSelectionRect;
437
438     // If true, the test_shell will output a descriptive line for each frame
439     // load callback.
440     bool m_dumpFrameLoadCallbacks;
441
442     // If true, the test_shell will output a descriptive line for each resource
443     // load callback.
444     bool m_dumpResourceLoadCallbacks;
445
446     // If true, the test_shell will produce a dump of the back forward list as
447     // well.
448     bool m_dumpBackForwardList;
449
450     // If true, the test_shell will print out the child frame scroll offsets as
451     // well.
452     bool m_dumpChildFrameScrollPositions;
453
454     // If true and if dump_as_text_ is true, the test_shell will recursively
455     // dump all frames as plain text.
456     bool m_dumpChildFramesAsText;
457
458     // If true, the test_shell will dump all changes to window.status.
459     bool m_dumpWindowStatusChanges;
460
461     // If true, output a message when the page title is changed.
462     bool m_dumpTitleChanges;
463
464     // If true, the test_shell will generate pixel results in dumpAsText mode
465     bool m_generatePixelResults;
466
467     // If true, the element will be treated as editable.  This value is returned
468     // from various editing callbacks that are called just before edit operations
469     // are allowed.
470     bool m_acceptsEditing;
471
472     // If true, new windows can be opened via javascript or by plugins.  By
473     // default, set to false and can be toggled to true using
474     // setCanOpenWindows().
475     bool m_canOpenWindows;
476
477     // When reset is called, go through and close all but the main test shell
478     // window.  By default, set to true but toggled to false using
479     // setCloseRemainingWindowsWhenComplete().
480     bool m_closeRemainingWindows;
481
482     // If true, pixel dump will be produced as a series of 1px-tall, view-wide
483     // individual paints over the height of the view.
484     bool m_testRepaint;
485     // If true and test_repaint_ is true as well, pixel dump will be produced as
486     // a series of 1px-wide, view-tall paints across the width of the view.
487     bool m_sweepHorizontally;
488
489     // If true and a drag starts, adds a file to the drag&drop clipboard.
490     bool m_shouldAddFileToPasteboard;
491
492     // If true, stops provisional frame loads during the
493     // DidStartProvisionalLoadForFrame callback.
494     bool m_stopProvisionalFrameLoads;
495
496     // If true, don't dump output until notifyDone is called.
497     bool m_waitUntilDone;
498
499     WorkQueue m_workQueue;
500
501     CppVariant m_globalFlag;
502
503     // Bound variable counting the number of top URLs visited.
504     CppVariant m_webHistoryItemCount;
505
506     WebKit::WebURL m_userStyleSheetLocation;
507
508     OwnPtr<WebKit::WebSpeechInputControllerMock> m_speechInputControllerMock;
509 };
510
511 #endif // LayoutTestController_h