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