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