2011-06-13 Chris Rogers <crogers@google.com>
[WebKit-https.git] / Tools / 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 "WebString.h"
47 #include "WebTextDirection.h"
48 #include "WebURL.h"
49 #include <wtf/Deque.h>
50 #include <wtf/OwnPtr.h>
51
52 namespace WebKit {
53 class WebGeolocationClientMock;
54 class WebSpeechInputController;
55 class WebSpeechInputControllerMock;
56 class WebSpeechInputListener;
57 }
58
59 namespace webkit_support {
60 class ScopedTempDirectory;
61 }
62
63 class TestShell;
64
65 class LayoutTestController : public CppBoundClass {
66 public:
67     // Builds the property and method lists needed to bind this class to a JS
68     // object.
69     LayoutTestController(TestShell*);
70
71     ~LayoutTestController();
72
73     // This function sets a flag that tells the test_shell to dump pages as
74     // plain text, rather than as a text representation of the renderer's state.
75     // It takes an optional argument, whether to dump pixels results or not.
76     void dumpAsText(const CppArgumentList&, CppVariant*);
77
78     // This function should set a flag that tells the test_shell to print a line
79     // of descriptive text for each database command. It should take no
80     // arguments, and ignore any that may be present. However, at the moment, we
81     // don't have any DB function that prints messages, so for now this function
82     // doesn't do anything.
83     void dumpDatabaseCallbacks(const CppArgumentList&, CppVariant*);
84
85     // This function sets a flag that tells the test_shell to print a line of
86     // descriptive text for each editing command. It takes no arguments, and
87     // ignores any that may be present.
88     void dumpEditingCallbacks(const CppArgumentList&, CppVariant*);
89
90     // This function sets a flag that tells the test_shell to print a line of
91     // descriptive text for each frame load callback. It takes no arguments, and
92     // ignores any that may be present.
93     void dumpFrameLoadCallbacks(const CppArgumentList&, CppVariant*);
94
95     // This function sets a flag that tells the test_shell to print a line of
96     // user gesture status text for some frame load callbacks. It takes no
97     // arguments, and ignores any that may be present.
98     void dumpUserGestureInFrameLoadCallbacks(const CppArgumentList&, CppVariant*);
99
100     // This function sets a flag that tells the test_shell to print out a text
101     // representation of the back/forward list. It ignores all arguments.
102     void dumpBackForwardList(const CppArgumentList&, CppVariant*);
103
104     // This function sets a flag that tells the test_shell to print out the
105     // scroll offsets of the child frames. It ignores all.
106     void dumpChildFrameScrollPositions(const CppArgumentList&, CppVariant*);
107
108     // This function sets a flag that tells the test_shell to recursively
109     // dump all frames as plain text if the dumpAsText flag is set.
110     // It takes no arguments, and ignores any that may be present.
111     void dumpChildFramesAsText(const CppArgumentList&, CppVariant*);
112     
113     // This function sets a flag that tells the test_shell to dump a descriptive
114     // line for each resource load callback. It takes no arguments, and ignores
115     // any that may be present.
116     void dumpResourceLoadCallbacks(const CppArgumentList&, CppVariant*);    
117     
118     // This function sets a flag that tells the test_shell to dump the MIME type
119     // for each resource that was loaded. It takes no arguments, and ignores any
120     // that may be present.
121     void dumpResourceResponseMIMETypes(const CppArgumentList&, CppVariant*);
122
123     // This function sets a flag that tells the test_shell to dump all calls
124     // to window.status().
125     // It takes no arguments, and ignores any that may be present.
126     void dumpWindowStatusChanges(const CppArgumentList&, CppVariant*);
127
128     // When called with a boolean argument, this sets a flag that controls
129     // whether content-editable elements accept editing focus when an editing
130     // attempt is made. It ignores any additional arguments.
131     void setAcceptsEditing(const CppArgumentList&, CppVariant*);
132
133     // Functions for dealing with windows. By default we block all new windows.
134     void windowCount(const CppArgumentList&, CppVariant*);
135     void setCanOpenWindows(const CppArgumentList&, CppVariant*);
136     void setCloseRemainingWindowsWhenComplete(const CppArgumentList&, CppVariant*);
137
138     // By default, tests end when page load is complete. These methods are used
139     // to delay the completion of the test until notifyDone is called.
140     void waitUntilDone(const CppArgumentList&, CppVariant*);
141     void notifyDone(const CppArgumentList&, CppVariant*);
142
143     // Methods for adding actions to the work queue. Used in conjunction with
144     // waitUntilDone/notifyDone above.
145     void queueBackNavigation(const CppArgumentList&, CppVariant*);
146     void queueForwardNavigation(const CppArgumentList&, CppVariant*);
147     void queueReload(const CppArgumentList&, CppVariant*);
148     void queueLoadingScript(const CppArgumentList&, CppVariant*);
149     void queueNonLoadingScript(const CppArgumentList&, CppVariant*);
150     void queueLoad(const CppArgumentList&, CppVariant*);
151     void queueLoadHTMLString(const CppArgumentList&, CppVariant*);
152
153     // Although this is named "objC" to match the Mac version, it actually tests
154     // the identity of its two arguments in C++.
155     void objCIdentityIsEqual(const CppArgumentList&, CppVariant*);
156
157     // Changes the cookie policy from the default to allow all cookies.
158     void setAlwaysAcceptCookies(const CppArgumentList&, CppVariant*);
159
160     // Changes asynchronous spellchecking flag on the settings.
161     void setAsynchronousSpellCheckingEnabled(const CppArgumentList&, CppVariant*);
162
163     // Shows DevTools window.
164     void showWebInspector(const CppArgumentList&, CppVariant*);
165     void closeWebInspector(const CppArgumentList&, CppVariant*);
166
167     // Gives focus to the window.
168     void setWindowIsKey(const CppArgumentList&, CppVariant*);
169
170     // Method that controls whether pressing Tab key cycles through page elements
171     // or inserts a '\t' char in text area
172     void setTabKeyCyclesThroughElements(const CppArgumentList&, CppVariant*);
173
174     // Passes through to WebPreferences which allows the user to have a custom
175     // style sheet.
176     void setUserStyleSheetEnabled(const CppArgumentList&, CppVariant*);
177     void setUserStyleSheetLocation(const CppArgumentList&, CppVariant*);
178
179     // Passes this preference through to WebSettings.
180     void setAuthorAndUserStylesEnabled(const CppArgumentList&, CppVariant*);
181
182     // Puts Webkit in "dashboard compatibility mode", which is used in obscure
183     // Mac-only circumstances. It's not really necessary, and will most likely
184     // never be used by Chrome, but some layout tests depend on its presence.
185     void setUseDashboardCompatibilityMode(const CppArgumentList&, CppVariant*);
186
187     void setScrollbarPolicy(const CppArgumentList&, CppVariant*);
188
189     // Causes navigation actions just printout the intended navigation instead
190     // of taking you to the page. This is used for cases like mailto, where you
191     // don't actually want to open the mail program.
192     void setCustomPolicyDelegate(const CppArgumentList&, CppVariant*);
193
194     // Delays completion of the test until the policy delegate runs.
195     void waitForPolicyDelegate(const CppArgumentList&, CppVariant*);
196
197     // Causes WillSendRequest to clear certain headers.
198     void setWillSendRequestClearHeader(const CppArgumentList&, CppVariant*);
199
200     // Causes WillSendRequest to block redirects.
201     void setWillSendRequestReturnsNullOnRedirect(const CppArgumentList&, CppVariant*);
202
203     // Causes WillSendRequest to return an empty request.
204     void setWillSendRequestReturnsNull(const CppArgumentList&, CppVariant*);
205
206     // Converts a URL starting with file:///tmp/ to the local mapping.
207     void pathToLocalResource(const CppArgumentList&, CppVariant*);
208
209     // Sets a bool such that when a drag is started, we fill the drag clipboard
210     // with a fake file object.
211     void addFileToPasteboardOnDrag(const CppArgumentList&, CppVariant*);
212
213     // Executes an internal command (superset of document.execCommand() commands).
214     void execCommand(const CppArgumentList&, CppVariant*);
215
216     // Checks if an internal command is currently available.
217     void isCommandEnabled(const CppArgumentList&, CppVariant*);
218
219     // Set the WebPreference that controls webkit's popup blocking.
220     void setPopupBlockingEnabled(const CppArgumentList&, CppVariant*);
221
222     // If true, causes provisional frame loads to be stopped for the remainder of
223     // the test.
224     void setStopProvisionalFrameLoads(const CppArgumentList&, CppVariant*);
225
226     // Enable or disable smart insert/delete. This is enabled by default.
227     void setSmartInsertDeleteEnabled(const CppArgumentList&, CppVariant*);
228
229     // Enable or disable trailing whitespace selection on double click.
230     void setSelectTrailingWhitespaceEnabled(const CppArgumentList&, CppVariant*);
231
232     void pauseAnimationAtTimeOnElementWithId(const CppArgumentList&, CppVariant*);
233     void pauseTransitionAtTimeOnElementWithId(const CppArgumentList&, CppVariant*);
234     void elementDoesAutoCompleteForElementWithId(const CppArgumentList&, CppVariant*);
235     void numberOfActiveAnimations(const CppArgumentList&, CppVariant*);
236     void suspendAnimations(const CppArgumentList&, CppVariant*);
237     void resumeAnimations(const CppArgumentList&, CppVariant*);
238     void sampleSVGAnimationForElementAtTime(const CppArgumentList&, CppVariant*);
239     void disableImageLoading(const CppArgumentList&, CppVariant*);
240     void setIconDatabaseEnabled(const CppArgumentList&, CppVariant*);
241     void dumpSelectionRect(const CppArgumentList&, CppVariant*);
242
243     // Grants permission for desktop notifications to an origin
244     void grantDesktopNotificationPermission(const CppArgumentList&, CppVariant*);
245     // Simulates a click on a desktop notification.
246     void simulateDesktopNotificationClick(const CppArgumentList&, CppVariant*);
247
248     void setDomainRelaxationForbiddenForURLScheme(const CppArgumentList&, CppVariant*);
249     void setDeferMainResourceDataLoad(const CppArgumentList&, CppVariant*);
250     void setEditingBehavior(const CppArgumentList&, CppVariant*);
251
252     // Deals with Web Audio base64 encoded WAVE file data.
253     void setEncodedAudioData(const CppArgumentList&, CppVariant*);
254     const std::string& encodedAudioData() const { return m_encodedAudioData; } 
255
256     // The following are only stubs.
257     // FIXME: Implement any of these that are needed to pass the layout tests.
258     void dumpAsWebArchive(const CppArgumentList&, CppVariant*);
259     void dumpTitleChanges(const CppArgumentList&, CppVariant*);
260     void setMainFrameIsFirstResponder(const CppArgumentList&, CppVariant*);
261     void display(const CppArgumentList&, CppVariant*);
262     void displayInvalidatedRegion(const CppArgumentList&, CppVariant*);
263     void testRepaint(const CppArgumentList&, CppVariant*);
264     void repaintSweepHorizontally(const CppArgumentList&, CppVariant*);
265     void clearBackForwardList(const CppArgumentList&, CppVariant*);
266     void keepWebHistory(const CppArgumentList&, CppVariant*);
267     void storeWebScriptObject(const CppArgumentList&, CppVariant*);
268     void accessStoredWebScriptObject(const CppArgumentList&, CppVariant*);
269     void objCClassNameOf(const CppArgumentList&, CppVariant*);
270     void addDisallowedURL(const CppArgumentList&, CppVariant*);
271     void callShouldCloseOnWebView(const CppArgumentList&, CppVariant*);
272     void setCallCloseOnWebViews(const CppArgumentList&, CppVariant*);
273     void setPrivateBrowsingEnabled(const CppArgumentList&, CppVariant*);
274
275     void setJavaScriptCanAccessClipboard(const CppArgumentList&, CppVariant*);
276     void setXSSAuditorEnabled(const CppArgumentList&, CppVariant*);
277     void overridePreference(const CppArgumentList&, CppVariant*);
278     void setAllowUniversalAccessFromFileURLs(const CppArgumentList&, CppVariant*);
279     void setAllowDisplayOfInsecureContent(const CppArgumentList&, CppVariant*);
280     void setAllowFileAccessFromFileURLs(const CppArgumentList&, CppVariant*);
281     void setAllowRunningOfInsecureContent(const CppArgumentList&, CppVariant*);
282
283     void evaluateScriptInIsolatedWorld(const CppArgumentList&, CppVariant*);
284     void setIsolatedWorldSecurityOrigin(const CppArgumentList&, CppVariant*);
285
286     void shadowRoot(const CppArgumentList&, CppVariant*);
287     void ensureShadowRoot(const CppArgumentList&, CppVariant*);
288     void removeShadowRoot(const CppArgumentList&, CppVariant*);
289     void shadowPseudoId(const CppArgumentList&, CppVariant*);
290
291     // The fallback method is called when a nonexistent method is called on
292     // the layout test controller object.
293     // It is usefull to catch typos in the JavaScript code (a few layout tests
294     // do have typos in them) and it allows the script to continue running in
295     // that case (as the Mac does).
296     void fallbackMethod(const CppArgumentList&, CppVariant*);
297
298     // Allows layout tests to manage origins' whitelisting.
299     void addOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
300     void removeOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
301
302     // Clears all application caches.
303     void clearAllApplicationCaches(const CppArgumentList&, CppVariant*);
304     // Clears an application cache for an origin.
305     void clearApplicationCacheForOrigin(const CppArgumentList&, CppVariant*);
306     // Returns origins that have application caches.
307     void originsWithApplicationCache(const CppArgumentList&, CppVariant*);
308     // Sets the application cache quota for the localhost origin.
309     void setApplicationCacheOriginQuota(const CppArgumentList&, CppVariant*);
310     // Returns disk usage by all application caches for an origin.
311     void applicationCacheDiskUsageForOrigin(const CppArgumentList&, CppVariant*);
312
313     // Clears all databases.
314     void clearAllDatabases(const CppArgumentList&, CppVariant*);
315     // Sets the default quota for all origins
316     void setDatabaseQuota(const CppArgumentList&, CppVariant*);
317     // Overrides the backend for IndexedDB
318     void setOverrideIndexedDBBackingStore(const CppArgumentList&, CppVariant*);
319
320     // Calls setlocale(LC_ALL, ...) for a specified locale.
321     // Resets between tests.
322     void setPOSIXLocale(const CppArgumentList&, CppVariant*);
323
324     // Gets the value of the counter in the element specified by its ID.
325     void counterValueForElementById(const CppArgumentList&, CppVariant*);
326
327     // Gets the number of page where the specified element will be put.
328     void pageNumberForElementById(const CppArgumentList&, CppVariant*);
329
330     // Gets the number of pages to be printed.
331     void numberOfPages(const CppArgumentList&, CppVariant*);
332
333     // Gets the number of geolocation permissions requests pending.
334     void numberOfPendingGeolocationPermissionRequests(const CppArgumentList&, CppVariant*);
335
336     // Allows layout tests to start JavaScript profiling.
337     void setJavaScriptProfilingEnabled(const CppArgumentList&, CppVariant*);
338
339     // Allows layout tests to start Timeline profiling.
340     void setTimelineProfilingEnabled(const CppArgumentList&, CppVariant*);
341
342     // Allows layout tests to exec scripts at WebInspector side.
343     void evaluateInWebInspector(const CppArgumentList&, CppVariant*);
344
345     // Adds a user script or user style sheet to be injected into new documents.
346     void addUserScript(const CppArgumentList&, CppVariant*);
347     void addUserStyleSheet(const CppArgumentList&, CppVariant*);
348
349     // DeviceOrientation related functions
350     void setMockDeviceOrientation(const CppArgumentList&, CppVariant*);
351
352     // Geolocation related functions.
353     void setGeolocationPermission(const CppArgumentList&, CppVariant*);
354     void setMockGeolocationPosition(const CppArgumentList&, CppVariant*);
355     void setMockGeolocationError(const CppArgumentList&, CppVariant*);
356
357     // Empty stub method to keep parity with object model exposed by global LayoutTestController.
358     void abortModal(const CppArgumentList&, CppVariant*);
359
360     // Speech input related functions.
361     void addMockSpeechInputResult(const CppArgumentList&, CppVariant*);
362
363     void layerTreeAsText(const CppArgumentList& args, CppVariant* result);
364
365     void markerTextForListItem(const CppArgumentList&, CppVariant*);
366     void hasSpellingMarker(const CppArgumentList&, CppVariant*);
367
368     void setMinimumTimerInterval(const CppArgumentList&, CppVariant*);
369
370     // Expects the first argument to be an input element and the second argument to be a boolean.
371     // Forwards the setAutofilled() call to the element.
372     void setAutofilled(const CppArgumentList&, CppVariant*);
373
374     // Expects the first argument to be an input element and the second argument to be a string value.
375     // Forwards the setValueForUser() call to the element.
376     void setValueForUser(const CppArgumentList&, CppVariant*);
377
378     // LocalStorage origin-related
379     void deleteAllLocalStorage(const CppArgumentList&, CppVariant*);
380     void originsWithLocalStorage(const CppArgumentList&, CppVariant*);
381     void deleteLocalStorageForOrigin(const CppArgumentList&, CppVariant*);
382     void localStorageDiskUsageForOrigin(const CppArgumentList&, CppVariant*);
383     void observeStorageTrackerNotifications(const CppArgumentList&, CppVariant*);
384     void syncLocalStorage(const CppArgumentList&, CppVariant*);
385
386     // WebPermissionClient related.
387     void setImagesAllowed(const CppArgumentList&, CppVariant*);
388     void setStorageAllowed(const CppArgumentList&, CppVariant*);
389
390     // Enable or disable plugins.
391     void setPluginsEnabled(const CppArgumentList&, CppVariant*);
392
393     // Switch the visibility of the page.
394     void setPageVisibility(const CppArgumentList&, CppVariant*);
395     void resetPageVisibility(const CppArgumentList&, CppVariant*);
396
397     // Changes the direction of the focused element.
398     void setTextDirection(const CppArgumentList&, CppVariant*);
399
400 public:
401     // The following methods are not exposed to JavaScript.
402     void setWorkQueueFrozen(bool frozen) { m_workQueue.setFrozen(frozen); }
403
404     WebKit::WebSpeechInputController* speechInputController(WebKit::WebSpeechInputListener*);
405     bool shouldDumpAsAudio() const { return m_dumpAsAudio; } 
406     void setShouldDumpAsAudio(bool dumpAsAudio) { m_dumpAsAudio = dumpAsAudio; } 
407     bool shouldDumpAsText() { return m_dumpAsText; }
408     void setShouldDumpAsText(bool value) { m_dumpAsText = value; }
409     bool shouldDumpEditingCallbacks() { return m_dumpEditingCallbacks; }
410     bool shouldDumpFrameLoadCallbacks() { return m_dumpFrameLoadCallbacks; }
411     void setShouldDumpFrameLoadCallbacks(bool value) { m_dumpFrameLoadCallbacks = value; }
412     bool shouldDumpUserGestureInFrameLoadCallbacks() { return m_dumpUserGestureInFrameLoadCallbacks; }
413     void setShouldDumpUserGestureInFrameLoadCallbacks(bool value) { m_dumpUserGestureInFrameLoadCallbacks = value; }
414     bool shouldDumpResourceLoadCallbacks() {return m_dumpResourceLoadCallbacks; }
415     void setShouldDumpResourceResponseMIMETypes(bool value) { m_dumpResourceResponseMIMETypes = value; }
416     bool shouldDumpResourceResponseMIMETypes() {return m_dumpResourceResponseMIMETypes; }
417     bool shouldDumpStatusCallbacks() { return m_dumpWindowStatusChanges; }
418     bool shouldDumpSelectionRect() { return m_dumpSelectionRect; }
419     bool shouldDumpBackForwardList() { return m_dumpBackForwardList; }
420     bool shouldDumpTitleChanges() { return m_dumpTitleChanges; }
421     bool shouldDumpChildFrameScrollPositions() { return m_dumpChildFrameScrollPositions; }
422     bool shouldDumpChildFramesAsText() { return m_dumpChildFramesAsText; }
423     bool shouldGeneratePixelResults() { return m_generatePixelResults; }
424     void setShouldGeneratePixelResults(bool value) { m_generatePixelResults = value; }
425     bool acceptsEditing() { return m_acceptsEditing; }
426     bool canOpenWindows() { return m_canOpenWindows; }
427     bool shouldAddFileToPasteboard() { return m_shouldAddFileToPasteboard; }
428     bool stopProvisionalFrameLoads() { return m_stopProvisionalFrameLoads; }
429     bool deferMainResourceDataLoad() { return m_deferMainResourceDataLoad; }
430     void setShowDebugLayerTree(bool value) { m_showDebugLayerTree = value; }
431     void setTitleTextDirection(WebKit::WebTextDirection dir)
432     {
433         m_titleTextDirection.set(dir == WebKit::WebTextDirectionLeftToRight ? "ltr" : "rtl");
434     }
435
436     bool testRepaint() const { return m_testRepaint; }
437     bool sweepHorizontally() const { return m_sweepHorizontally; }
438
439     // Called by the webview delegate when the toplevel frame load is done.
440     void locationChangeDone();
441
442     // Called by the webview delegate when the policy delegate runs if the
443     // waitForPolicyDelegate was called.
444     void policyDelegateDone();
445
446     // Reinitializes all static values. The reset() method should be called
447     // before the start of each test (currently from TestShell::runFileTest).
448     void reset();
449
450     // A single item in the work queue.
451     class WorkItem {
452     public:
453         virtual ~WorkItem() { }
454
455         // Returns true if this started a load.
456         virtual bool run(TestShell*) = 0;
457     };
458
459     TaskList* taskList() { return &m_taskList; }
460
461 private:
462     friend class WorkItem;
463     friend class WorkQueue;
464
465     // Helper class for managing events queued by methods like queueLoad or
466     // queueScript.
467     class WorkQueue {
468     public:
469         WorkQueue(LayoutTestController* controller) : m_frozen(false), m_controller(controller) { }
470         virtual ~WorkQueue();
471         void processWorkSoon();
472
473         // Reset the state of the class between tests.
474         void reset();
475
476         void addWork(WorkItem*);
477
478         void setFrozen(bool frozen) { m_frozen = frozen; }
479         bool isEmpty() { return m_queue.isEmpty(); }
480         TaskList* taskList() { return &m_taskList; }
481
482     private:
483         void processWork();
484         class WorkQueueTask: public MethodTask<WorkQueue> {
485         public:
486             WorkQueueTask(WorkQueue* object): MethodTask<WorkQueue>(object) { }
487             virtual void runIfValid() { m_object->processWork(); }
488         };
489
490         TaskList m_taskList;
491         Deque<WorkItem*> m_queue;
492         bool m_frozen;
493         LayoutTestController* m_controller;
494     };
495
496     // Support for overridePreference.
497     bool cppVariantToBool(const CppVariant&);
498     int32_t cppVariantToInt32(const CppVariant&);
499     WebKit::WebString cppVariantToWebString(const CppVariant&);
500
501     void logErrorToConsole(const std::string&);
502     void completeNotifyDone(bool isTimeout);
503     class NotifyDoneTimedOutTask: public MethodTask<LayoutTestController> {
504     public:
505         NotifyDoneTimedOutTask(LayoutTestController* object): MethodTask<LayoutTestController>(object) { }
506         virtual void runIfValid() { m_object->completeNotifyDone(true); }
507     };
508
509
510     bool pauseAnimationAtTimeOnElementWithId(const WebKit::WebString& animationName, double time, const WebKit::WebString& elementId);
511     bool pauseTransitionAtTimeOnElementWithId(const WebKit::WebString& propertyName, double time, const WebKit::WebString& elementId);
512     bool elementDoesAutoCompleteForElementWithId(const WebKit::WebString&);
513     int numberOfActiveAnimations();
514     void suspendAnimations();
515     void resumeAnimations();
516
517     // Used for test timeouts.
518     TaskList m_taskList;
519
520     // Non-owning pointer. The LayoutTestController is owned by the host.
521     TestShell* m_shell;
522
523     // If true, the test_shell will produce a plain text dump rather than a
524     // text representation of the renderer.
525     bool m_dumpAsText;
526
527     // If true, the test_shell will output a base64 encoded WAVE file.
528     bool m_dumpAsAudio;
529
530     // If true, the test_shell will write a descriptive line for each editing
531     // command.
532     bool m_dumpEditingCallbacks;
533
534     // If true, the test_shell will draw the bounds of the current selection rect
535     // taking possible transforms of the selection rect into account.
536     bool m_dumpSelectionRect;
537
538     // If true, the test_shell will output a descriptive line for each frame
539     // load callback.
540     bool m_dumpFrameLoadCallbacks;
541
542     // If true, the test_shell will output a line of the user gesture status
543     // text for some frame load callbacks.
544     bool m_dumpUserGestureInFrameLoadCallbacks;
545
546     // If true, the test_shell will output a descriptive line for each resource
547     // load callback.
548     bool m_dumpResourceLoadCallbacks;
549     
550     // If true, the test_shell will output the MIME type for each resource that 
551     // was loaded.
552     bool m_dumpResourceResponseMIMETypes;
553
554     // If true, the test_shell will produce a dump of the back forward list as
555     // well.
556     bool m_dumpBackForwardList;
557
558     // If true, the test_shell will print out the child frame scroll offsets as
559     // well.
560     bool m_dumpChildFrameScrollPositions;
561
562     // If true and if dump_as_text_ is true, the test_shell will recursively
563     // dump all frames as plain text.
564     bool m_dumpChildFramesAsText;
565
566     // If true, the test_shell will dump all changes to window.status.
567     bool m_dumpWindowStatusChanges;
568
569     // If true, output a message when the page title is changed.
570     bool m_dumpTitleChanges;
571
572     // If true, the test_shell will generate pixel results in dumpAsText mode
573     bool m_generatePixelResults;
574
575     // If true, the element will be treated as editable. This value is returned
576     // from various editing callbacks that are called just before edit operations
577     // are allowed.
578     bool m_acceptsEditing;
579
580     // If true, new windows can be opened via javascript or by plugins. By
581     // default, set to false and can be toggled to true using
582     // setCanOpenWindows().
583     bool m_canOpenWindows;
584
585     // When reset is called, go through and close all but the main test shell
586     // window. By default, set to true but toggled to false using
587     // setCloseRemainingWindowsWhenComplete().
588     bool m_closeRemainingWindows;
589
590     // If true, pixel dump will be produced as a series of 1px-tall, view-wide
591     // individual paints over the height of the view.
592     bool m_testRepaint;
593     // If true and test_repaint_ is true as well, pixel dump will be produced as
594     // a series of 1px-wide, view-tall paints across the width of the view.
595     bool m_sweepHorizontally;
596
597     // If true and a drag starts, adds a file to the drag&drop clipboard.
598     bool m_shouldAddFileToPasteboard;
599
600     // If true, stops provisional frame loads during the
601     // DidStartProvisionalLoadForFrame callback.
602     bool m_stopProvisionalFrameLoads;
603
604     // If true, don't dump output until notifyDone is called.
605     bool m_waitUntilDone;
606
607     // If false, all new requests will not defer the main resource data load.
608     bool m_deferMainResourceDataLoad;
609
610     // If true, we will show extended information in the graphics layer tree.
611     bool m_showDebugLayerTree;
612
613     WorkQueue m_workQueue;
614
615     CppVariant m_globalFlag;
616
617     // Used to create and destroy temporary folders.
618     OwnPtr<webkit_support::ScopedTempDirectory> m_tempFolder;
619
620     // Bound variable counting the number of top URLs visited.
621     CppVariant m_webHistoryItemCount;
622
623     // Bound variable tracking the directionality of the <title> tag.
624     CppVariant m_titleTextDirection;
625
626     WebKit::WebURL m_userStyleSheetLocation;
627
628     OwnPtr<WebKit::WebSpeechInputControllerMock> m_speechInputControllerMock;
629
630     // base64 encoded WAV audio data is stored here.
631     std::string m_encodedAudioData;
632 };
633
634 #endif // LayoutTestController_h