Rubber stamped by Darin.
[WebKit-https.git] / WebKitTools / DumpRenderTree / LayoutTestController.cpp
1 /*
2  * Copyright (C) 2007 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "LayoutTestController.h"
30
31 #include "DumpRenderTree.h"
32 #include <JavaScriptCore/Assertions.h>
33 #include <JavaScriptCore/JSObjectRef.h>
34 #include <JavaScriptCore/JSRetainPtr.h>
35
36 LayoutTestController::LayoutTestController()
37 {
38 }
39
40 LayoutTestController::~LayoutTestController()
41 {
42 }
43
44 #pragma mark -
45 #pragma mark Static Functions
46
47 static JSValueRef dumpAsTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
48 {
49     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
50     controller->dumpAsText();
51     return JSValueMakeUndefined(context);
52 }
53
54 static JSValueRef dumpBackForwardListCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
55 {
56     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
57     controller->dumpBackForwardList();
58     return JSValueMakeUndefined(context);
59 }
60
61 static JSValueRef dumpChildFramesAsTextCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
62 {
63     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
64     controller->dumpChildFramesAsText();
65     return JSValueMakeUndefined(context);
66 }
67
68 static JSValueRef dumpChildFrameScrollPositionsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
69 {
70     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
71     controller->dumpChildFrameScrollPositions();
72     return JSValueMakeUndefined(context);
73 }
74
75 static JSValueRef dumpDOMAsWebArchiveCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
76 {
77     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
78     controller->dumpDOMAsWebArchive();
79     return JSValueMakeUndefined(context);
80 }
81
82 static JSValueRef dumpEditingCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
83 {
84     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
85     controller->dumpEditingCallbacks();
86     return JSValueMakeUndefined(context);
87 }
88
89 static JSValueRef dumpFrameLoadCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
90 {
91     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
92     controller->dumpFrameLoadCallbacks();
93     return JSValueMakeUndefined(context);
94 }
95
96 static JSValueRef dumpResourceLoadCallbacksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
97 {
98     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
99     controller->dumpResourceLoadCallbacks();
100     return JSValueMakeUndefined(context);
101 }
102
103 static JSValueRef dumpSelectionRectCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
104 {
105     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
106     controller->dumpSelectionRect();
107     return JSValueMakeUndefined(context);
108 }
109
110 static JSValueRef dumpSourceAsWebArchiveCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
111 {
112     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
113     controller->dumpSourceAsWebArchive();
114     return JSValueMakeUndefined(context);
115 }
116
117 static JSValueRef dumpTitleChangesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
118 {
119     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
120     controller->dumpTitleChanges();
121     return JSValueMakeUndefined(context);
122 }
123
124 static JSValueRef repaintSweepHorizontallyCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
125 {
126     repaintSweepHorizontally = true;
127     return JSValueMakeUndefined(context);
128 }
129
130 static JSValueRef setCallCloseOnWebViewsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
131 {
132     if (argumentCount < 1)
133         return JSValueMakeUndefined(context);
134
135     closeWebViews = JSValueToBoolean(context, arguments[0]);
136     return JSValueMakeUndefined(context);
137 }
138
139 static JSValueRef setCanOpenWindowsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
140 {
141     canOpenWindows = true;
142     return JSValueMakeUndefined(context);
143 }
144
145 static JSValueRef setCloseRemainingWindowsWhenCompleteCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
146 {
147     if (argumentCount < 1)
148         return JSValueMakeUndefined(context);
149
150     closeRemainingWindowsWhenComplete = JSValueToBoolean(context, arguments[0]);
151     return JSValueMakeUndefined(context);
152 }
153
154 static JSValueRef testRepaintCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
155 {
156     testRepaint = true;
157     return JSValueMakeUndefined(context);
158 }
159
160 static JSValueRef addFileToPasteboardOnDragCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
161 {
162     addFileToPasteboardOnDrag = YES;
163     return JSValueMakeUndefined(context);
164 }
165
166 static JSValueRef addDisallowedURLCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
167 {
168     // Has mac implementation
169     if (argumentCount < 1)
170         return JSValueMakeUndefined(context);
171
172     JSRetainPtr<JSStringRef> url(Adopt, JSValueToStringCopy(context, arguments[0], exception));
173     ASSERT(!*exception);
174
175     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
176     controller->addDisallowedURL(url.get());
177
178     return JSValueMakeUndefined(context);
179 }
180
181 static JSValueRef clearBackForwardListCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
182 {
183     // Has mac & windows implementation
184     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
185     controller->clearBackForwardList();
186
187     return JSValueMakeUndefined(context);
188 }
189
190 static JSValueRef decodeHostNameCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
191 {
192     // Has mac implementation
193     if (argumentCount < 1)
194         return JSValueMakeUndefined(context);
195
196     JSRetainPtr<JSStringRef> name(Adopt, JSValueToStringCopy(context, arguments[0], exception));
197     ASSERT(!*exception);
198
199     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
200     JSRetainPtr<JSStringRef> decodedHostName(Adopt, controller->copyDecodedHostName(name.get()));
201     return JSValueMakeString(context, decodedHostName.get());
202 }
203
204 static JSValueRef displayCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
205 {
206     // Has mac & windows implementation
207     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
208     controller->display();
209
210     return JSValueMakeUndefined(context);
211 }
212
213 static JSValueRef encodeHostNameCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
214 {
215     // Has mac implementation
216     if (argumentCount < 1)
217         return JSValueMakeUndefined(context);
218
219     JSRetainPtr<JSStringRef> name(Adopt, JSValueToStringCopy(context, arguments[0], exception));
220     ASSERT(!*exception);
221
222     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
223     JSRetainPtr<JSStringRef> encodedHostName(Adopt, controller->copyEncodedHostName(name.get()));
224     return JSValueMakeString(context, encodedHostName.get());
225 }
226
227 static JSValueRef keepWebHistoryCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
228 {
229     // Has mac implementation
230     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
231     controller->keepWebHistory();
232
233     return JSValueMakeUndefined(context);
234 }
235
236 static JSValueRef notifyDoneCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
237 {
238     // Has mac & windows implementation
239     // May be able to be made platform independant by using shared WorkQueue
240     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
241     controller->notifyDone();
242
243     return JSValueMakeUndefined(context);
244 }
245
246 static JSValueRef queueBackNavigationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
247 {
248     // Has mac & windows implementation
249     // May be able to be made platform independant by using shared WorkQueue
250     if (argumentCount < 1)
251         return JSValueMakeUndefined(context);
252
253     double howFarBackDouble = JSValueToNumber(context, arguments[0], exception);
254     ASSERT(!*exception);
255
256     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
257     controller->queueBackNavigation(static_cast<int>(howFarBackDouble));
258
259     return JSValueMakeUndefined(context);
260 }
261
262 static JSValueRef queueForwardNavigationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
263 {
264     // Has mac & windows implementation
265     // May be able to be made platform independant by using shared WorkQueue
266     if (argumentCount < 1)
267         return JSValueMakeUndefined(context);
268
269     double howFarForwardDouble = JSValueToNumber(context, arguments[0], exception);
270     ASSERT(!*exception);
271
272     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
273     controller->queueForwardNavigation(static_cast<int>(howFarForwardDouble));
274
275     return JSValueMakeUndefined(context);
276 }
277
278 static JSValueRef queueLoadCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
279 {
280     // Has mac & windows implementation
281     // May be able to be made platform independant by using shared WorkQueue
282     if (argumentCount < 1)
283         return JSValueMakeUndefined(context);
284
285     JSRetainPtr<JSStringRef> url(Adopt, JSValueToStringCopy(context, arguments[0], exception));
286     ASSERT(!*exception);
287
288     JSRetainPtr<JSStringRef> target;
289     if (argumentCount >= 2) {
290         target.adopt(JSValueToStringCopy(context, arguments[1], exception));
291         ASSERT(!*exception);
292     } else
293         target.adopt(JSStringCreateWithUTF8CString(""));
294
295     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
296     controller->queueLoad(url.get(), target.get());
297
298     return JSValueMakeUndefined(context);
299 }
300
301 static JSValueRef queueReloadCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
302 {
303     // Has mac & windows implementation
304     // May be able to be made platform independant by using shared WorkQueue
305
306     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
307     controller->queueReload();
308
309     return JSValueMakeUndefined(context);
310 }
311
312 static JSValueRef queueScriptCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
313 {
314     // Has mac & windows implementation
315     // May be able to be made platform independant by using shared WorkQueue
316     if (argumentCount < 1)
317         return JSValueMakeUndefined(context);
318
319     JSRetainPtr<JSStringRef> script(Adopt, JSValueToStringCopy(context, arguments[0], exception));
320     ASSERT(!*exception);
321
322     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
323     controller->queueScript(script.get());
324
325     return JSValueMakeUndefined(context);
326 }
327
328 static JSValueRef setAcceptsEditingCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
329 {
330     // Has mac & windows implementation
331     if (argumentCount < 1)
332         return JSValueMakeUndefined(context);
333
334     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
335     controller->setAcceptsEditing(JSValueToBoolean(context, arguments[0]));
336
337     return JSValueMakeUndefined(context);
338 }
339
340 static JSValueRef setCustomPolicyDelegateCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
341 {
342     // Has mac implementation
343     if (argumentCount < 1)
344         return JSValueMakeUndefined(context);
345
346     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
347     controller->setCustomPolicyDelegate(JSValueToBoolean(context, arguments[0]));
348
349     return JSValueMakeUndefined(context);
350 }
351
352 static JSValueRef setMainFrameIsFirstResponderCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
353 {
354     // Has mac implementation
355     if (argumentCount < 1)
356         return JSValueMakeUndefined(context);
357
358     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
359     controller->setMainFrameIsFirstResponder(JSValueToBoolean(context, arguments[0]));
360
361     return JSValueMakeUndefined(context);
362 }
363
364 static JSValueRef setTabKeyCyclesThroughElementsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
365 {
366     // Has mac & windows implementation
367     if (argumentCount < 1)
368         return JSValueMakeUndefined(context);
369
370     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
371     controller->setTabKeyCyclesThroughElements(JSValueToBoolean(context, arguments[0]));
372
373     return JSValueMakeUndefined(context);
374 }
375
376 static JSValueRef setUseDashboardCompatibilityModeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
377 {
378     // Has mac implementation
379     if (argumentCount < 1)
380         return JSValueMakeUndefined(context);
381
382     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
383     controller->setUseDashboardCompatibilityMode(JSValueToBoolean(context, arguments[0]));
384
385     return JSValueMakeUndefined(context);
386 }
387
388 static JSValueRef setUserStyleSheetEnabledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
389 {
390     // Has mac implementation
391     if (argumentCount < 1)
392         return JSValueMakeUndefined(context);
393
394     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
395     controller->setUserStyleSheetEnabled(JSValueToBoolean(context, arguments[0]));
396
397     return JSValueMakeUndefined(context);
398 }
399
400 static JSValueRef setUserStyleSheetLocationCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
401 {
402     // Has mac implementation
403     if (argumentCount < 1)
404         return JSValueMakeUndefined(context);
405
406     JSRetainPtr<JSStringRef> path(Adopt, JSValueToStringCopy(context, arguments[0], exception));
407     ASSERT(!*exception);
408
409     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
410     controller->setUserStyleSheetLocation(path.get());
411
412     return JSValueMakeUndefined(context);
413 }
414
415 static JSValueRef setWindowIsKeyCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
416 {
417     // Has mac implementation
418     if (argumentCount < 1)
419         return JSValueMakeUndefined(context);
420
421     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
422     controller->setWindowIsKey(JSValueToBoolean(context, arguments[0]));
423
424     return JSValueMakeUndefined(context);
425 }
426
427 static JSValueRef waitUntilDoneCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
428 {
429     // Has mac & windows implementation
430     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
431     controller->waitUntilDone();
432
433     return JSValueMakeUndefined(context);
434 }
435
436 static JSValueRef windowCountCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
437 {
438     // Has mac implementation
439     LayoutTestController* controller = reinterpret_cast<LayoutTestController*>(JSObjectGetPrivate(thisObject));
440     int windows = controller->windowCount();
441     return JSValueMakeNumber(context, windows);
442 }
443
444 #pragma mark -
445 #pragma mark Object Creation
446
447 void LayoutTestController::makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception)
448 {
449     JSRetainPtr<JSStringRef> layoutTestContollerStr(Adopt, JSStringCreateWithUTF8CString("layoutTestController"));
450     JSValueRef layoutTestContollerObject = JSObjectMake(context, getJSClass(), this);
451     JSObjectSetProperty(context, windowObject, layoutTestContollerStr.get(), layoutTestContollerObject, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, exception);
452 }
453
454 JSClassRef LayoutTestController::getJSClass()
455 {
456     static JSClassRef layoutTestControllerClass = 0;
457
458     if (!layoutTestControllerClass) {
459         JSStaticFunction* staticFunctions = LayoutTestController::staticFunctions();
460         JSClassDefinition classDefinition = {
461             0, kJSClassAttributeNone, "LayoutTestController", 0, 0, staticFunctions,
462             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
463         };
464
465         layoutTestControllerClass = JSClassCreate(&classDefinition);
466     }
467
468     return layoutTestControllerClass;
469 }
470
471 JSStaticFunction* LayoutTestController::staticFunctions()
472 {
473     static JSStaticFunction staticFunctions[] = {
474         { "addDisallowedURL", addDisallowedURLCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
475         { "addFileToPasteboardOnDrag", addFileToPasteboardOnDragCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
476         { "clearBackForwardList", clearBackForwardListCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
477         { "decodeHostName", decodeHostNameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
478         { "display", displayCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
479         { "dumpAsText", dumpAsTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
480         { "dumpBackForwardList", dumpBackForwardListCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
481         { "dumpChildFramesAsText", dumpChildFramesAsTextCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
482         { "dumpChildFrameScrollPositions", dumpChildFrameScrollPositionsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
483         { "dumpDOMAsWebArchive", dumpDOMAsWebArchiveCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
484         { "dumpEditingCallbacks", dumpEditingCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
485         { "dumpFrameLoadCallbacks", dumpFrameLoadCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
486         { "dumpResourceLoadCallbacks", dumpResourceLoadCallbacksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
487         { "dumpSelectionRect", dumpSelectionRectCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
488         { "dumpSourceAsWebArchive", dumpSourceAsWebArchiveCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
489         { "dumpTitleChanges", dumpTitleChangesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
490         { "encodeHostName", encodeHostNameCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
491         { "keepWebHistory", keepWebHistoryCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
492         { "notifyDone", notifyDoneCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
493         { "queueBackNavigation", queueBackNavigationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
494         { "queueForwardNavigation", queueForwardNavigationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
495         { "queueLoad", queueLoadCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
496         { "queueReload", queueReloadCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
497         { "queueScript", queueScriptCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
498         { "repaintSweepHorizontally", repaintSweepHorizontallyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
499         { "setAcceptsEditing", setAcceptsEditingCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
500         { "setCallCloseOnWebViews", setCallCloseOnWebViewsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
501         { "setCanOpenWindows", setCanOpenWindowsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
502         { "setCloseRemainingWindowsWhenComplete", setCloseRemainingWindowsWhenCompleteCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
503         { "setCustomPolicyDelegate", setCustomPolicyDelegateCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
504         { "setMainFrameIsFirstResponder", setMainFrameIsFirstResponderCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
505         { "setTabKeyCyclesThroughElements", setTabKeyCyclesThroughElementsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
506         { "setUseDashboardCompatibilityMode", setUseDashboardCompatibilityModeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
507         { "setUserStyleSheetEnabled", setUserStyleSheetEnabledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
508         { "setUserStyleSheetLocation", setUserStyleSheetLocationCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
509         { "setWindowIsKey", setWindowIsKeyCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
510         { "testRepaint", testRepaintCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
511         { "waitUntilDone", waitUntilDoneCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
512         { "windowCount", windowCountCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
513         { 0, 0, 0 }
514     };
515
516     return staticFunctions;
517 }