2011-05-09 Shishir Agrawal <shishir@chromium.org>
[WebKit-https.git] / Tools / DumpRenderTree / LayoutTestController.cpp
1 /*
2  * Copyright (C) 2007, 2008, 2009, 2011 Apple Inc. All rights reserved.
3  * Copyright (C) 2010 Joone Hur <joone@kldp.org>
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer. 
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution. 
14  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission. 
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include "config.h"
31 #include "LayoutTestController.h"
32
33 #include "WorkQueue.h"
34 #include "WorkQueueItem.h"
35 #include <cstring>
36 #include <JavaScriptCore/JSContextRef.h>
37 #include <JavaScriptCore/JSObjectRef.h>
38 #include <JavaScriptCore/JSRetainPtr.h>
39 #include <stdio.h>
40 #include <wtf/Assertions.h>
41 #include <wtf/MathExtras.h>
42 #include <wtf/OwnArrayPtr.h>
43 #include <wtf/RefPtr.h>
44
45 LayoutTestController::LayoutTestController(const std::string& testPathOrURL, const std::string& expectedPixelHash)
46     : m_dumpApplicationCacheDelegateCallbacks(false)
47     , m_dumpAsAudio(false)
48     , m_dumpAsPDF(false)
49     , m_dumpAsText(false)
50     , m_dumpBackForwardList(false)
51     , m_dumpChildFrameScrollPositions(false)
52     , m_dumpChildFramesAsText(false)
53     , m_dumpDOMAsWebArchive(false)
54     , m_dumpDatabaseCallbacks(false)
55     , m_dumpEditingCallbacks(false)
56     , m_dumpFrameLoadCallbacks(false)
57     , m_dumpUserGestureInFrameLoadCallbacks(false)
58     , m_dumpHistoryDelegateCallbacks(false)
59     , m_dumpResourceLoadCallbacks(false)
60     , m_dumpResourceResponseMIMETypes(false)
61     , m_dumpSelectionRect(false)
62     , m_dumpSourceAsWebArchive(false)
63     , m_dumpStatusCallbacks(false)
64     , m_dumpTitleChanges(false)
65     , m_dumpIconChanges(false)
66     , m_dumpVisitedLinksCallback(false)
67     , m_dumpWillCacheResponse(false)
68     , m_generatePixelResults(true)
69     , m_callCloseOnWebViews(true)
70     , m_canOpenWindows(false)
71     , m_closeRemainingWindowsWhenComplete(true)
72     , m_newWindowsCopyBackForwardList(false)
73     , m_stopProvisionalFrameLoads(false)
74     , m_testOnscreen(false)
75     , m_testRepaint(false)
76     , m_testRepaintSweepHorizontally(false)
77     , m_waitToDump(false)
78     , m_willSendRequestReturnsNull(false)
79     , m_willSendRequestReturnsNullOnRedirect(false)
80     , m_windowIsKey(true)
81     , m_alwaysAcceptCookies(false)
82     , m_globalFlag(false)
83     , m_isGeolocationPermissionSet(false)
84     , m_geolocationPermission(false)
85     , m_handlesAuthenticationChallenges(false)
86     , m_isPrinting(false)
87     , m_deferMainResourceDataLoad(true)
88     , m_shouldPaintBrokenImage(true)
89     , m_testPathOrURL(testPathOrURL)
90     , m_expectedPixelHash(expectedPixelHash)
91 {
92 }
93
94 PassRefPtr<LayoutTestController> LayoutTestController::create(const std::string& testPathOrURL, const std::string& expectedPixelHash)
95 {
96     return adoptRef(new LayoutTestController(testPathOrURL, expectedPixelHash));
97 }
98
99 // Static Functions
100
101 static JSValueRef dumpApplicationCacheDelegateCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
102 {
103     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
104     controller->setDumpApplicationCacheDelegateCallbacks(true);
105     return JSValueMakeUndefined(context);
106 }
107
108 static JSValueRef dumpAsPDFCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
109 {
110     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
111     controller->setDumpAsPDF(true);
112     return JSValueMakeUndefined(context);
113 }
114
115 static JSValueRef dumpAsTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
116 {
117     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
118     controller->setDumpAsText(true);
119
120     // Optional paramater, describing whether it's allowed to dump pixel results in dumpAsText mode.
121     controller->setGeneratePixelResults(argumentCount > 0 ? JSValueToBoolean(context, arguments[0]) : false);
122
123     return JSValueMakeUndefined(context);
124 }
125
126 static JSValueRef dumpBackForwardListCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
127 {
128     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
129     controller->setDumpBackForwardList(true);
130     return JSValueMakeUndefined(context);
131 }
132
133 static JSValueRef dumpChildFramesAsTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
134 {
135     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
136     controller->setDumpChildFramesAsText(true);
137     return JSValueMakeUndefined(context);
138 }
139
140 static JSValueRef dumpChildFrameScrollPositionsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
141 {
142     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
143     controller->setDumpChildFrameScrollPositions(true);
144     return JSValueMakeUndefined(context);
145 }
146
147 static JSValueRef dumpConfigurationForViewportCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
148 {
149     if (argumentCount < 2)
150         return JSValueMakeUndefined(context);
151
152
153     double deviceDPI = JSValueToNumber(context, arguments[0], exception);
154     ASSERT(!*exception);
155     double deviceWidth = JSValueToNumber(context, arguments[1], exception);
156     ASSERT(!*exception);
157     double deviceHeight = JSValueToNumber(context, arguments[2], exception);
158     ASSERT(!*exception);
159     double availableWidth = JSValueToNumber(context, arguments[3], exception);
160     ASSERT(!*exception);
161     double availableHeight = JSValueToNumber(context, arguments[4], exception);
162     ASSERT(!*exception);
163
164     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
165     controller->dumpConfigurationForViewport(static_cast<int>(deviceDPI), static_cast<int>(deviceWidth), static_cast<int>(deviceHeight), static_cast<int>(availableWidth), static_cast<int>(availableHeight));
166
167     return JSValueMakeUndefined(context);
168 }
169
170 static JSValueRef dumpDatabaseCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
171 {
172     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
173     controller->setDumpDatabaseCallbacks(true);
174     return JSValueMakeUndefined(context);
175 }
176
177 static JSValueRef dumpDOMAsWebArchiveCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
178 {
179     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
180     controller->setDumpDOMAsWebArchive(true);
181     return JSValueMakeUndefined(context);
182 }
183
184 static JSValueRef dumpEditingCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
185 {
186     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
187     controller->setDumpEditingCallbacks(true);
188     return JSValueMakeUndefined(context);
189 }
190
191 static JSValueRef dumpFrameLoadCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
192 {
193     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
194     controller->setDumpFrameLoadCallbacks(true);
195     return JSValueMakeUndefined(context);
196 }
197
198 static JSValueRef dumpUserGestureInFrameLoadCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
199 {
200     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
201     controller->setDumpUserGestureInFrameLoadCallbacks(true);
202     return JSValueMakeUndefined(context);
203 }
204
205 static JSValueRef dumpResourceLoadCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
206 {
207     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
208     controller->setDumpResourceLoadCallbacks(true);
209     return JSValueMakeUndefined(context);
210 }
211
212 static JSValueRef dumpResourceResponseMIMETypesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
213 {
214     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
215     controller->setDumpResourceResponseMIMETypes(true);
216     return JSValueMakeUndefined(context);
217 }
218
219 static JSValueRef dumpSelectionRectCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
220 {
221     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
222     controller->setDumpSelectionRect(true);
223     return JSValueMakeUndefined(context);
224 }
225
226 static JSValueRef dumpSourceAsWebArchiveCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
227 {
228     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
229     controller->setDumpSourceAsWebArchive(true);
230     return JSValueMakeUndefined(context);
231 }
232
233 static JSValueRef dumpStatusCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
234 {
235     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
236     controller->setDumpStatusCallbacks(true);
237     return JSValueMakeUndefined(context);
238 }
239
240 static JSValueRef dumpTitleChangesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
241 {
242     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
243     controller->setDumpTitleChanges(true);
244     return JSValueMakeUndefined(context);
245 }
246
247 static JSValueRef dumpIconChangesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
248 {
249     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
250     controller->setDumpIconChanges(true);
251     return JSValueMakeUndefined(context);
252 }
253
254 static JSValueRef dumpWillCacheResponseCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
255 {
256     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
257     controller->setDumpWillCacheResponse(true);
258     return JSValueMakeUndefined(context);
259 }
260
261 static JSValueRef pathToLocalResourceCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
262 {
263     if (argumentCount < 1)
264         return JSValueMakeUndefined(context);
265
266     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
267     JSRetainPtr<JSStringRef> localPath(Adopt, JSValueToStringCopy(context, arguments[0], exception));
268     ASSERT(!*exception);
269
270     JSRetainPtr<JSStringRef> convertedPath(Adopt, controller->pathToLocalResource(context, localPath.get()));
271     if (!convertedPath)
272         return JSValueMakeUndefined(context);
273
274     return JSValueMakeString(context, convertedPath.get());
275 }
276
277 static JSValueRef removeAllVisitedLinksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
278 {
279     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
280     controller->setDumpVisitedLinksCallback(true);
281     controller->removeAllVisitedLinks();
282     return JSValueMakeUndefined(context);
283 }
284
285 static JSValueRef repaintSweepHorizontallyCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
286 {
287     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
288     controller->setTestRepaintSweepHorizontally(true);
289     return JSValueMakeUndefined(context);
290 }
291
292 static JSValueRef setCallCloseOnWebViewsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
293 {
294     if (argumentCount < 1)
295         return JSValueMakeUndefined(context);
296
297     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
298     controller->setCallCloseOnWebViews(JSValueToBoolean(context, arguments[0]));
299     return JSValueMakeUndefined(context);
300 }
301
302 static JSValueRef setCanOpenWindowsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
303 {
304     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
305     controller->setCanOpenWindows(true);
306     return JSValueMakeUndefined(context);
307 }
308
309 static JSValueRef setCloseRemainingWindowsWhenCompleteCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
310 {
311     if (argumentCount < 1)
312         return JSValueMakeUndefined(context);
313
314     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
315     controller->setCloseRemainingWindowsWhenComplete(JSValueToBoolean(context, arguments[0]));
316     return JSValueMakeUndefined(context);
317 }
318
319 static JSValueRef setEncodedAudioDataCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
320 {
321     if (argumentCount < 1)
322         return JSValueMakeUndefined(context);
323
324     JSRetainPtr<JSStringRef> encodedAudioData(Adopt, JSValueToStringCopy(context, arguments[0], exception));
325     ASSERT(!*exception);
326     
327     size_t maxLength = JSStringGetMaximumUTF8CStringSize(encodedAudioData.get());
328     OwnArrayPtr<char> encodedAudioDataBuffer = adoptArrayPtr(new char[maxLength + 1]);
329     JSStringGetUTF8CString(encodedAudioData.get(), encodedAudioDataBuffer.get(), maxLength + 1);
330
331     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
332     controller->setEncodedAudioData(encodedAudioDataBuffer.get());
333     controller->setDumpAsAudio(true);
334     
335     return JSValueMakeUndefined(context);
336 }
337
338 static JSValueRef testOnscreenCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
339 {
340     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
341     controller->setTestOnscreen(true);
342     return JSValueMakeUndefined(context);
343 }
344
345 static JSValueRef testRepaintCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
346 {
347     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
348     controller->setTestRepaint(true);
349     return JSValueMakeUndefined(context);
350 }
351
352 static JSValueRef addDisallowedURLCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
353 {
354     // Has mac implementation
355     if (argumentCount < 1)
356         return JSValueMakeUndefined(context);
357
358     JSRetainPtr<JSStringRef> url(Adopt, JSValueToStringCopy(context, arguments[0], exception));
359     ASSERT(!*exception);
360
361     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
362     controller->addDisallowedURL(url.get());
363
364     return JSValueMakeUndefined(context);
365 }
366
367 static JSValueRef addURLToRedirectCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
368 {
369     if (argumentCount < 2)
370         return JSValueMakeUndefined(context);
371
372     JSRetainPtr<JSStringRef> origin(Adopt, JSValueToStringCopy(context, arguments[0], exception));
373     ASSERT(!*exception);
374
375     JSRetainPtr<JSStringRef> destination(Adopt, JSValueToStringCopy(context, arguments[1], exception));
376     ASSERT(!*exception);
377
378     size_t maxLength = JSStringGetMaximumUTF8CStringSize(origin.get());
379     OwnArrayPtr<char> originBuffer = adoptArrayPtr(new char[maxLength + 1]);
380     JSStringGetUTF8CString(origin.get(), originBuffer.get(), maxLength + 1);
381
382     maxLength = JSStringGetMaximumUTF8CStringSize(destination.get());
383     OwnArrayPtr<char> destinationBuffer = adoptArrayPtr(new char[maxLength + 1]);
384     JSStringGetUTF8CString(destination.get(), destinationBuffer.get(), maxLength + 1);
385
386     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
387     controller->addURLToRedirect(originBuffer.get(), destinationBuffer.get());
388
389     return JSValueMakeUndefined(context);
390 }
391
392 static JSValueRef callShouldCloseOnWebViewCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
393 {
394     // Has mac & windows implementation
395     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
396
397     return JSValueMakeBoolean(context, controller->callShouldCloseOnWebView());
398 }
399
400 static JSValueRef clearAllApplicationCachesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
401 {
402     // Has mac implementation
403     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
404     controller->clearAllApplicationCaches();
405
406     return JSValueMakeUndefined(context);
407 }
408
409 static JSValueRef clearApplicationCacheForOriginCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
410 {
411     if (argumentCount < 1)
412         return JSValueMakeUndefined(context);
413
414     JSRetainPtr<JSStringRef> originURL(Adopt, JSValueToStringCopy(context, arguments[0], exception));
415     ASSERT(!*exception);
416
417     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
418     controller->clearApplicationCacheForOrigin(originURL.get());
419     
420     return JSValueMakeUndefined(context);
421 }
422
423 static JSValueRef originsWithApplicationCacheCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
424 {
425     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
426     return controller->originsWithApplicationCache(context);
427 }
428
429 static JSValueRef clearAllDatabasesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
430 {
431     // Has mac & windows implementation
432     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
433     controller->clearAllDatabases();
434
435     return JSValueMakeUndefined(context);
436 }
437
438 static JSValueRef syncLocalStorageCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
439 {
440     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
441
442     controller->syncLocalStorage();
443
444     return JSValueMakeUndefined(context);
445 }
446
447 static JSValueRef observeStorageTrackerNotificationsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
448 {
449     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
450
451     if (argumentCount < 1)
452         return JSValueMakeUndefined(context);
453
454     unsigned numNotifications = JSValueToNumber(context, arguments[0], exception);
455
456     ASSERT(!*exception);
457
458     controller->observeStorageTrackerNotifications(numNotifications);
459
460     return JSValueMakeUndefined(context);
461 }
462
463 static JSValueRef deleteAllLocalStorageCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
464 {
465     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
466     controller->deleteAllLocalStorage();
467
468     return JSValueMakeUndefined(context);
469 }
470
471 static JSValueRef deleteLocalStorageForOriginCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
472 {
473     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
474
475     if (argumentCount < 1)
476         return JSValueMakeUndefined(context);
477
478     JSRetainPtr<JSStringRef> url(Adopt, JSValueToStringCopy(context, arguments[0], exception));
479     ASSERT(!*exception);
480
481     controller->deleteLocalStorageForOrigin(url.get());
482
483     return JSValueMakeUndefined(context);
484 }
485
486 static JSValueRef originsWithLocalStorageCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
487 {
488     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
489     return controller->originsWithLocalStorage(context);
490 }
491
492 static JSValueRef clearBackForwardListCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
493 {
494     // Has mac & windows implementation
495     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
496     controller->clearBackForwardList();
497
498     return JSValueMakeUndefined(context);
499 }
500
501 static JSValueRef clearPersistentUserStyleSheetCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
502 {
503     // Has mac & windows implementation
504     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
505     controller->clearPersistentUserStyleSheet();
506
507     return JSValueMakeUndefined(context);
508 }
509
510 static JSValueRef decodeHostNameCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
511 {
512     // Has mac implementation
513     if (argumentCount < 1)
514         return JSValueMakeUndefined(context);
515
516     JSRetainPtr<JSStringRef> name(Adopt, JSValueToStringCopy(context, arguments[0], exception));
517     ASSERT(!*exception);
518
519     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
520     JSRetainPtr<JSStringRef> decodedHostName(Adopt, controller->copyDecodedHostName(name.get()));
521     return JSValueMakeString(context, decodedHostName.get());
522 }
523
524 static JSValueRef disableImageLoadingCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
525 {
526     // Has mac implementation, needs windows implementation
527     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
528     controller->disableImageLoading();
529     
530     return JSValueMakeUndefined(context);
531 }
532
533 static JSValueRef dispatchPendingLoadRequestsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
534 {
535     // Has mac implementation, needs windows implementation
536     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
537     controller->dispatchPendingLoadRequests();
538     
539     return JSValueMakeUndefined(context);
540 }
541
542 static JSValueRef displayCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
543 {
544     // Has mac & windows implementation
545     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
546     controller->display();
547
548     return JSValueMakeUndefined(context);
549 }
550
551 static JSValueRef displayInvalidatedRegionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
552 {
553     // Has mac & windows implementation
554     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
555     // LayoutTestController::display() only renders the invalidated region so
556     // we can just use that.
557     controller->display();
558
559     return JSValueMakeUndefined(context);
560 }
561
562 static JSValueRef encodeHostNameCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
563 {
564     // Has mac implementation
565     if (argumentCount < 1)
566         return JSValueMakeUndefined(context);
567
568     JSRetainPtr<JSStringRef> name(Adopt, JSValueToStringCopy(context, arguments[0], exception));
569     ASSERT(!*exception);
570
571     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
572     JSRetainPtr<JSStringRef> encodedHostName(Adopt, controller->copyEncodedHostName(name.get()));
573     return JSValueMakeString(context, encodedHostName.get());
574 }
575
576 static JSValueRef execCommandCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
577 {
578     // Has Mac & Windows implementations.
579     if (argumentCount < 1)
580         return JSValueMakeUndefined(context);
581
582     JSRetainPtr<JSStringRef> name(Adopt, JSValueToStringCopy(context, arguments[0], exception));
583     ASSERT(!*exception);
584
585     // Ignoring the second parameter (userInterface), as this command emulates a manual action.
586
587     JSRetainPtr<JSStringRef> value;
588     if (argumentCount >= 3) {
589         value.adopt(JSValueToStringCopy(context, arguments[2], exception));
590         ASSERT(!*exception);
591     } else
592         value.adopt(JSStringCreateWithUTF8CString(""));
593
594
595     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
596     controller->execCommand(name.get(), value.get());
597
598     return JSValueMakeUndefined(context);
599 }
600
601 static JSValueRef findStringCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
602 {
603     // Has Mac implementation.
604     if (argumentCount < 2)
605         return JSValueMakeUndefined(context);
606
607     JSRetainPtr<JSStringRef> target(Adopt, JSValueToStringCopy(context, arguments[0], exception));
608     ASSERT(!*exception);
609
610     JSObjectRef options = JSValueToObject(context, arguments[1], exception);
611     ASSERT(!*exception);
612
613     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
614     return JSValueMakeBoolean(context, controller->findString(context, target.get(), options));
615 }
616
617 static JSValueRef counterValueForElementByIdCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
618 {
619     if (argumentCount < 1)
620         return JSValueMakeUndefined(context);
621
622     JSRetainPtr<JSStringRef> elementId(Adopt, JSValueToStringCopy(context, arguments[0], exception));
623     if (*exception)
624         return JSValueMakeUndefined(context);
625
626     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
627     JSRetainPtr<JSStringRef> counterValue(controller->counterValueForElementById(elementId.get()));
628     if (!counterValue.get())
629         return JSValueMakeUndefined(context);
630     return JSValueMakeString(context, counterValue.get());
631 }
632
633 static JSValueRef grantDesktopNotificationPermissionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
634 {
635     // Has Windows implementation
636     if (argumentCount < 1)
637         return JSValueMakeUndefined(context);
638
639     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
640
641     controller->grantDesktopNotificationPermission(JSValueToStringCopy(context, arguments[0], NULL));
642         
643     return JSValueMakeUndefined(context);
644 }
645
646 static JSValueRef isCommandEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
647 {
648     // Has Mac implementation.
649
650     if (argumentCount < 1)
651         return JSValueMakeUndefined(context);
652
653     JSRetainPtr<JSStringRef> name(Adopt, JSValueToStringCopy(context, arguments[0], exception));
654     ASSERT(!*exception);
655
656     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
657
658     return JSValueMakeBoolean(context, controller->isCommandEnabled(name.get()));
659 }
660
661 static JSValueRef overridePreferenceCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
662 {
663     if (argumentCount < 2)
664         return JSValueMakeUndefined(context);
665
666     JSRetainPtr<JSStringRef> key(Adopt, JSValueToStringCopy(context, arguments[0], exception));
667     ASSERT(!*exception);
668     JSRetainPtr<JSStringRef> value(Adopt, JSValueToStringCopy(context, arguments[1], exception));
669     ASSERT(!*exception);
670
671     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
672     controller->overridePreference(key.get(), value.get());
673
674     return JSValueMakeUndefined(context);
675 }
676
677 static JSValueRef keepWebHistoryCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
678 {
679     // Has mac implementation
680     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
681     controller->keepWebHistory();
682
683     return JSValueMakeUndefined(context);
684 }
685
686 static JSValueRef computedStyleIncludingVisitedInfoCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
687 {
688     if (argumentCount != 1)
689         return JSValueMakeUndefined(context);
690     
691     // Has mac implementation
692     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
693     return controller->computedStyleIncludingVisitedInfo(context, arguments[0]);
694 }
695
696 static JSValueRef nodesFromRectCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
697 {
698     if (argumentCount != 8)
699         return JSValueMakeUndefined(context);
700
701     int x = JSValueToNumber(context, arguments[1], NULL);
702     int y = JSValueToNumber(context, arguments[2], NULL);
703     int top = static_cast<unsigned>(JSValueToNumber(context, arguments[3], NULL));
704     int right = static_cast<unsigned>(JSValueToNumber(context, arguments[4], NULL));
705     int bottom = static_cast<unsigned>(JSValueToNumber(context, arguments[5], NULL));
706     int left = static_cast<unsigned>(JSValueToNumber(context, arguments[6], NULL));
707     bool ignoreClipping = JSValueToBoolean(context, arguments[7]);
708
709     // Has mac implementation.
710     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
711     return controller->nodesFromRect(context, arguments[0], x, y, top, right, bottom, left, ignoreClipping);
712 }
713
714 static JSValueRef layerTreeAsTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
715 {
716     // Has mac & windows implementation
717     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
718     return JSValueMakeString(context, controller->layerTreeAsText().get());
719 }
720
721 static JSValueRef notifyDoneCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
722 {
723     // Has mac & windows implementation
724     // May be able to be made platform independant by using shared WorkQueue
725     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
726     controller->notifyDone();
727     return JSValueMakeUndefined(context);
728 }
729
730 static bool parsePageParameters(JSContextRef context, int argumentCount, const JSValueRef* arguments, JSValueRef* exception, float& pageWidthInPixels, float& pageHeightInPixels)
731 {
732     pageWidthInPixels = LayoutTestController::maxViewWidth;
733     pageHeightInPixels = LayoutTestController::maxViewHeight;
734     switch (argumentCount) {
735     case 2:
736         pageWidthInPixels = static_cast<float>(JSValueToNumber(context, arguments[0], exception));
737         if (*exception)
738             return false;
739         pageHeightInPixels = static_cast<float>(JSValueToNumber(context, arguments[1], exception));
740         if (*exception)
741             return false;
742     case 0: // Fall through.
743         break;
744     default:
745         return false;
746     }
747     return true;
748 }
749
750 // Caller needs to delete[] propertyName.
751 static bool parsePagePropertyParameters(JSContextRef context, int argumentCount, const JSValueRef* arguments, JSValueRef* exception, char*& propertyName, int& pageNumber)
752 {
753     pageNumber = 0;
754     switch (argumentCount) {
755     case 2:
756         pageNumber = static_cast<float>(JSValueToNumber(context, arguments[1], exception));
757         if (*exception)
758             return false;
759         // Fall through.
760     case 1: {
761         JSRetainPtr<JSStringRef> propertyNameString(Adopt, JSValueToStringCopy(context, arguments[0], exception));
762         if (*exception)
763             return false;
764
765         size_t maxLength = JSStringGetMaximumUTF8CStringSize(propertyNameString.get());
766         propertyName = new char[maxLength + 1];
767         JSStringGetUTF8CString(propertyNameString.get(), propertyName, maxLength + 1);
768         return true;
769     }
770     case 0:
771     default:
772         return false;
773     }
774 }
775
776 static bool parsePageNumber(JSContextRef context, int argumentCount, const JSValueRef* arguments, JSValueRef* exception, int& pageNumber)
777 {
778     pageNumber = 0;
779     switch (argumentCount) {
780     case 1:
781         pageNumber = static_cast<int>(JSValueToNumber(context, arguments[0], exception));
782         if (*exception)
783             return false;
784         // Fall through.
785     case 0:
786         return true;
787     default:
788         return false;
789     }
790 }
791
792 static bool parsePageNumberSizeMarings(JSContextRef context, int argumentCount, const JSValueRef* arguments, JSValueRef* exception, int& pageNumber, int& width, int& height, int& marginTop, int& marginRight, int& marginBottom, int& marginLeft)
793 {
794     pageNumber = 0;
795     width = height = 0;
796     marginTop = marginRight = marginBottom = marginLeft = 0;
797
798     switch (argumentCount) {
799     case 7:
800         marginLeft = static_cast<int>(JSValueToNumber(context, arguments[6], exception));
801         if (*exception)
802             return false;
803         // Fall through.
804     case 6:
805         marginBottom = static_cast<int>(JSValueToNumber(context, arguments[5], exception));
806         if (*exception)
807             return false;
808         // Fall through.
809     case 5:
810         marginRight = static_cast<int>(JSValueToNumber(context, arguments[4], exception));
811         if (*exception)
812             return false;
813         // Fall through.
814     case 4:
815         marginTop = static_cast<int>(JSValueToNumber(context, arguments[3], exception));
816         if (*exception)
817             return false;
818         // Fall through.
819     case 3:
820         height = static_cast<int>(JSValueToNumber(context, arguments[2], exception));
821         if (*exception)
822             return false;
823         // Fall through.
824     case 2:
825         width = static_cast<int>(JSValueToNumber(context, arguments[1], exception));
826         if (*exception)
827             return false;
828         // Fall through.
829     case 1:
830         pageNumber = static_cast<int>(JSValueToNumber(context, arguments[0], exception));
831         if (*exception)
832             return false;
833         // Fall through.
834         return true;
835     default:
836         return false;
837     }
838 }
839
840 static JSValueRef pageNumberForElementByIdCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
841 {
842     float pageWidthInPixels = 0;
843     float pageHeightInPixels = 0;
844     if (!parsePageParameters(context, argumentCount - 1, arguments + 1, exception, pageWidthInPixels, pageHeightInPixels))
845         return JSValueMakeUndefined(context);
846
847     JSRetainPtr<JSStringRef> elementId(Adopt, JSValueToStringCopy(context, arguments[0], exception));
848     if (*exception)
849         return JSValueMakeUndefined(context);
850
851     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
852     int pageNumber = controller->pageNumberForElementById(elementId.get(), pageWidthInPixels, pageHeightInPixels);
853     return JSValueMakeNumber(context, pageNumber);
854 }
855
856 static JSValueRef numberOfPagesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
857 {
858     float pageWidthInPixels = 0;
859     float pageHeightInPixels = 0;
860     if (!parsePageParameters(context, argumentCount, arguments, exception, pageWidthInPixels, pageHeightInPixels))
861         return JSValueMakeUndefined(context);
862
863     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
864     return JSValueMakeNumber(context, controller->numberOfPages(pageWidthInPixels, pageHeightInPixels));
865 }
866
867 static JSValueRef numberOfPendingGeolocationPermissionRequestsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
868 {
869     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
870     return JSValueMakeNumber(context, controller->numberOfPendingGeolocationPermissionRequests());
871 }
872
873 static JSValueRef pagePropertyCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
874 {
875     char* propertyName = 0;
876     int pageNumber = 0;
877     if (!parsePagePropertyParameters(context, argumentCount, arguments, exception, propertyName, pageNumber))
878         return JSValueMakeUndefined(context);
879
880     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
881     JSValueRef value = JSValueMakeString(context, controller->pageProperty(propertyName, pageNumber).get());
882
883     delete[] propertyName;
884     return value;
885 }
886
887 static JSValueRef isPageBoxVisibleCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
888 {
889     int pageNumber = 0;
890     if (!parsePageNumber(context, argumentCount, arguments, exception, pageNumber))
891         return JSValueMakeUndefined(context);
892
893     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
894     return JSValueMakeBoolean(context, controller->isPageBoxVisible(pageNumber));
895 }
896
897 static JSValueRef pageSizeAndMarginsInPixelsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
898 {
899     int pageNumber = 0;
900     int width = 0, height = 0;
901     int marginTop = 0, marginRight = 0, marginBottom = 0, marginLeft = 0;
902     if (!parsePageNumberSizeMarings(context, argumentCount, arguments, exception, pageNumber, width, height, marginTop, marginRight, marginBottom, marginLeft))
903         return JSValueMakeUndefined(context);
904
905     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
906     return JSValueMakeString(context, controller->pageSizeAndMarginsInPixels(pageNumber, width, height, marginTop, marginRight, marginBottom, marginLeft).get());
907 }
908
909 static JSValueRef queueBackNavigationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
910 {
911     // Has mac & windows implementation
912     // May be able to be made platform independant by using shared WorkQueue
913     if (argumentCount < 1)
914         return JSValueMakeUndefined(context);
915
916     double howFarBackDouble = JSValueToNumber(context, arguments[0], exception);
917     ASSERT(!*exception);
918
919     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
920     controller->queueBackNavigation(static_cast<int>(howFarBackDouble));
921
922     return JSValueMakeUndefined(context);
923 }
924
925 static JSValueRef queueForwardNavigationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
926 {
927     // Has mac & windows implementation
928     // May be able to be made platform independant by using shared WorkQueue
929     if (argumentCount < 1)
930         return JSValueMakeUndefined(context);
931
932     double howFarForwardDouble = JSValueToNumber(context, arguments[0], exception);
933     ASSERT(!*exception);
934
935     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
936     controller->queueForwardNavigation(static_cast<int>(howFarForwardDouble));
937
938     return JSValueMakeUndefined(context);
939 }
940
941 static JSValueRef queueLoadCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
942 {
943     // Has mac & windows implementation
944     // May be able to be made platform independant by using shared WorkQueue
945     if (argumentCount < 1)
946         return JSValueMakeUndefined(context);
947
948     JSRetainPtr<JSStringRef> url(Adopt, JSValueToStringCopy(context, arguments[0], exception));
949     ASSERT(!*exception);
950
951     JSRetainPtr<JSStringRef> target;
952     if (argumentCount >= 2) {
953         target.adopt(JSValueToStringCopy(context, arguments[1], exception));
954         ASSERT(!*exception);
955     } else
956         target.adopt(JSStringCreateWithUTF8CString(""));
957
958     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
959     controller->queueLoad(url.get(), target.get());
960
961     return JSValueMakeUndefined(context);
962 }
963
964 static JSValueRef queueLoadHTMLStringCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
965 {
966     // Has Mac & Windows implementation
967     if (argumentCount < 1)
968         return JSValueMakeUndefined(context);
969
970     JSRetainPtr<JSStringRef> content(Adopt, JSValueToStringCopy(context, arguments[0], exception));
971     ASSERT(!*exception);
972
973     JSRetainPtr<JSStringRef> baseURL;
974     if (argumentCount >= 2) {
975         baseURL.adopt(JSValueToStringCopy(context, arguments[1], exception));
976         ASSERT(!*exception);
977     } else
978         baseURL.adopt(JSStringCreateWithUTF8CString(""));
979
980     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
981
982     if (argumentCount >= 3) {
983         JSRetainPtr<JSStringRef> unreachableURL;
984         unreachableURL.adopt(JSValueToStringCopy(context, arguments[2], exception));
985         ASSERT(!*exception);
986         controller->queueLoadAlternateHTMLString(content.get(), baseURL.get(), unreachableURL.get());
987         return JSValueMakeUndefined(context);
988     }
989
990     controller->queueLoadHTMLString(content.get(), baseURL.get());
991     return JSValueMakeUndefined(context);
992 }
993
994 static JSValueRef queueReloadCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
995 {
996     // Has mac & windows implementation
997     // May be able to be made platform independant by using shared WorkQueue
998
999     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1000     controller->queueReload();
1001
1002     return JSValueMakeUndefined(context);
1003 }
1004
1005 static JSValueRef queueLoadingScriptCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1006 {
1007     // Has mac & windows implementation
1008     // May be able to be made platform independant by using shared WorkQueue
1009     if (argumentCount < 1)
1010         return JSValueMakeUndefined(context);
1011
1012     JSRetainPtr<JSStringRef> script(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1013     ASSERT(!*exception);
1014
1015     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1016     controller->queueLoadingScript(script.get());
1017
1018     return JSValueMakeUndefined(context);
1019 }
1020
1021 static JSValueRef queueNonLoadingScriptCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1022 {
1023     // Has mac & windows implementation
1024     // May be able to be made platform independant by using shared WorkQueue
1025     if (argumentCount < 1)
1026         return JSValueMakeUndefined(context);
1027
1028     JSRetainPtr<JSStringRef> script(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1029     ASSERT(!*exception);
1030
1031     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1032     controller->queueNonLoadingScript(script.get());
1033
1034     return JSValueMakeUndefined(context);
1035 }
1036
1037 static JSValueRef setAcceptsEditingCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1038 {
1039     // Has mac & windows implementation
1040     if (argumentCount < 1)
1041         return JSValueMakeUndefined(context);
1042
1043     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1044     controller->setAcceptsEditing(JSValueToBoolean(context, arguments[0]));
1045
1046     return JSValueMakeUndefined(context);
1047 }
1048
1049 static JSValueRef setAlwaysAcceptCookiesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1050 {
1051     // Has mac & windows implementation
1052     if (argumentCount < 1)
1053         return JSValueMakeUndefined(context);
1054
1055     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1056     controller->setAlwaysAcceptCookies(JSValueToBoolean(context, arguments[0]));
1057
1058     return JSValueMakeUndefined(context);
1059 }
1060
1061 static JSValueRef setAppCacheMaximumSizeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1062 {
1063     // Has mac implementation
1064     if (argumentCount < 1)
1065         return JSValueMakeUndefined(context);
1066
1067     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1068
1069     double size = JSValueToNumber(context, arguments[0], NULL);
1070     if (!isnan(size))
1071         controller->setAppCacheMaximumSize(static_cast<unsigned long long>(size));
1072         
1073     return JSValueMakeUndefined(context);
1074 }
1075
1076 static JSValueRef setApplicationCacheOriginQuotaCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1077 {
1078     // Has mac implementation
1079     if (argumentCount < 1)
1080         return JSValueMakeUndefined(context);
1081
1082     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1083
1084     double size = JSValueToNumber(context, arguments[0], NULL);
1085     if (!isnan(size))
1086         controller->setApplicationCacheOriginQuota(static_cast<unsigned long long>(size));
1087
1088     return JSValueMakeUndefined(context);
1089 }
1090
1091 static JSValueRef setAuthenticationPasswordCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1092 {
1093     // Has mac & windows implementation
1094     if (argumentCount < 1)
1095         return JSValueMakeUndefined(context);
1096
1097     JSRetainPtr<JSStringRef> password(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1098     ASSERT(!*exception);
1099
1100     size_t maxLength = JSStringGetMaximumUTF8CStringSize(password.get());
1101     char* passwordBuffer = new char[maxLength + 1];
1102     JSStringGetUTF8CString(password.get(), passwordBuffer, maxLength + 1);
1103     
1104     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1105     controller->setAuthenticationPassword(passwordBuffer);
1106     delete[] passwordBuffer;
1107
1108     return JSValueMakeUndefined(context);
1109 }
1110
1111 static JSValueRef setAuthenticationUsernameCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1112 {
1113     // Has mac & windows implementation
1114     if (argumentCount < 1)
1115         return JSValueMakeUndefined(context);
1116
1117     JSRetainPtr<JSStringRef> username(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1118     ASSERT(!*exception);
1119
1120     size_t maxLength = JSStringGetMaximumUTF8CStringSize(username.get());
1121     char* usernameBuffer = new char[maxLength + 1];
1122     JSStringGetUTF8CString(username.get(), usernameBuffer, maxLength + 1);
1123     
1124     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1125     controller->setAuthenticationUsername(usernameBuffer);
1126     delete[] usernameBuffer;
1127
1128     return JSValueMakeUndefined(context);
1129 }
1130
1131 static JSValueRef setAuthorAndUserStylesEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1132 {
1133     // Has mac & windows implementation
1134     if (argumentCount < 1)
1135         return JSValueMakeUndefined(context);
1136
1137     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1138     controller->setAuthorAndUserStylesEnabled(JSValueToBoolean(context, arguments[0]));
1139
1140     return JSValueMakeUndefined(context);
1141 }
1142
1143 static JSValueRef setAutofilledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1144 {
1145     if (argumentCount != 2 || !arguments[0])
1146         return JSValueMakeUndefined(context);
1147
1148     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1149     controller->setAutofilled(context, arguments[0], JSValueToBoolean(context, arguments[1]));
1150
1151     return JSValueMakeUndefined(context);
1152 }
1153
1154 static JSValueRef setCacheModelCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1155 {
1156     // Has Mac implementation.
1157     if (argumentCount < 1)
1158         return JSValueMakeUndefined(context);
1159
1160     int cacheModel = JSValueToNumber(context, arguments[0], exception);
1161     ASSERT(!*exception);
1162
1163     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1164     controller->setCacheModel(cacheModel);
1165
1166     return JSValueMakeUndefined(context);
1167 }
1168
1169 static JSValueRef setCustomPolicyDelegateCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1170 {
1171     // Has mac implementation
1172     if (argumentCount < 1)
1173         return JSValueMakeUndefined(context);
1174     
1175     bool permissive = false;
1176     if (argumentCount >= 2)
1177         permissive = JSValueToBoolean(context, arguments[1]);
1178
1179     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1180     controller->setCustomPolicyDelegate(JSValueToBoolean(context, arguments[0]), permissive);
1181
1182     return JSValueMakeUndefined(context);
1183 }
1184
1185 static JSValueRef setDatabaseQuotaCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1186 {
1187     // Has mac implementation
1188     if (argumentCount < 1)
1189         return JSValueMakeUndefined(context);
1190
1191     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1192
1193     double quota = JSValueToNumber(context, arguments[0], NULL);
1194     if (!isnan(quota))
1195         controller->setDatabaseQuota(static_cast<unsigned long long>(quota));
1196         
1197     return JSValueMakeUndefined(context);
1198 }
1199
1200 static JSValueRef setDeferMainResourceDataLoadCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1201 {
1202     // Has Mac and Windows implementation
1203     if (argumentCount < 1)
1204         return JSValueMakeUndefined(context);
1205
1206     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1207     controller->setDeferMainResourceDataLoad(JSValueToBoolean(context, arguments[0]));
1208
1209     return JSValueMakeUndefined(context);
1210 }
1211
1212 static JSValueRef setDomainRelaxationForbiddenForURLSchemeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1213 {
1214     // Has Mac and Windows implementation
1215     if (argumentCount < 2)
1216         return JSValueMakeUndefined(context);
1217
1218     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1219
1220     bool forbidden = JSValueToBoolean(context, arguments[0]);
1221     JSRetainPtr<JSStringRef> scheme(Adopt, JSValueToStringCopy(context, arguments[1], 0));
1222     controller->setDomainRelaxationForbiddenForURLScheme(forbidden, scheme.get());
1223
1224     return JSValueMakeUndefined(context);
1225 }
1226
1227 static JSValueRef setMockDeviceOrientationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1228 {
1229     if (argumentCount < 6)
1230         return JSValueMakeUndefined(context);
1231
1232     bool canProvideAlpha = JSValueToBoolean(context, arguments[0]);
1233     double alpha = JSValueToNumber(context, arguments[1], exception);
1234     ASSERT(!*exception);
1235     bool canProvideBeta = JSValueToBoolean(context, arguments[2]);
1236     double beta = JSValueToNumber(context, arguments[3], exception);
1237     ASSERT(!*exception);
1238     bool canProvideGamma = JSValueToBoolean(context, arguments[4]);
1239     double gamma = JSValueToNumber(context, arguments[5], exception);
1240     ASSERT(!*exception);
1241
1242     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1243     controller->setMockDeviceOrientation(canProvideAlpha, alpha, canProvideBeta, beta, canProvideGamma, gamma);
1244
1245     return JSValueMakeUndefined(context);
1246 }
1247
1248 static JSValueRef setMockGeolocationPositionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1249 {
1250     if (argumentCount < 3)
1251         return JSValueMakeUndefined(context);
1252
1253     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1254     controller->setMockGeolocationPosition(JSValueToNumber(context, arguments[0], NULL),  // latitude
1255                                            JSValueToNumber(context, arguments[1], NULL),  // longitude
1256                                            JSValueToNumber(context, arguments[2], NULL));  // accuracy
1257
1258     return JSValueMakeUndefined(context);
1259 }
1260
1261 static JSValueRef setMockGeolocationErrorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1262 {
1263     if (argumentCount < 2)
1264         return JSValueMakeUndefined(context);
1265
1266     int code = JSValueToNumber(context, arguments[0], NULL);
1267     JSRetainPtr<JSStringRef> message(Adopt, JSValueToStringCopy(context, arguments[1], exception));
1268     ASSERT(!*exception);
1269
1270     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1271     controller->setMockGeolocationError(code, message.get());
1272
1273     return JSValueMakeUndefined(context);
1274 }
1275
1276 static JSValueRef addMockSpeechInputResultCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1277 {
1278     if (argumentCount < 3)
1279         return JSValueMakeUndefined(context);
1280
1281     JSRetainPtr<JSStringRef> result(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1282     ASSERT(!*exception);
1283
1284     double confidence = JSValueToNumber(context, arguments[1], exception);
1285
1286     JSRetainPtr<JSStringRef> language(Adopt, JSValueToStringCopy(context, arguments[2], exception));
1287     ASSERT(!*exception);
1288
1289     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1290     controller->addMockSpeechInputResult(result.get(), confidence, language.get());
1291
1292     return JSValueMakeUndefined(context);
1293 }
1294
1295 static JSValueRef setNewWindowsCopyBackForwardListCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1296 {
1297     // Has mac implementation
1298     if (argumentCount < 1)
1299         return JSValueMakeUndefined(context);
1300     
1301     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1302     controller->setNewWindowsCopyBackForwardList(JSValueToBoolean(context, arguments[0]));
1303
1304     return JSValueMakeUndefined(context);
1305 }
1306
1307 static JSValueRef setGeolocationPermissionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1308 {
1309     // Has mac implementation
1310     if (argumentCount < 1)
1311         return JSValueMakeUndefined(context);
1312
1313     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1314     controller->setGeolocationPermission(JSValueToBoolean(context, arguments[0]));
1315
1316     return JSValueMakeUndefined(context);
1317 }
1318
1319 static JSValueRef setHandlesAuthenticationChallengesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1320 {
1321     // Has mac & windows implementation
1322     if (argumentCount < 1)
1323         return JSValueMakeUndefined(context);
1324
1325     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1326     controller->setHandlesAuthenticationChallenges(JSValueToBoolean(context, arguments[0]));
1327
1328     return JSValueMakeUndefined(context);
1329 }
1330
1331 static JSValueRef setPOSIXLocaleCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1332 {
1333     if (argumentCount < 1)
1334         return JSValueMakeUndefined(context);
1335
1336     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1337     JSRetainPtr<JSStringRef> locale(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1338     ASSERT(!*exception);
1339     controller->setPOSIXLocale(locale.get());
1340
1341     return JSValueMakeUndefined(context);
1342 }
1343
1344 static JSValueRef setIconDatabaseEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1345 {
1346     // Has mac & windows implementation
1347     if (argumentCount < 1)
1348         return JSValueMakeUndefined(context);
1349
1350     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1351     controller->setIconDatabaseEnabled(JSValueToBoolean(context, arguments[0]));
1352
1353     return JSValueMakeUndefined(context);
1354 }
1355
1356 static JSValueRef setJavaScriptProfilingEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1357 {
1358     if (argumentCount < 1)
1359         return JSValueMakeUndefined(context);
1360
1361     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1362     controller->setJavaScriptProfilingEnabled(JSValueToBoolean(context, arguments[0]));
1363
1364     return JSValueMakeUndefined(context);
1365 }
1366
1367 static JSValueRef setMainFrameIsFirstResponderCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1368 {
1369     // Has mac implementation
1370     if (argumentCount < 1)
1371         return JSValueMakeUndefined(context);
1372
1373     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1374     controller->setMainFrameIsFirstResponder(JSValueToBoolean(context, arguments[0]));
1375
1376     return JSValueMakeUndefined(context);
1377 }
1378
1379 static JSValueRef setPersistentUserStyleSheetLocationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1380 {
1381     // Has mac implementation
1382     if (argumentCount < 1)
1383         return JSValueMakeUndefined(context);
1384
1385     JSRetainPtr<JSStringRef> path(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1386     ASSERT(!*exception);
1387
1388     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1389     controller->setPersistentUserStyleSheetLocation(path.get());
1390
1391     return JSValueMakeUndefined(context);
1392 }
1393
1394 static JSValueRef setPrivateBrowsingEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1395 {
1396     // Has mac & windows implementation
1397     if (argumentCount < 1)
1398         return JSValueMakeUndefined(context);
1399
1400     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1401     controller->setPrivateBrowsingEnabled(JSValueToBoolean(context, arguments[0]));
1402
1403     return JSValueMakeUndefined(context);
1404 }
1405
1406 static JSValueRef setJavaScriptCanAccessClipboardCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1407 {
1408     // Has mac & windows implementation
1409     if (argumentCount < 1)
1410         return JSValueMakeUndefined(context);
1411
1412     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1413     controller->setJavaScriptCanAccessClipboard(JSValueToBoolean(context, arguments[0]));
1414
1415     return JSValueMakeUndefined(context);
1416 }
1417
1418 static JSValueRef setXSSAuditorEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1419 {
1420     // Has mac & windows implementation
1421     if (argumentCount < 1)
1422         return JSValueMakeUndefined(context);
1423
1424     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1425     controller->setXSSAuditorEnabled(JSValueToBoolean(context, arguments[0]));
1426
1427     return JSValueMakeUndefined(context);
1428 }
1429
1430 static JSValueRef setSpatialNavigationEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1431 {
1432     // Has mac implementation.
1433     if (argumentCount < 1)
1434         return JSValueMakeUndefined(context);
1435
1436     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1437     controller->setSpatialNavigationEnabled(JSValueToBoolean(context, arguments[0]));
1438
1439     return JSValueMakeUndefined(context);
1440 }
1441
1442 static JSValueRef setPrintingCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1443 {
1444     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1445     controller->setIsPrinting(true);
1446     return JSValueMakeUndefined(context);
1447 }
1448
1449
1450 static JSValueRef setFrameFlatteningEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1451 {
1452     // Has mac & windows implementation
1453     if (argumentCount < 1)
1454         return JSValueMakeUndefined(context);
1455
1456     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1457     controller->setFrameFlatteningEnabled(JSValueToBoolean(context, arguments[0]));
1458
1459     return JSValueMakeUndefined(context);
1460 }
1461
1462 static JSValueRef setAllowUniversalAccessFromFileURLsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1463 {
1464     // Has mac & windows implementation
1465     if (argumentCount < 1)
1466         return JSValueMakeUndefined(context);
1467
1468     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1469     controller->setAllowUniversalAccessFromFileURLs(JSValueToBoolean(context, arguments[0]));
1470
1471     return JSValueMakeUndefined(context);
1472 }
1473
1474 static JSValueRef setAllowFileAccessFromFileURLsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1475 {
1476     // Has mac & windows implementation
1477     if (argumentCount < 1)
1478         return JSValueMakeUndefined(context);
1479
1480     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1481     controller->setAllowFileAccessFromFileURLs(JSValueToBoolean(context, arguments[0]));
1482
1483     return JSValueMakeUndefined(context);
1484 }
1485
1486 static JSValueRef setTabKeyCyclesThroughElementsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1487 {
1488     // Has mac & windows implementation
1489     if (argumentCount < 1)
1490         return JSValueMakeUndefined(context);
1491
1492     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1493     controller->setTabKeyCyclesThroughElements(JSValueToBoolean(context, arguments[0]));
1494
1495     return JSValueMakeUndefined(context);
1496 }
1497
1498 static JSValueRef setTimelineProfilingEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1499 {
1500     if (argumentCount < 1)
1501         return JSValueMakeUndefined(context);
1502
1503     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1504     controller->setTimelineProfilingEnabled(JSValueToBoolean(context, arguments[0]));
1505     return JSValueMakeUndefined(context);
1506 }
1507
1508 static JSValueRef setUseDashboardCompatibilityModeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1509 {
1510     // Has mac implementation
1511     if (argumentCount < 1)
1512         return JSValueMakeUndefined(context);
1513
1514     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1515     controller->setUseDashboardCompatibilityMode(JSValueToBoolean(context, arguments[0]));
1516
1517     return JSValueMakeUndefined(context);
1518 }
1519
1520 static JSValueRef setUserStyleSheetEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1521 {
1522     // Has mac implementation
1523     if (argumentCount < 1)
1524         return JSValueMakeUndefined(context);
1525
1526     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1527     controller->setUserStyleSheetEnabled(JSValueToBoolean(context, arguments[0]));
1528
1529     return JSValueMakeUndefined(context);
1530 }
1531
1532 static JSValueRef setUserStyleSheetLocationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1533 {
1534     // Has mac implementation
1535     if (argumentCount < 1)
1536         return JSValueMakeUndefined(context);
1537
1538     JSRetainPtr<JSStringRef> path(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1539     ASSERT(!*exception);
1540
1541     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1542     controller->setUserStyleSheetLocation(path.get());
1543
1544     return JSValueMakeUndefined(context);
1545 }
1546
1547 static JSValueRef setValueForUserCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1548 {
1549     // Has mac implementation
1550     if (argumentCount != 2)
1551         return JSValueMakeUndefined(context);
1552
1553     JSRetainPtr<JSStringRef> value(Adopt, JSValueToStringCopy(context, arguments[1], exception));
1554     ASSERT(!*exception);
1555
1556     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1557     controller->setValueForUser(context, arguments[0], value.get());
1558
1559     return JSValueMakeUndefined(context);
1560 }
1561
1562 static JSValueRef setViewModeMediaFeatureCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1563 {
1564     // Has mac implementation
1565     if (argumentCount < 1)
1566         return JSValueMakeUndefined(context);
1567
1568     JSRetainPtr<JSStringRef> mode(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1569     ASSERT(!*exception);
1570
1571     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1572     controller->setViewModeMediaFeature(mode.get());
1573
1574     return JSValueMakeUndefined(context);
1575 }
1576
1577 static JSValueRef setWillSendRequestClearHeaderCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1578 {
1579     // Has mac & windows implementation
1580     if (argumentCount < 1)
1581         return JSValueMakeUndefined(context);
1582
1583     JSRetainPtr<JSStringRef> header(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1584     ASSERT(!*exception);
1585
1586     size_t maxLength = JSStringGetMaximumUTF8CStringSize(header.get());
1587     OwnArrayPtr<char> headerBuffer = adoptArrayPtr(new char[maxLength + 1]);
1588     JSStringGetUTF8CString(header.get(), headerBuffer.get(), maxLength + 1);
1589
1590     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1591     controller->setWillSendRequestClearHeader(headerBuffer.get());
1592
1593     return JSValueMakeUndefined(context);
1594 }
1595
1596 static JSValueRef setWillSendRequestReturnsNullCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1597 {
1598     // Has cross-platform implementation
1599     if (argumentCount < 1)
1600         return JSValueMakeUndefined(context);
1601
1602     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1603     controller->setWillSendRequestReturnsNull(JSValueToBoolean(context, arguments[0]));
1604
1605     return JSValueMakeUndefined(context);
1606 }
1607
1608 static JSValueRef setWillSendRequestReturnsNullOnRedirectCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1609 {
1610     // Has cross-platform implementation
1611     if (argumentCount < 1)
1612         return JSValueMakeUndefined(context);
1613
1614     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1615     controller->setWillSendRequestReturnsNullOnRedirect(JSValueToBoolean(context, arguments[0]));
1616
1617     return JSValueMakeUndefined(context);
1618 }
1619
1620 static JSValueRef setWindowIsKeyCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1621 {
1622     // Has mac implementation
1623     if (argumentCount < 1)
1624         return JSValueMakeUndefined(context);
1625
1626     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1627     controller->setWindowIsKey(JSValueToBoolean(context, arguments[0]));
1628
1629     return JSValueMakeUndefined(context);
1630 }
1631
1632 static JSValueRef waitUntilDoneCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1633 {
1634     // Has mac & windows implementation
1635     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1636     controller->setWaitToDump(true);
1637
1638     return JSValueMakeUndefined(context);
1639 }
1640
1641 static JSValueRef windowCountCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1642 {
1643     // Has mac implementation
1644     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1645     int windows = controller->windowCount();
1646     return JSValueMakeNumber(context, windows);
1647 }
1648
1649 static JSValueRef setPopupBlockingEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1650 {
1651     // Has mac & windows implementation
1652     if (argumentCount < 1)
1653         return JSValueMakeUndefined(context);
1654
1655     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1656     controller->setPopupBlockingEnabled(JSValueToBoolean(context, arguments[0]));
1657
1658     return JSValueMakeUndefined(context);
1659 }
1660
1661 static JSValueRef setPluginsEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1662 {
1663     // Has mac & windows implementation
1664     if (argumentCount < 1)
1665         return JSValueMakeUndefined(context);
1666     
1667     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1668     controller->setPluginsEnabled(JSValueToBoolean(context, arguments[0]));
1669     
1670     return JSValueMakeUndefined(context);
1671 }    
1672
1673 static JSValueRef setPageVisibilityCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1674 {
1675     // Has mac & windows implementation
1676     if (argumentCount < 1)
1677         return JSValueMakeUndefined(context);
1678
1679     JSRetainPtr<JSStringRef> visibility(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1680     ASSERT(!*exception);
1681
1682     size_t maxLength = JSStringGetMaximumUTF8CStringSize(visibility.get());
1683     char* visibilityBuffer = new char[maxLength + 1];
1684     JSStringGetUTF8CString(visibility.get(), visibilityBuffer, maxLength + 1);
1685     
1686     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1687     controller->setPageVisibility(visibilityBuffer);
1688     delete[] visibilityBuffer;
1689     
1690     return JSValueMakeUndefined(context);
1691 }    
1692
1693 static JSValueRef resetPageVisibilityCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1694 {
1695     // Has mac & windows implementation
1696     if (argumentCount < 1)
1697         return JSValueMakeUndefined(context);
1698
1699     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1700     controller->resetPageVisibility();
1701     return JSValueMakeUndefined(context);
1702 }    
1703
1704 static JSValueRef setSmartInsertDeleteEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1705 {
1706     if (argumentCount < 1)
1707         return JSValueMakeUndefined(context);
1708
1709     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1710     controller->setSmartInsertDeleteEnabled(JSValueToBoolean(context, arguments[0]));
1711     return JSValueMakeUndefined(context);
1712 }
1713
1714 static JSValueRef setSelectTrailingWhitespaceEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1715 {
1716     if (argumentCount < 1)
1717         return JSValueMakeUndefined(context);
1718
1719     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1720     controller->setSelectTrailingWhitespaceEnabled(JSValueToBoolean(context, arguments[0]));
1721     return JSValueMakeUndefined(context);
1722 }
1723
1724 static JSValueRef setStopProvisionalFrameLoadsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1725 {
1726     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1727     controller->setStopProvisionalFrameLoads(true);
1728     return JSValueMakeUndefined(context);
1729 }
1730
1731 static JSValueRef setAsynchronousSpellCheckingEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1732 {
1733     if (argumentCount < 1)
1734         return JSValueMakeUndefined(context);
1735
1736     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1737     controller->setAsynchronousSpellCheckingEnabled(JSValueToBoolean(context, arguments[0]));
1738     return JSValueMakeUndefined(context);
1739 }
1740
1741 static JSValueRef shadowRootCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1742 {
1743     if (argumentCount != 1)
1744         return JSValueMakeUndefined(context);
1745     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1746     return controller->shadowRoot(context, arguments[0]);
1747 }
1748
1749 static JSValueRef ensureShadowRootCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1750 {
1751     if (argumentCount != 1)
1752         return JSValueMakeUndefined(context);
1753     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1754     return controller->ensureShadowRoot(context, arguments[0]);
1755 }
1756
1757 static JSValueRef removeShadowRootCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1758 {
1759     if (argumentCount != 1)
1760         return JSValueMakeUndefined(context);
1761
1762     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1763     controller->removeShadowRoot(context, arguments[0]);
1764
1765     return JSValueMakeUndefined(context);
1766 }
1767
1768 static JSValueRef showWebInspectorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1769 {
1770     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1771     controller->showWebInspector();
1772     return JSValueMakeUndefined(context);
1773 }
1774
1775 static JSValueRef closeWebInspectorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1776 {
1777     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1778     controller->setTimelineProfilingEnabled(false);
1779     controller->closeWebInspector();
1780     return JSValueMakeUndefined(context);
1781 }
1782
1783 static JSValueRef evaluateInWebInspectorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1784 {
1785     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1786     double callId = JSValueToNumber(context, arguments[0], exception);
1787     ASSERT(!*exception);
1788     JSRetainPtr<JSStringRef> script(Adopt, JSValueToStringCopy(context, arguments[1], exception));
1789     ASSERT(!*exception);
1790
1791     controller->evaluateInWebInspector(static_cast<long>(callId), script.get());
1792     return JSValueMakeUndefined(context);
1793 }
1794
1795 static JSValueRef evaluateScriptInIsolatedWorldCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1796 {
1797     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1798     double worldID = JSValueToNumber(context, arguments[0], exception);
1799     ASSERT(!*exception);
1800     JSRetainPtr<JSStringRef> script(Adopt, JSValueToStringCopy(context, arguments[1], exception));
1801     ASSERT(!*exception);
1802
1803     controller->evaluateScriptInIsolatedWorld(static_cast<unsigned>(worldID), JSContextGetGlobalObject(context), script.get());
1804     return JSValueMakeUndefined(context);
1805 }
1806
1807 static JSValueRef elementDoesAutoCompleteForElementWithIdCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1808 {
1809     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1810     JSRetainPtr<JSStringRef> elementId(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1811     ASSERT(!*exception);
1812
1813     bool autoCompletes = controller->elementDoesAutoCompleteForElementWithId(elementId.get());
1814
1815     return JSValueMakeBoolean(context, autoCompletes);
1816 }
1817
1818 static JSValueRef pauseAnimationAtTimeOnElementWithIdCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1819 {
1820     if (argumentCount != 3)
1821         return JSValueMakeUndefined(context);
1822
1823     JSRetainPtr<JSStringRef> animationName(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1824     ASSERT(!*exception);
1825     double time = JSValueToNumber(context, arguments[1], exception);
1826     ASSERT(!*exception);
1827     JSRetainPtr<JSStringRef> elementId(Adopt, JSValueToStringCopy(context, arguments[2], exception));
1828     ASSERT(!*exception);
1829
1830     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1831     return JSValueMakeBoolean(context, controller->pauseAnimationAtTimeOnElementWithId(animationName.get(), time, elementId.get()));
1832 }
1833
1834 static JSValueRef pauseTransitionAtTimeOnElementWithIdCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1835 {
1836     if (argumentCount != 3)
1837         return JSValueMakeUndefined(context);
1838
1839     JSRetainPtr<JSStringRef> propertyName(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1840     ASSERT(!*exception);
1841     double time = JSValueToNumber(context, arguments[1], exception);
1842     ASSERT(!*exception);
1843     JSRetainPtr<JSStringRef> elementId(Adopt, JSValueToStringCopy(context, arguments[2], exception));
1844     ASSERT(!*exception);
1845
1846     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1847     return JSValueMakeBoolean(context, controller->pauseTransitionAtTimeOnElementWithId(propertyName.get(), time, elementId.get()));
1848 }
1849
1850 static JSValueRef sampleSVGAnimationForElementAtTimeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1851 {
1852     if (argumentCount != 3)
1853         return JSValueMakeUndefined(context);
1854
1855     JSRetainPtr<JSStringRef> animationId(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1856     ASSERT(!*exception);
1857     double time = JSValueToNumber(context, arguments[1], exception);
1858     ASSERT(!*exception);
1859     JSRetainPtr<JSStringRef> elementId(Adopt, JSValueToStringCopy(context, arguments[2], exception));
1860     ASSERT(!*exception);
1861
1862     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1863     return JSValueMakeBoolean(context, controller->sampleSVGAnimationForElementAtTime(animationId.get(), time, elementId.get()));
1864 }
1865
1866 static JSValueRef numberOfActiveAnimationsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1867 {
1868     if (argumentCount != 0)
1869         return JSValueMakeUndefined(context);
1870
1871     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1872     return JSValueMakeNumber(context, controller->numberOfActiveAnimations());
1873 }
1874
1875 static JSValueRef suspendAnimationsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1876 {
1877     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1878     controller->suspendAnimations();
1879     return JSValueMakeUndefined(context);
1880 }
1881
1882 static JSValueRef resumeAnimationsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1883 {
1884     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1885     controller->resumeAnimations();
1886     return JSValueMakeUndefined(context);
1887 }
1888
1889 static JSValueRef waitForPolicyDelegateCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t, const JSValueRef[], JSValueRef*)
1890 {
1891     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1892     controller->waitForPolicyDelegate();
1893     return JSValueMakeUndefined(context);
1894 }
1895
1896 static JSValueRef addOriginAccessWhitelistEntryCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1897 {
1898     if (argumentCount != 4)
1899         return JSValueMakeUndefined(context);
1900
1901     JSRetainPtr<JSStringRef> sourceOrigin(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1902     ASSERT(!*exception);
1903     JSRetainPtr<JSStringRef> destinationProtocol(Adopt, JSValueToStringCopy(context, arguments[1], exception));
1904     ASSERT(!*exception);
1905     JSRetainPtr<JSStringRef> destinationHost(Adopt, JSValueToStringCopy(context, arguments[2], exception));
1906     ASSERT(!*exception);
1907     bool allowDestinationSubdomains = JSValueToBoolean(context, arguments[3]);
1908
1909     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1910     controller->addOriginAccessWhitelistEntry(sourceOrigin.get(), destinationProtocol.get(), destinationHost.get(), allowDestinationSubdomains);
1911     return JSValueMakeUndefined(context);
1912 }
1913
1914 static JSValueRef removeOriginAccessWhitelistEntryCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1915 {
1916     if (argumentCount != 4)
1917         return JSValueMakeUndefined(context);
1918
1919     JSRetainPtr<JSStringRef> sourceOrigin(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1920     ASSERT(!*exception);
1921     JSRetainPtr<JSStringRef> destinationProtocol(Adopt, JSValueToStringCopy(context, arguments[1], exception));
1922     ASSERT(!*exception);
1923     JSRetainPtr<JSStringRef> destinationHost(Adopt, JSValueToStringCopy(context, arguments[2], exception));
1924     ASSERT(!*exception);
1925     bool allowDestinationSubdomains = JSValueToBoolean(context, arguments[3]);
1926
1927     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1928     controller->removeOriginAccessWhitelistEntry(sourceOrigin.get(), destinationProtocol.get(), destinationHost.get(), allowDestinationSubdomains);
1929     return JSValueMakeUndefined(context);
1930 }
1931
1932 static JSValueRef setScrollbarPolicyCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1933 {
1934     if (argumentCount != 2)
1935         return JSValueMakeUndefined(context);
1936
1937     JSRetainPtr<JSStringRef> orientation(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1938     ASSERT(!*exception);
1939     JSRetainPtr<JSStringRef> policy(Adopt, JSValueToStringCopy(context, arguments[1], exception));
1940     ASSERT(!*exception);
1941
1942     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1943     controller->setScrollbarPolicy(orientation.get(), policy.get());
1944     return JSValueMakeUndefined(context);
1945 }
1946
1947 static JSValueRef addUserScriptCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1948 {
1949     if (argumentCount != 3)
1950         return JSValueMakeUndefined(context);
1951     
1952     JSRetainPtr<JSStringRef> source(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1953     ASSERT(!*exception);
1954     bool runAtStart = JSValueToBoolean(context, arguments[1]);
1955     bool allFrames = JSValueToBoolean(context, arguments[2]);
1956     
1957     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1958     controller->addUserScript(source.get(), runAtStart, allFrames);
1959     return JSValueMakeUndefined(context);
1960 }
1961  
1962 static JSValueRef addUserStyleSheetCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1963 {
1964     if (argumentCount != 2)
1965         return JSValueMakeUndefined(context);
1966     
1967     JSRetainPtr<JSStringRef> source(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1968     ASSERT(!*exception);
1969     bool allFrames = JSValueToBoolean(context, arguments[1]);
1970    
1971     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1972     controller->addUserStyleSheet(source.get(), allFrames);
1973     return JSValueMakeUndefined(context);
1974 }
1975
1976 static JSValueRef setShouldPaintBrokenImageCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1977 {
1978     // Has Mac implementation
1979     if (argumentCount < 1)
1980         return JSValueMakeUndefined(context);
1981
1982     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
1983     controller->setShouldPaintBrokenImage(JSValueToBoolean(context, arguments[0]));
1984
1985     return JSValueMakeUndefined(context);
1986 }
1987
1988 static JSValueRef apiTestNewWindowDataLoadBaseURLCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1989 {
1990     if (argumentCount != 2)
1991         return JSValueMakeUndefined(context);
1992
1993     JSRetainPtr<JSStringRef> utf8Data(Adopt, JSValueToStringCopy(context, arguments[0], exception));
1994     ASSERT(!*exception);
1995
1996     JSRetainPtr<JSStringRef> baseURL(Adopt, JSValueToStringCopy(context, arguments[1], exception));
1997     ASSERT(!*exception);
1998         
1999     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2000     controller->apiTestNewWindowDataLoadBaseURL(utf8Data.get(), baseURL.get());
2001     return JSValueMakeUndefined(context);
2002 }
2003
2004 static JSValueRef apiTestGoToCurrentBackForwardItemCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2005 {
2006     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2007     controller->apiTestGoToCurrentBackForwardItem();
2008     return JSValueMakeUndefined(context);
2009 }
2010
2011 static JSValueRef setWebViewEditableCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2012 {
2013     // Has Mac implementation
2014     if (argumentCount < 1)
2015         return JSValueMakeUndefined(context);
2016
2017     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2018     controller->setWebViewEditable(JSValueToBoolean(context, arguments[0]));
2019
2020     return JSValueMakeUndefined(context);
2021 }
2022
2023
2024 static JSValueRef abortModalCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2025 {
2026     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2027     controller->abortModal();
2028     return JSValueMakeUndefined(context);
2029 }
2030
2031 static JSValueRef hasSpellingMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2032 {
2033     if (argumentCount != 2)
2034         return JSValueMakeUndefined(context);
2035
2036     int from = JSValueToNumber(context, arguments[0], 0);
2037     int length = JSValueToNumber(context, arguments[1], 0);
2038     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2039     bool ok = controller->hasSpellingMarker(from, length);
2040
2041     return JSValueMakeBoolean(context, ok);
2042 }
2043
2044 static JSValueRef hasGrammarMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2045 {
2046     if (argumentCount != 2)
2047         return JSValueMakeUndefined(context);
2048     
2049     int from = JSValueToNumber(context, arguments[0], 0);
2050     int length = JSValueToNumber(context, arguments[1], 0);
2051     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2052     bool ok = controller->hasGrammarMarker(from, length);
2053     
2054     return JSValueMakeBoolean(context, ok);
2055 }
2056
2057 static JSValueRef markerTextForListItemCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2058 {
2059     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2060     if (argumentCount < 1)
2061         return JSValueMakeUndefined(context);
2062     return JSValueMakeString(context, controller->markerTextForListItem(context, arguments[0]).get());
2063 }
2064
2065 static JSValueRef authenticateSessionCallback(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2066 {
2067     // authenticateSession(url, username, password)
2068     if (argumentCount != 3)
2069         return JSValueMakeUndefined(context);
2070
2071     JSRetainPtr<JSStringRef> url(Adopt, JSValueToStringCopy(context, arguments[0], exception));
2072     ASSERT(!*exception);
2073     JSRetainPtr<JSStringRef> username(Adopt, JSValueToStringCopy(context, arguments[1], exception));
2074     ASSERT(!*exception);
2075     JSRetainPtr<JSStringRef> password(Adopt, JSValueToStringCopy(context, arguments[2], exception));
2076     ASSERT(!*exception);
2077
2078     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2079     controller->authenticateSession(url.get(), username.get(), password.get());
2080     return JSValueMakeUndefined(context);
2081 }
2082
2083 static JSValueRef setEditingBehaviorCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2084 {
2085     // The editing behavior string.
2086     if (argumentCount < 1)
2087         return JSValueMakeUndefined(context);
2088
2089     JSRetainPtr<JSStringRef> editingBehavior(Adopt, JSValueToStringCopy(context, arguments[0], exception));
2090     ASSERT(!*exception);
2091
2092     size_t maxLength = JSStringGetMaximumUTF8CStringSize(editingBehavior.get());
2093     char* behaviorBuffer = new char[maxLength + 1];
2094     JSStringGetUTF8CString(editingBehavior.get(), behaviorBuffer, maxLength);
2095
2096     if (strcmp(behaviorBuffer, "mac") && strcmp(behaviorBuffer, "win") && strcmp(behaviorBuffer, "unix")) {
2097         JSRetainPtr<JSStringRef> invalidArgument(JSStringCreateWithUTF8CString("Passed invalid editing behavior. Must be 'mac', 'win', or 'unix'."));
2098         *exception = JSValueMakeString(context, invalidArgument.get());
2099         return JSValueMakeUndefined(context);
2100     }
2101
2102     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2103     controller->setEditingBehavior(behaviorBuffer);
2104
2105     delete [] behaviorBuffer;
2106
2107     return JSValueMakeUndefined(context);
2108 }
2109
2110 static JSValueRef setSerializeHTTPLoadsCallback(JSContextRef context, JSObjectRef, JSObjectRef, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2111 {
2112     bool serialize = true;
2113     if (argumentCount == 1)
2114         serialize = JSValueToBoolean(context, arguments[0]);
2115
2116     LayoutTestController::setSerializeHTTPLoads(serialize);
2117     return JSValueMakeUndefined(context);
2118 }
2119
2120 static JSValueRef shadowPseudoIdCallback(JSContextRef context, JSObjectRef thisObject, JSObjectRef, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2121 {
2122     if (argumentCount < 1)
2123         return JSValueMakeUndefined(context);
2124
2125     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2126
2127     return JSValueMakeString(context, controller->shadowPseudoId(context, arguments[0]).get());
2128 }
2129
2130 // Static Values
2131
2132 static JSValueRef getGlobalFlagCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
2133 {
2134     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2135     return JSValueMakeBoolean(context, controller->globalFlag());
2136 }
2137
2138 static JSValueRef getWebHistoryItemCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
2139 {
2140     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2141     return JSValueMakeNumber(context, controller->webHistoryItemCount());
2142 }
2143
2144 static JSValueRef getWorkerThreadCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
2145 {
2146     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2147     return JSValueMakeNumber(context, controller->workerThreadCount());
2148 }
2149
2150 static bool setGlobalFlagCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef value, JSValueRef* exception)
2151 {
2152     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2153     controller->setGlobalFlag(JSValueToBoolean(context, value));
2154     return true;
2155 }
2156
2157 static JSValueRef setMinimumTimerIntervalCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
2158 {
2159     if (argumentCount < 1)
2160         return JSValueMakeUndefined(context);
2161
2162     double minimum = JSValueToNumber(context, arguments[0], exception);
2163     ASSERT(!*exception);
2164
2165     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
2166     controller->setMinimumTimerInterval(minimum);
2167
2168     return JSValueMakeUndefined(context);
2169 }
2170
2171 static void layoutTestControllerObjectFinalize(JSObjectRef object)
2172 {
2173     LayoutTestController* controller = static_cast<LayoutTestController*>(JSObjectGetPrivate(object));
2174     controller->deref();
2175 }
2176
2177 // Object Creation
2178
2179 void LayoutTestController::makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception)
2180 {
2181     JSRetainPtr<JSStringRef> layoutTestContollerStr(Adopt, JSStringCreateWithUTF8CString("layoutTestController"));
2182     ref();
2183
2184     JSClassRef classRef = getJSClass();
2185     JSValueRef layoutTestContollerObject = JSObjectMake(context, classRef, this);
2186     JSClassRelease(classRef);
2187
2188     JSObjectSetProperty(context, windowObject, layoutTestContollerStr.get(), layoutTestContollerObject, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, exception);
2189 }
2190
2191 JSClassRef LayoutTestController::getJSClass()
2192 {
2193     static JSStaticValue* staticValues = LayoutTestController::staticValues();
2194     static JSStaticFunction* staticFunctions = LayoutTestController::staticFunctions();
2195     static JSClassDefinition classDefinition = {
2196         0, kJSClassAttributeNone, "LayoutTestController", 0, staticValues, staticFunctions,
2197         0, layoutTestControllerObjectFinalize, 0, 0, 0, 0, 0, 0, 0, 0, 0
2198     };
2199
2200     return JSClassCreate(&classDefinition);
2201 }
2202
2203 JSStaticValue* LayoutTestController::staticValues()
2204 {
2205     static JSStaticValue staticValues[] = {
2206         { "globalFlag", getGlobalFlagCallback, setGlobalFlagCallback, kJSPropertyAttributeNone },
2207         { "webHistoryItemCount", getWebHistoryItemCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2208         { "workerThreadCount", getWorkerThreadCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2209         { 0, 0, 0, 0 }
2210     };
2211     return staticValues;
2212 }
2213
2214 JSStaticFunction* LayoutTestController::staticFunctions()
2215 {
2216     static JSStaticFunction staticFunctions[] = {
2217         { "abortModal", abortModalCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2218         { "addDisallowedURL", addDisallowedURLCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2219         { "addURLToRedirect", addURLToRedirectCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2220         { "addUserScript", addUserScriptCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2221         { "addUserStyleSheet", addUserStyleSheetCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2222         { "apiTestNewWindowDataLoadBaseURL", apiTestNewWindowDataLoadBaseURLCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2223         { "apiTestGoToCurrentBackForwardItem", apiTestGoToCurrentBackForwardItemCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2224         { "callShouldCloseOnWebView", callShouldCloseOnWebViewCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2225         { "clearAllApplicationCaches", clearAllApplicationCachesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2226         { "clearAllDatabases", clearAllDatabasesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2227         { "clearApplicationCacheForOrigin", clearApplicationCacheForOriginCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2228         { "clearBackForwardList", clearBackForwardListCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2229         { "clearPersistentUserStyleSheet", clearPersistentUserStyleSheetCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2230         { "closeWebInspector", closeWebInspectorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2231         { "computedStyleIncludingVisitedInfo", computedStyleIncludingVisitedInfoCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2232         { "nodesFromRect", nodesFromRectCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2233         { "decodeHostName", decodeHostNameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2234         { "disableImageLoading", disableImageLoadingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2235         { "dispatchPendingLoadRequests", dispatchPendingLoadRequestsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2236         { "display", displayCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2237         { "displayInvalidatedRegion", displayInvalidatedRegionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2238         { "dumpApplicationCacheDelegateCallbacks", dumpApplicationCacheDelegateCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2239         { "dumpAsText", dumpAsTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2240         { "dumpBackForwardList", dumpBackForwardListCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2241         { "dumpChildFrameScrollPositions", dumpChildFrameScrollPositionsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2242         { "dumpChildFramesAsText", dumpChildFramesAsTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2243         { "dumpConfigurationForViewport", dumpConfigurationForViewportCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2244         { "dumpDOMAsWebArchive", dumpDOMAsWebArchiveCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2245         { "dumpDatabaseCallbacks", dumpDatabaseCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2246         { "dumpEditingCallbacks", dumpEditingCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2247         { "dumpFrameLoadCallbacks", dumpFrameLoadCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2248         { "dumpUserGestureInFrameLoadCallbacks", dumpUserGestureInFrameLoadCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },        
2249         { "dumpResourceLoadCallbacks", dumpResourceLoadCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2250         { "dumpResourceResponseMIMETypes", dumpResourceResponseMIMETypesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2251         { "dumpSelectionRect", dumpSelectionRectCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2252         { "dumpSourceAsWebArchive", dumpSourceAsWebArchiveCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2253         { "dumpStatusCallbacks", dumpStatusCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2254         { "dumpTitleChanges", dumpTitleChangesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2255         { "dumpIconChanges", dumpIconChangesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2256         { "dumpWillCacheResponse", dumpWillCacheResponseCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2257         { "elementDoesAutoCompleteForElementWithId", elementDoesAutoCompleteForElementWithIdCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2258         { "encodeHostName", encodeHostNameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2259         { "ensureShadowRoot", ensureShadowRootCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2260         { "evaluateInWebInspector", evaluateInWebInspectorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2261         { "evaluateScriptInIsolatedWorld", evaluateScriptInIsolatedWorldCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2262         { "execCommand", execCommandCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2263         { "findString", findStringCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2264         { "counterValueForElementById", counterValueForElementByIdCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2265         { "originsWithApplicationCache", originsWithApplicationCacheCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2266         { "grantDesktopNotificationPermission", grantDesktopNotificationPermissionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 
2267         { "hasSpellingMarker", hasSpellingMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2268         { "hasGrammarMarker", hasGrammarMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2269         { "isCommandEnabled", isCommandEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2270         { "isPageBoxVisible", isPageBoxVisibleCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2271         { "keepWebHistory", keepWebHistoryCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2272         { "layerTreeAsText", layerTreeAsTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2273         { "numberOfPages", numberOfPagesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2274         { "numberOfPendingGeolocationPermissionRequests", numberOfPendingGeolocationPermissionRequestsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2275         { "markerTextForListItem", markerTextForListItemCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2276         { "notifyDone", notifyDoneCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2277         { "numberOfActiveAnimations", numberOfActiveAnimationsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2278         { "suspendAnimations", suspendAnimationsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2279         { "resumeAnimations", resumeAnimationsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2280         { "removeShadowRoot", removeShadowRootCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2281         { "overridePreference", overridePreferenceCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2282         { "pageNumberForElementById", pageNumberForElementByIdCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2283         { "pageSizeAndMarginsInPixels", pageSizeAndMarginsInPixelsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2284         { "pageProperty", pagePropertyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2285         { "pathToLocalResource", pathToLocalResourceCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2286         { "pauseAnimationAtTimeOnElementWithId", pauseAnimationAtTimeOnElementWithIdCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2287         { "pauseTransitionAtTimeOnElementWithId", pauseTransitionAtTimeOnElementWithIdCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2288         { "sampleSVGAnimationForElementAtTime", sampleSVGAnimationForElementAtTimeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2289         { "printToPDF", dumpAsPDFCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2290         { "queueBackNavigation", queueBackNavigationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2291         { "queueForwardNavigation", queueForwardNavigationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2292         { "queueLoad", queueLoadCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2293         { "queueLoadHTMLString", queueLoadHTMLStringCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2294         { "queueLoadingScript", queueLoadingScriptCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2295         { "queueNonLoadingScript", queueNonLoadingScriptCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2296         { "queueReload", queueReloadCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2297         { "removeAllVisitedLinks", removeAllVisitedLinksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2298         { "removeOriginAccessWhitelistEntry", removeOriginAccessWhitelistEntryCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2299         { "repaintSweepHorizontally", repaintSweepHorizontallyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2300         { "resetPageVisibility", resetPageVisibilityCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2301         { "setAcceptsEditing", setAcceptsEditingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2302         { "setAllowUniversalAccessFromFileURLs", setAllowUniversalAccessFromFileURLsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2303         { "setAllowFileAccessFromFileURLs", setAllowFileAccessFromFileURLsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2304         { "setAlwaysAcceptCookies", setAlwaysAcceptCookiesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2305         { "setAppCacheMaximumSize", setAppCacheMaximumSizeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2306         { "setApplicationCacheOriginQuota", setApplicationCacheOriginQuotaCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2307         { "setEncodedAudioData", setEncodedAudioDataCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2308         { "setAuthenticationPassword", setAuthenticationPasswordCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2309         { "setAuthenticationUsername", setAuthenticationUsernameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2310         { "setAuthorAndUserStylesEnabled", setAuthorAndUserStylesEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2311         { "setAutofilled", setAutofilledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2312         { "setCacheModel", setCacheModelCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2313         { "setCallCloseOnWebViews", setCallCloseOnWebViewsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2314         { "setCanOpenWindows", setCanOpenWindowsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2315         { "setCloseRemainingWindowsWhenComplete", setCloseRemainingWindowsWhenCompleteCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2316         { "setCustomPolicyDelegate", setCustomPolicyDelegateCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2317         { "setDatabaseQuota", setDatabaseQuotaCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 
2318         { "setDeferMainResourceDataLoad", setDeferMainResourceDataLoadCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2319         { "setDomainRelaxationForbiddenForURLScheme", setDomainRelaxationForbiddenForURLSchemeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2320         { "setEditingBehavior", setEditingBehaviorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2321         { "setFrameFlatteningEnabled", setFrameFlatteningEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2322         { "setGeolocationPermission", setGeolocationPermissionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2323         { "setHandlesAuthenticationChallenges", setHandlesAuthenticationChallengesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2324         { "setIconDatabaseEnabled", setIconDatabaseEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2325         { "setJavaScriptProfilingEnabled", setJavaScriptProfilingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2326         { "setMainFrameIsFirstResponder", setMainFrameIsFirstResponderCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2327         { "setMinimumTimerInterval", setMinimumTimerIntervalCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2328         { "setMockDeviceOrientation", setMockDeviceOrientationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2329         { "setMockGeolocationError", setMockGeolocationErrorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2330         { "setMockGeolocationPosition", setMockGeolocationPositionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2331         { "addMockSpeechInputResult", addMockSpeechInputResultCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2332         { "setNewWindowsCopyBackForwardList", setNewWindowsCopyBackForwardListCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2333         { "setPageVisibility", setPageVisibilityCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2334         { "setPOSIXLocale", setPOSIXLocaleCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2335         { "setPersistentUserStyleSheetLocation", setPersistentUserStyleSheetLocationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2336         { "setPopupBlockingEnabled", setPopupBlockingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2337         { "setPluginsEnabled", setPluginsEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2338         { "setPrinting", setPrintingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2339         { "setPrivateBrowsingEnabled", setPrivateBrowsingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2340         { "setSelectTrailingWhitespaceEnabled", setSelectTrailingWhitespaceEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2341         { "setSerializeHTTPLoads", setSerializeHTTPLoadsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2342         { "setSmartInsertDeleteEnabled", setSmartInsertDeleteEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2343         { "setSpatialNavigationEnabled", setSpatialNavigationEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2344         { "setStopProvisionalFrameLoads", setStopProvisionalFrameLoadsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2345         { "setTabKeyCyclesThroughElements", setTabKeyCyclesThroughElementsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2346         { "setTimelineProfilingEnabled", setTimelineProfilingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2347         { "setUseDashboardCompatibilityMode", setUseDashboardCompatibilityModeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2348         { "setUserStyleSheetEnabled", setUserStyleSheetEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2349         { "setUserStyleSheetLocation", setUserStyleSheetLocationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2350         { "setValueForUser", setValueForUserCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2351         { "setViewModeMediaFeature", setViewModeMediaFeatureCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2352         { "setWebViewEditable", setWebViewEditableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2353         { "setWillSendRequestClearHeader", setWillSendRequestClearHeaderCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2354         { "setWillSendRequestReturnsNull", setWillSendRequestReturnsNullCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2355         { "setWillSendRequestReturnsNullOnRedirect", setWillSendRequestReturnsNullOnRedirectCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2356         { "setWindowIsKey", setWindowIsKeyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2357         { "setJavaScriptCanAccessClipboard", setJavaScriptCanAccessClipboardCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2358         { "setXSSAuditorEnabled", setXSSAuditorEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2359         { "setAsynchronousSpellCheckingEnabled", setAsynchronousSpellCheckingEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2360         { "shadowRoot", shadowRootCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2361         { "showWebInspector", showWebInspectorCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2362         { "testOnscreen", testOnscreenCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2363         { "testRepaint", testRepaintCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2364         { "waitForPolicyDelegate", waitForPolicyDelegateCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2365         { "waitUntilDone", waitUntilDoneCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2366         { "windowCount", windowCountCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2367         { "addOriginAccessWhitelistEntry", addOriginAccessWhitelistEntryCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2368         { "setScrollbarPolicy", setScrollbarPolicyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2369         { "authenticateSession", authenticateSessionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2370         { "deleteAllLocalStorage", deleteAllLocalStorageCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2371         { "syncLocalStorage", syncLocalStorageCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },                
2372         { "observeStorageTrackerNotifications", observeStorageTrackerNotificationsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },        
2373         { "deleteLocalStorageForOrigin", deleteLocalStorageForOriginCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2374         { "originsWithLocalStorage", originsWithLocalStorageCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2375         { "setShouldPaintBrokenImage", setShouldPaintBrokenImageCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2376         { "shadowPseudoId", shadowPseudoIdCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
2377         { 0, 0, 0 }
2378     };
2379
2380     return staticFunctions;
2381 }
2382
2383 void LayoutTestController::queueLoadHTMLString(JSStringRef content, JSStringRef baseURL)
2384 {
2385     WorkQueue::shared()->queue(new LoadHTMLStringItem(content, baseURL));
2386 }
2387
2388 void LayoutTestController::queueLoadAlternateHTMLString(JSStringRef content, JSStringRef baseURL, JSStringRef unreachableURL)
2389 {
2390     WorkQueue::shared()->queue(new LoadHTMLStringItem(content, baseURL, unreachableURL));
2391 }
2392
2393 void LayoutTestController::queueBackNavigation(int howFarBack)
2394 {
2395     WorkQueue::shared()->queue(new BackItem(howFarBack));
2396 }
2397
2398 void LayoutTestController::queueForwardNavigation(int howFarForward)
2399 {
2400     WorkQueue::shared()->queue(new ForwardItem(howFarForward));
2401 }
2402
2403 void LayoutTestController::queueLoadingScript(JSStringRef script)
2404 {
2405     WorkQueue::shared()->queue(new LoadingScriptItem(script));
2406 }
2407
2408 void LayoutTestController::queueNonLoadingScript(JSStringRef script)
2409 {
2410     WorkQueue::shared()->queue(new NonLoadingScriptItem(script));
2411 }
2412
2413 void LayoutTestController::queueReload()
2414 {
2415     WorkQueue::shared()->queue(new ReloadItem);
2416 }
2417
2418 void LayoutTestController::grantDesktopNotificationPermission(JSStringRef origin)
2419 {
2420     m_desktopNotificationAllowedOrigins.push_back(JSStringRetain(origin));
2421 }
2422
2423 bool LayoutTestController::checkDesktopNotificationPermission(JSStringRef origin)
2424 {
2425     std::vector<JSStringRef>::iterator i;
2426     for (i = m_desktopNotificationAllowedOrigins.begin();
2427          i != m_desktopNotificationAllowedOrigins.end();
2428          ++i) {
2429         if (JSStringIsEqual(*i, origin))
2430             return true;
2431     }
2432     return false;
2433 }
2434
2435 void LayoutTestController::waitToDumpWatchdogTimerFired()
2436 {
2437     const char* message = "FAIL: Timed out waiting for notifyDone to be called\n";
2438     fprintf(stderr, "%s", message);
2439     fprintf(stdout, "%s", message);
2440     notifyDone();
2441 }
2442
2443 void LayoutTestController::setGeolocationPermissionCommon(bool allow)
2444 {
2445     m_isGeolocationPermissionSet = true;
2446     m_geolocationPermission = allow;
2447 }
2448
2449 void LayoutTestController::setPOSIXLocale(JSStringRef locale)
2450 {
2451     char localeBuf[32];
2452     JSStringGetUTF8CString(locale, localeBuf, sizeof(localeBuf));
2453     setlocale(LC_ALL, localeBuf);
2454 }
2455
2456 void LayoutTestController::addURLToRedirect(std::string origin, std::string destination)
2457 {
2458     m_URLsToRedirect[origin] = destination;
2459 }
2460
2461 const std::string& LayoutTestController::redirectionDestinationForURL(std::string origin)
2462 {
2463     return m_URLsToRedirect[origin];
2464 }
2465
2466 void LayoutTestController::setShouldPaintBrokenImage(bool shouldPaintBrokenImage)
2467 {
2468     m_shouldPaintBrokenImage = shouldPaintBrokenImage;
2469 }
2470
2471 const unsigned LayoutTestController::maxViewWidth = 800;
2472 const unsigned LayoutTestController::maxViewHeight = 600;