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