2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * Copyright (C) 2010 Pawel Hajdan (phajdan.jr@chromium.org)
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
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
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.
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.
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.
41 #ifndef LayoutTestController_h
42 #define LayoutTestController_h
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>
52 class LayoutTestController : public CppBoundClass {
54 // Builds the property and method lists needed to bind this class to a JS
56 LayoutTestController(TestShell*);
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*);
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*);
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*);
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*);
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*);
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*);
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*);
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*);
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*);
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*);
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();
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*);
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*);
127 // Changes the cookie policy from the default to allow all cookies.
128 void setAlwaysAcceptCookies(const CppArgumentList&, CppVariant*);
130 // Shows DevTools window.
131 void showWebInspector(const CppArgumentList&, CppVariant*);
133 // Gives focus to the window.
134 void setWindowIsKey(const CppArgumentList&, CppVariant*);
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*);
140 // Passes through to WebPreferences which allows the user to have a custom
142 void setUserStyleSheetEnabled(const CppArgumentList&, CppVariant*);
143 void setUserStyleSheetLocation(const CppArgumentList&, CppVariant*);
145 // Passes this preference through to WebSettings.
146 void setAuthorAndUserStylesEnabled(const CppArgumentList&, CppVariant*);
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*);
153 void setScrollbarPolicy(const CppArgumentList&, CppVariant*);
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*);
160 // Delays completion of the test until the policy delegate runs.
161 void waitForPolicyDelegate(const CppArgumentList&, CppVariant*);
163 // Causes WillSendRequest to clear certain headers.
164 void setWillSendRequestClearHeader(const CppArgumentList&, CppVariant*);
166 // Causes WillSendRequest to block redirects.
167 void setWillSendRequestReturnsNullOnRedirect(const CppArgumentList&, CppVariant*);
169 // Causes WillSendRequest to return an empty request.
170 void setWillSendRequestReturnsNull(const CppArgumentList&, CppVariant*);
172 // Converts a URL starting with file:///tmp/ to the local mapping.
173 void pathToLocalResource(const CppArgumentList&, CppVariant*);
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*);
179 // Executes an internal command (superset of document.execCommand() commands).
180 void execCommand(const CppArgumentList&, CppVariant*);
182 // Checks if an internal command is currently available.
183 void isCommandEnabled(const CppArgumentList&, CppVariant*);
185 // Set the WebPreference that controls webkit's popup blocking.
186 void setPopupBlockingEnabled(const CppArgumentList&, CppVariant*);
188 // If true, causes provisional frame loads to be stopped for the remainder of
190 void setStopProvisionalFrameLoads(const CppArgumentList&, CppVariant*);
192 // Enable or disable smart insert/delete. This is enabled by default.
193 void setSmartInsertDeleteEnabled(const CppArgumentList&, CppVariant*);
195 // Enable or disable trailing whitespace selection on double click.
196 void setSelectTrailingWhitespaceEnabled(const CppArgumentList&, CppVariant*);
198 void pauseAnimationAtTimeOnElementWithId(const CppArgumentList&, CppVariant*);
199 void pauseTransitionAtTimeOnElementWithId(const CppArgumentList&, CppVariant*);
200 void elementDoesAutoCompleteForElementWithId(const CppArgumentList&, CppVariant*);
201 void numberOfActiveAnimations(const CppArgumentList&, CppVariant*);
203 void disableImageLoading(const CppArgumentList&, CppVariant*);
205 void setIconDatabaseEnabled(const CppArgumentList&, CppVariant*);
207 void dumpSelectionRect(const CppArgumentList&, CppVariant*);
209 // Grants permission for desktop notifications to an origin
210 void grantDesktopNotificationPermission(const CppArgumentList&, CppVariant*);
212 void setEditingBehavior(const CppArgumentList&, CppVariant*);
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*);
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*);
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*);
248 // Allows layout tests to manage origins' whitelisting.
249 void addOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
250 void removeOriginAccessWhitelistEntry(const CppArgumentList&, CppVariant*);
252 // Clears all databases.
253 void clearAllDatabases(const CppArgumentList&, CppVariant*);
254 // Sets the default quota for all origins
255 void setDatabaseQuota(const CppArgumentList&, CppVariant*);
257 // Calls setlocale(LC_ALL, ...) for a specified locale.
258 // Resets between tests.
259 void setPOSIXLocale(const CppArgumentList&, CppVariant*);
261 // Gets the value of the counter in the element specified by its ID.
262 void counterValueForElementById(const CppArgumentList&, CppVariant*);
264 // Gets the number of page where the specified element will be put.
265 void pageNumberForElementById(const CppArgumentList&, CppVariant*);
267 // Gets the number of pages to be printed.
268 void numberOfPages(const CppArgumentList&, CppVariant*);
271 // Allows layout tests to start Timeline profiling.
272 void setTimelineProfilingEnabled(const CppArgumentList&, CppVariant*);
274 // Allows layout tests to exec scripts at WebInspector side.
275 void evaluateInWebInspector(const CppArgumentList&, CppVariant*);
277 // Forces the selection colors for testing under Linux.
278 void forceRedSelectionColors(const CppArgumentList&, CppVariant*);
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*);
284 // Geolocation related functions.
285 void setGeolocationPermission(const CppArgumentList&, CppVariant*);
286 void setMockGeolocationPosition(const CppArgumentList&, CppVariant*);
287 void setMockGeolocationError(const CppArgumentList&, CppVariant*);
289 // Empty stub method to keep parity with object model exposed by global LayoutTestController.
290 void abortModal(const CppArgumentList&, CppVariant*);
293 // The following methods are not exposed to JavaScript.
294 void setWorkQueueFrozen(bool frozen) { m_workQueue.setFrozen(frozen); }
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; }
312 bool testRepaint() const { return m_testRepaint; }
313 bool sweepHorizontally() const { return m_sweepHorizontally; }
315 // Called by the webview delegate when the toplevel frame load is done.
316 void locationChangeDone();
318 // Called by the webview delegate when the policy delegate runs if the
319 // waitForPolicyDelegate was called.
320 void policyDelegateDone();
322 // Reinitializes all static values. The reset() method should be called
323 // before the start of each test (currently from
324 // TestShell::runFileTest).
327 // A single item in the work queue.
330 virtual ~WorkItem() {}
332 // Returns true if this started a load.
333 virtual bool run(TestShell* shell) = 0;
337 friend class WorkItem;
338 friend class WorkQueue;
340 // Helper class for managing events queued by methods like queueLoad or
344 WorkQueue(LayoutTestController* controller) : m_frozen(false), m_controller(controller) {}
345 virtual ~WorkQueue();
346 void processWorkSoon();
348 // Reset the state of the class between tests.
351 void addWork(WorkItem* work);
353 void setFrozen(bool frozen) { m_frozen = frozen; }
354 bool isEmpty() { return m_queue.isEmpty(); }
359 base::OneShotTimer<WorkQueue> m_timer;
360 Deque<WorkItem*> m_queue;
362 LayoutTestController* m_controller;
365 // Support for overridePreference.
366 bool cppVariantToBool(const CppVariant&);
367 int32_t cppVariantToInt32(const CppVariant&);
368 WebKit::WebString cppVariantToWebString(const CppVariant&);
370 void logErrorToConsole(const std::string&);
371 void completeNotifyDone(bool isTimeout);
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();
378 // Used for test timeouts.
379 ScopedRunnableMethodFactory<LayoutTestController> m_timeoutFactory;
381 // Non-owning pointer. The LayoutTestController is owned by the host.
384 // If true, the test_shell will produce a plain text dump rather than a
385 // text representation of the renderer.
388 // If true, the test_shell will write a descriptive line for each editing
390 bool m_dumpEditingCallbacks;
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;
396 // If true, the test_shell will output a descriptive line for each frame
398 bool m_dumpFrameLoadCallbacks;
400 // If true, the test_shell will output a descriptive line for each resource
402 bool m_dumpResourceLoadCallbacks;
404 // If true, the test_shell will produce a dump of the back forward list as
406 bool m_dumpBackForwardList;
408 // If true, the test_shell will print out the child frame scroll offsets as
410 bool m_dumpChildFrameScrollPositions;
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;
416 // If true, the test_shell will dump all changes to window.status.
417 bool m_dumpWindowStatusChanges;
419 // If true, output a message when the page title is changed.
420 bool m_dumpTitleChanges;
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
425 bool m_acceptsEditing;
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;
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;
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.
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;
444 // If true and a drag starts, adds a file to the drag&drop clipboard.
445 bool m_shouldAddFileToPasteboard;
447 // If true, stops provisional frame loads during the
448 // DidStartProvisionalLoadForFrame callback.
449 bool m_stopProvisionalFrameLoads;
451 // If true, don't dump output until notifyDone is called.
452 bool m_waitUntilDone;
454 WorkQueue m_workQueue;
456 CppVariant m_globalFlag;
458 // Bound variable counting the number of top URLs visited.
459 CppVariant m_webHistoryItemCount;
461 WebKit::WebURL m_userStyleSheetLocation;
464 #endif // LayoutTestController_h