OSDN Git Service

am 72533818: am 4da2dabd: Merge "The ICU data is no longer compiled directly into...
[android-x86/external-webkit.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 "base/timer.h" // FIXME: Remove this.
46 #include "public/WebString.h"
47 #include "public/WebURL.h"
48 #include <wtf/Deque.h>
49
50 class TestShell;
51
52 class LayoutTestController : public CppBoundClass {
53 public:
54     // Builds the property and method lists needed to bind this class to a JS
55     // object.
56     LayoutTestController(TestShell*);
57
58     // This function sets a flag that tells the test_shell to dump pages as
59     // plain text, rather than as a text representation of the renderer's state.
60     // It takes no arguments, and ignores any that may be present.
61     void dumpAsText(const CppArgumentList&, CppVariant*);
62
63     // This function should set a flag that tells the test_shell to print a line
64     // of descriptive text for each database command.  It should take no
65     // arguments, and ignore any that may be present. However, at the moment, we
66     // don't have any DB function that prints messages, so for now this function
67     // doesn't do anything.
68     void dumpDatabaseCallbacks(const CppArgumentList&, CppVariant*);
69
70     // This function sets a flag that tells the test_shell to print a line of
71     // descriptive text for each editing command.  It takes no arguments, and
72     // ignores any that may be present.
73     void dumpEditingCallbacks(const CppArgumentList&, CppVariant*);
74
75     // This function sets a flag that tells the test_shell to print a line of
76     // descriptive text for each frame load callback.  It takes no arguments, and
77     // ignores any that may be present.
78     void dumpFrameLoadCallbacks(const CppArgumentList&, CppVariant*);
79
80     // This function sets a flag that tells the test_shell to print out a text
81     // representation of the back/forward list.  It ignores all arguments.
82     void dumpBackForwardList(const CppArgumentList&, CppVariant*);
83
84     // This function sets a flag that tells the test_shell to print out the
85     // scroll offsets of the child frames.  It ignores all.
86     void dumpChildFrameScrollPositions(const CppArgumentList&, CppVariant*);
87
88     // This function sets a flag that tells the test_shell to recursively
89     // dump all frames as plain text if the dumpAsText flag is set.
90     // It takes no arguments, and ignores any that may be present.
91     void dumpChildFramesAsText(const CppArgumentList&, CppVariant*);
92
93     // This function sets a flag that tells the test_shell to dump all calls
94     // to window.status().
95     // It takes no arguments, and ignores any that may be present.
96     void dumpWindowStatusChanges(const CppArgumentList&, CppVariant*);
97
98     // When called with a boolean argument, this sets a flag that controls
99     // whether content-editable elements accept editing focus when an editing
100     // attempt is made. It ignores any additional arguments.
101     void setAcceptsEditing(const CppArgumentList&, CppVariant*);
102
103     // Functions for dealing with windows.  By default we block all new windows.
104     void windowCount(const CppArgumentList&, CppVariant*);
105     void setCanOpenWindows(const CppArgumentList&, CppVariant*);
106     void setCloseRemainingWindowsWhenComplete(const CppArgumentList&, CppVariant*);
107
108     // By default, tests end when page load is complete.  These methods are used
109     // to delay the completion of the test until notifyDone is called.
110     void waitUntilDone(const CppArgumentList&, CppVariant*);
111     void notifyDone(const CppArgumentList&, CppVariant*);
112     void notifyDoneTimedOut();
113
114     // Methods for adding actions to the work queue.  Used in conjunction with
115     // waitUntilDone/notifyDone above.
116     void queueBackNavigation(const CppArgumentList&, CppVariant*);
117     void queueForwardNavigation(const CppArgumentList&, CppVariant*);
118     void queueReload(const CppArgumentList&, CppVariant*);
119     void queueLoadingScript(const CppArgumentList&, CppVariant*);
120     void queueNonLoadingScript(const CppArgumentList&, CppVariant*);
121     void queueLoad(const CppArgumentList&, CppVariant*);
122
123     // Although this is named "objC" to match the Mac version, it actually tests
124     // the identity of its two arguments in C++.
125     void objCIdentityIsEqual(const CppArgumentList&, CppVariant*);
126
127     // Changes the cookie policy from the default to allow all cookies.
128     void setAlwaysAcceptCookies(const CppArgumentList&, CppVariant*);
129
130     // Shows DevTools window.
131     void showWebInspector(const CppArgumentList&, CppVariant*);
132
133     // Gives focus to the window.
134     void setWindowIsKey(const CppArgumentList&, CppVariant*);
135
136     // Method that controls whether pressing Tab key cycles through page elements
137     // or inserts a '\t' char in text area
138     void setTabKeyCyclesThroughElements(const CppArgumentList&, CppVariant*);
139
140     // Passes through to WebPreferences which allows the user to have a custom
141     // style sheet.
142     void setUserStyleSheetEnabled(const CppArgumentList&, CppVariant*);
143     void setUserStyleSheetLocation(const CppArgumentList&, CppVariant*);
144
145     // Passes this preference through to WebSettings.
146     void setAuthorAndUserStylesEnabled(const CppArgumentList&, CppVariant*);
147
148     // Puts Webkit in "dashboard compatibility mode", which is used in obscure
149     // Mac-only circumstances. It's not really necessary, and will most likely
150     // never be used by Chrome, but some layout tests depend on its presence.
151     void setUseDashboardCompatibilityMode(const CppArgumentList&, CppVariant*);
152
153     void setScrollbarPolicy(const CppArgumentList&, CppVariant*);
154
155     // Causes navigation actions just printout the intended navigation instead
156     // of taking you to the page. This is used for cases like mailto, where you
157     // don't actually want to open the mail program.
158     void setCustomPolicyDelegate(const CppArgumentList&, CppVariant*);
159
160     // Delays completion of the test until the policy delegate runs.
161     void waitForPolicyDelegate(const CppArgumentList&, CppVariant*);
162
163     // Causes WillSendRequest to clear certain headers.
164     void setWillSendRequestClearHeader(const CppArgumentList&, CppVariant*);
165
166     // Causes WillSendRequest to block redirects.
167     void setWillSendRequestReturnsNullOnRedirect(const CppArgumentList&, CppVariant*);
168
169     // Causes WillSendRequest to return an empty request.
170     void setWillSendRequestReturnsNull(const CppArgumentList&, CppVariant*);
171
172     // Converts a URL starting with file:///tmp/ to the local mapping.
173     void pathToLocalResource(const CppArgumentList&, CppVariant*);
174
175     // Sets a bool such that when a drag is started, we fill the drag clipboard
176     // with a fake file object.
177     void addFileToPasteboardOnDrag(const CppArgumentList&, CppVariant*);
178
179     // Executes an internal command (superset of document.execCommand() commands).
180     void execCommand(const CppArgumentList&, CppVariant*);
181
182     // Checks if an internal command is currently available.
183     void isCommandEnabled(const CppArgumentList&, CppVariant*);
184
185     // Set the WebPreference that controls webkit's popup blocking.
186     void setPopupBlockingEnabled(const CppArgumentList&, CppVariant*);
187
188     // If true, causes provisional frame loads to be stopped for the remainder of
189     // the test.
190     void setStopProvisionalFrameLoads(const CppArgumentList&, CppVariant*);
191
192     // Enable or disable smart insert/delete.  This is enabled by default.
193     void setSmartInsertDeleteEnabled(const CppArgumentList&, CppVariant*);
194
195     // Enable or disable trailing whitespace selection on double click.
196     void setSelectTrailingWhitespaceEnabled(const CppArgumentList&, CppVariant*);
197
198     void pauseAnimationAtTimeOnElementWithId(const CppArgumentList&, CppVariant*);
199     void pauseTransitionAtTimeOnElementWithId(const CppArgumentList&, CppVariant*);
200     void elementDoesAutoCompleteForElementWithId(const CppArgumentList&, CppVariant*);
201     void numberOfActiveAnimations(const CppArgumentList&, CppVariant*);
202
203     void disableImageLoading(const CppArgumentList&, CppVariant*);
204
205     void setIconDatabaseEnabled(const CppArgumentList&, CppVariant*);
206
207     void dumpSelectionRect(const CppArgumentList&, CppVariant*);
208
209     // Grants permission for desktop notifications to an origin
210     void grantDesktopNotificationPermission(const CppArgumentList&, CppVariant*);
211
212     void setEditingBehavior(const CppArgumentList&, CppVariant*);
213
214     // The following are only stubs.  TODO(pamg): Implement any of these that
215     // are needed to pass the layout tests.
216     void dumpAsWebArchive(const CppArgumentList&, CppVariant*);
217     void dumpTitleChanges(const CppArgumentList&, CppVariant*);
218     void dumpResourceLoadCallbacks(const CppArgumentList&, CppVariant*);
219     void setMainFrameIsFirstResponder(const CppArgumentList&, CppVariant*);
220     void display(const CppArgumentList&, CppVariant*);
221     void testRepaint(const CppArgumentList&, CppVariant*);
222     void repaintSweepHorizontally(const CppArgumentList&, CppVariant*);
223     void clearBackForwardList(const CppArgumentList&, CppVariant*);
224     void keepWebHistory(const CppArgumentList&, CppVariant*);
225     void storeWebScriptObject(const CppArgumentList&, CppVariant*);
226     void accessStoredWebScriptObject(const CppArgumentList&, CppVariant*);
227     void objCClassNameOf(const CppArgumentList&, CppVariant*);
228     void addDisallowedURL(const CppArgumentList&, CppVariant*);
229     void callShouldCloseOnWebView(const CppArgumentList&, CppVariant*);
230     void setCallCloseOnWebViews(const CppArgumentList&, CppVariant*);
231     void setPrivateBrowsingEnabled(const CppArgumentList&, CppVariant*);
232
233     void setJavaScriptCanAccessClipboard(const CppArgumentList&, CppVariant*);
234     void setXSSAuditorEnabled(const CppArgumentList&, CppVariant*);
235     void evaluateScriptInIsolatedWorld(const CppArgumentList&, CppVariant*);
236     void overridePreference(const CppArgumentList&, CppVariant*);
237     void setAllowUniversalAccessFromFileURLs(const CppArgumentList&, CppVariant*);
238     void setAllowFileAccessFromFileURLs(const CppArgumentList&, CppVariant*);
239
240
241     // The fallback method is called when a nonexistent method is called on
242     // the layout test controller object.
243     // It is usefull to catch typos in the JavaScript code (a few layout tests
244     // do have typos in them) and it allows the script to continue running in
245     // that case (as the Mac does).
246     void fallbackMethod(const CppArgumentList&, CppVariant*);
247
248     // Allows layout tests to manage origins' whitelisting.
249     void addOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
250     void removeOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
251
252     // Clears all databases.
253     void clearAllDatabases(const CppArgumentList&, CppVariant*);
254     // Sets the default quota for all origins
255     void setDatabaseQuota(const CppArgumentList&, CppVariant*);
256
257     // Calls setlocale(LC_ALL, ...) for a specified locale.
258     // Resets between tests.
259     void setPOSIXLocale(const CppArgumentList&, CppVariant*);
260
261     // Gets the value of the counter in the element specified by its ID.
262     void counterValueForElementById(const CppArgumentList&, CppVariant*);
263
264     // Gets the number of page where the specified element will be put.
265     void pageNumberForElementById(const CppArgumentList&, CppVariant*);
266
267     // Gets the number of pages to be printed.
268     void numberOfPages(const CppArgumentList&, CppVariant*);
269
270
271     // Allows layout tests to start Timeline profiling.
272     void setTimelineProfilingEnabled(const CppArgumentList&, CppVariant*);
273
274     // Allows layout tests to exec scripts at WebInspector side.
275     void evaluateInWebInspector(const CppArgumentList&, CppVariant*);
276
277     // Forces the selection colors for testing under Linux.
278     void forceRedSelectionColors(const CppArgumentList&, CppVariant*);
279
280     // Adds a user script or user style sheet to be injected into new documents.
281     void addUserScript(const CppArgumentList&, CppVariant*);
282     void addUserStyleSheet(const CppArgumentList&, CppVariant*);
283
284     // Geolocation related functions.
285     void setGeolocationPermission(const CppArgumentList&, CppVariant*);
286     void setMockGeolocationPosition(const CppArgumentList&, CppVariant*);
287     void setMockGeolocationError(const CppArgumentList&, CppVariant*);
288
289     // Empty stub method to keep parity with object model exposed by global LayoutTestController.
290     void abortModal(const CppArgumentList&, CppVariant*);
291
292 public:
293     // The following methods are not exposed to JavaScript.
294     void setWorkQueueFrozen(bool frozen) { m_workQueue.setFrozen(frozen); }
295
296     bool shouldDumpAsText() { return m_dumpAsText; }
297     bool shouldDumpEditingCallbacks() { return m_dumpEditingCallbacks; }
298     bool shouldDumpFrameLoadCallbacks() { return m_dumpFrameLoadCallbacks; }
299     void setShouldDumpFrameLoadCallbacks(bool value) { m_dumpFrameLoadCallbacks = value; }
300     bool shouldDumpResourceLoadCallbacks() {return m_dumpResourceLoadCallbacks; }
301     bool shouldDumpStatusCallbacks() { return m_dumpWindowStatusChanges; }
302     bool shouldDumpSelectionRect() { return m_dumpSelectionRect; }
303     bool shouldDumpBackForwardList() { return m_dumpBackForwardList; }
304     bool shouldDumpTitleChanges() { return m_dumpTitleChanges; }
305     bool shouldDumpChildFrameScrollPositions() { return m_dumpChildFrameScrollPositions; }
306     bool shouldDumpChildFramesAsText() { return m_dumpChildFramesAsText; }
307     bool acceptsEditing() { return m_acceptsEditing; }
308     bool canOpenWindows() { return m_canOpenWindows; }
309     bool shouldAddFileToPasteboard() { return m_shouldAddFileToPasteboard; }
310     bool stopProvisionalFrameLoads() { return m_stopProvisionalFrameLoads; }
311
312     bool testRepaint() const { return m_testRepaint; }
313     bool sweepHorizontally() const { return m_sweepHorizontally; }
314
315     // Called by the webview delegate when the toplevel frame load is done.
316     void locationChangeDone();
317
318     // Called by the webview delegate when the policy delegate runs if the
319     // waitForPolicyDelegate was called.
320     void policyDelegateDone();
321
322     // Reinitializes all static values.  The reset() method should be called
323     // before the start of each test (currently from
324     // TestShell::runFileTest).
325     void reset();
326
327     // A single item in the work queue.
328     class WorkItem {
329     public:
330         virtual ~WorkItem() {}
331
332         // Returns true if this started a load.
333         virtual bool run(TestShell* shell) = 0;
334     };
335
336 private:
337     friend class WorkItem;
338     friend class WorkQueue;
339
340     // Helper class for managing events queued by methods like queueLoad or
341     // queueScript.
342     class WorkQueue {
343     public:
344         WorkQueue(LayoutTestController* controller) : m_frozen(false), m_controller(controller) {}
345         virtual ~WorkQueue();
346         void processWorkSoon();
347
348         // Reset the state of the class between tests.
349         void reset();
350
351         void addWork(WorkItem* work);
352
353         void setFrozen(bool frozen) { m_frozen = frozen; }
354         bool isEmpty() { return m_queue.isEmpty(); }
355
356     private:
357         void processWork();
358
359         base::OneShotTimer<WorkQueue> m_timer;
360         Deque<WorkItem*> m_queue;
361         bool m_frozen;
362         LayoutTestController* m_controller;
363     };
364
365     // Support for overridePreference.
366     bool cppVariantToBool(const CppVariant&);
367     int32_t cppVariantToInt32(const CppVariant&);
368     WebKit::WebString cppVariantToWebString(const CppVariant&);
369
370     void logErrorToConsole(const std::string&);
371     void completeNotifyDone(bool isTimeout);
372
373     bool pauseAnimationAtTimeOnElementWithId(const WebKit::WebString& animationName, double time, const WebKit::WebString& elementId);
374     bool pauseTransitionAtTimeOnElementWithId(const WebKit::WebString& propertyName, double time, const WebKit::WebString& elementId);
375     bool elementDoesAutoCompleteForElementWithId(const WebKit::WebString&);
376     int numberOfActiveAnimations();
377
378     // Used for test timeouts.
379     ScopedRunnableMethodFactory<LayoutTestController> m_timeoutFactory;
380
381     // Non-owning pointer.  The LayoutTestController is owned by the host.
382     TestShell* m_shell;
383
384     // If true, the test_shell will produce a plain text dump rather than a
385     // text representation of the renderer.
386     bool m_dumpAsText;
387
388     // If true, the test_shell will write a descriptive line for each editing
389     // command.
390     bool m_dumpEditingCallbacks;
391
392     // If true, the test_shell will draw the bounds of the current selection rect
393     // taking possible transforms of the selection rect into account.
394     bool m_dumpSelectionRect;
395
396     // If true, the test_shell will output a descriptive line for each frame
397     // load callback.
398     bool m_dumpFrameLoadCallbacks;
399
400     // If true, the test_shell will output a descriptive line for each resource
401     // load callback.
402     bool m_dumpResourceLoadCallbacks;
403
404     // If true, the test_shell will produce a dump of the back forward list as
405     // well.
406     bool m_dumpBackForwardList;
407
408     // If true, the test_shell will print out the child frame scroll offsets as
409     // well.
410     bool m_dumpChildFrameScrollPositions;
411
412     // If true and if dump_as_text_ is true, the test_shell will recursively
413     // dump all frames as plain text.
414     bool m_dumpChildFramesAsText;
415
416     // If true, the test_shell will dump all changes to window.status.
417     bool m_dumpWindowStatusChanges;
418
419     // If true, output a message when the page title is changed.
420     bool m_dumpTitleChanges;
421
422     // If true, the element will be treated as editable.  This value is returned
423     // from various editing callbacks that are called just before edit operations
424     // are allowed.
425     bool m_acceptsEditing;
426
427     // If true, new windows can be opened via javascript or by plugins.  By
428     // default, set to false and can be toggled to true using
429     // setCanOpenWindows().
430     bool m_canOpenWindows;
431
432     // When reset is called, go through and close all but the main test shell
433     // window.  By default, set to true but toggled to false using
434     // setCloseRemainingWindowsWhenComplete().
435     bool m_closeRemainingWindows;
436
437     // If true, pixel dump will be produced as a series of 1px-tall, view-wide
438     // individual paints over the height of the view.
439     bool m_testRepaint;
440     // If true and test_repaint_ is true as well, pixel dump will be produced as
441     // a series of 1px-wide, view-tall paints across the width of the view.
442     bool m_sweepHorizontally;
443
444     // If true and a drag starts, adds a file to the drag&drop clipboard.
445     bool m_shouldAddFileToPasteboard;
446
447     // If true, stops provisional frame loads during the
448     // DidStartProvisionalLoadForFrame callback.
449     bool m_stopProvisionalFrameLoads;
450
451     // If true, don't dump output until notifyDone is called.
452     bool m_waitUntilDone;
453
454     WorkQueue m_workQueue;
455
456     CppVariant m_globalFlag;
457
458     // Bound variable counting the number of top URLs visited.
459     CppVariant m_webHistoryItemCount;
460
461     WebKit::WebURL m_userStyleSheetLocation;
462 };
463
464 #endif // LayoutTestController_h