• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 Kevin Ollivier <kevino@theolliviers.com>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include "config.h"
30 #include "LayoutTestController.h"
31 
32 #include "DumpRenderTree.h"
33 #include "WorkQueue.h"
34 #include "WorkQueueItem.h"
35 #include <JavaScriptCore/JSRetainPtr.h>
36 #include <JavaScriptCore/JSStringRef.h>
37 
38 #include <stdio.h>
39 
40 
41 
~LayoutTestController()42 LayoutTestController::~LayoutTestController()
43 {
44     // FIXME: implement
45 }
46 
addDisallowedURL(JSStringRef url)47 void LayoutTestController::addDisallowedURL(JSStringRef url)
48 {
49     // FIXME: implement
50 }
51 
clearBackForwardList()52 void LayoutTestController::clearBackForwardList()
53 {
54 }
55 
copyDecodedHostName(JSStringRef name)56 JSStringRef LayoutTestController::copyDecodedHostName(JSStringRef name)
57 {
58     // FIXME: implement
59     return 0;
60 }
61 
copyEncodedHostName(JSStringRef name)62 JSStringRef LayoutTestController::copyEncodedHostName(JSStringRef name)
63 {
64     // FIXME: implement
65     return 0;
66 }
67 
dispatchPendingLoadRequests()68 void LayoutTestController::dispatchPendingLoadRequests()
69 {
70     // FIXME: Implement for testing fix for 6727495
71 }
72 
display()73 void LayoutTestController::display()
74 {
75 }
76 
keepWebHistory()77 void LayoutTestController::keepWebHistory()
78 {
79     // FIXME: implement
80 }
81 
notifyDone()82 void LayoutTestController::notifyDone()
83 {
84     if (m_waitToDump && !WorkQueue::shared()->count())
85         notifyDoneFired();
86     m_waitToDump = false;
87 }
88 
pathToLocalResource(JSContextRef context,JSStringRef url)89 JSStringRef LayoutTestController::pathToLocalResource(JSContextRef context, JSStringRef url)
90 {
91     // Function introduced in r28690. This may need special-casing on Windows.
92     return JSStringRetain(url); // Do nothing on Unix.
93 }
94 
queueLoad(JSStringRef url,JSStringRef target)95 void LayoutTestController::queueLoad(JSStringRef url, JSStringRef target)
96 {
97     // FIXME: We need to resolve relative URLs here
98     WorkQueue::shared()->queue(new LoadItem(url, target));
99 }
100 
setAcceptsEditing(bool acceptsEditing)101 void LayoutTestController::setAcceptsEditing(bool acceptsEditing)
102 {
103 }
104 
setAlwaysAcceptCookies(bool alwaysAcceptCookies)105 void LayoutTestController::setAlwaysAcceptCookies(bool alwaysAcceptCookies)
106 {
107     // FIXME: Implement this (and restore the default value before running each test in DumpRenderTree.cpp).
108 }
109 
setCustomPolicyDelegate(bool,bool)110 void LayoutTestController::setCustomPolicyDelegate(bool, bool)
111 {
112     // FIXME: implement
113 }
114 
setMainFrameIsFirstResponder(bool flag)115 void LayoutTestController::setMainFrameIsFirstResponder(bool flag)
116 {
117     // FIXME: implement
118 }
119 
setTabKeyCyclesThroughElements(bool cycles)120 void LayoutTestController::setTabKeyCyclesThroughElements(bool cycles)
121 {
122     // FIXME: implement
123 }
124 
setUseDashboardCompatibilityMode(bool flag)125 void LayoutTestController::setUseDashboardCompatibilityMode(bool flag)
126 {
127     // FIXME: implement
128 }
129 
setUserStyleSheetEnabled(bool flag)130 void LayoutTestController::setUserStyleSheetEnabled(bool flag)
131 {
132 }
133 
setUserStyleSheetLocation(JSStringRef path)134 void LayoutTestController::setUserStyleSheetLocation(JSStringRef path)
135 {
136 }
137 
setValueForUser(JSContextRef context,JSValueRef element,JSStringRef value)138 void LayoutTestController::setValueForUser(JSContextRef context, JSValueRef element, JSStringRef value)
139 {
140     // FIXME: implement
141 }
142 
setViewModeMediaFeature(JSStringRef mode)143 void LayoutTestController::setViewModeMediaFeature(JSStringRef mode)
144 {
145     // FIXME: implement
146 }
147 
setWindowIsKey(bool windowIsKey)148 void LayoutTestController::setWindowIsKey(bool windowIsKey)
149 {
150     // FIXME: implement
151 }
152 
setSmartInsertDeleteEnabled(bool flag)153 void LayoutTestController::setSmartInsertDeleteEnabled(bool flag)
154 {
155     // FIXME: implement
156 }
157 
setJavaScriptProfilingEnabled(bool flag)158 void LayoutTestController::setJavaScriptProfilingEnabled(bool flag)
159 {
160 }
161 
setWaitToDump(bool waitUntilDone)162 void LayoutTestController::setWaitToDump(bool waitUntilDone)
163 {
164     static const int timeoutSeconds = 10;
165 
166     m_waitToDump = waitUntilDone;
167 }
168 
windowCount()169 int LayoutTestController::windowCount()
170 {
171     // FIXME: implement
172     return 1;
173 }
174 
setPrivateBrowsingEnabled(bool privateBrowsingEnabled)175 void LayoutTestController::setPrivateBrowsingEnabled(bool privateBrowsingEnabled)
176 {
177     // FIXME: implement
178 }
179 
setJavaScriptCanAccessClipboard(bool enabled)180 void LayoutTestController::setJavaScriptCanAccessClipboard(bool enabled)
181 {
182     // FIXME: implement
183 }
184 
setXSSAuditorEnabled(bool enabled)185 void LayoutTestController::setXSSAuditorEnabled(bool enabled)
186 {
187     // FIXME: implement
188 }
189 
setFrameFlatteningEnabled(bool enabled)190 void LayoutTestController::setFrameFlatteningEnabled(bool enabled)
191 {
192     // FIXME: implement
193 }
194 
setAllowUniversalAccessFromFileURLs(bool enabled)195 void LayoutTestController::setAllowUniversalAccessFromFileURLs(bool enabled)
196 {
197     // FIXME: implement
198 }
199 
setAllowFileAccessFromFileURLs(bool enabled)200 void LayoutTestController::setAllowFileAccessFromFileURLs(bool enabled)
201 {
202     // FIXME: implement
203 }
204 
setAuthorAndUserStylesEnabled(bool flag)205 void LayoutTestController::setAuthorAndUserStylesEnabled(bool flag)
206 {
207     // FIXME: implement
208 }
209 
setAutofilled(JSContextRef,JSValueRef element,bool isAutofilled)210 void LayoutTestController::setAutofilled(JSContextRef, JSValueRef element, bool isAutofilled)
211 {
212     // FIXME: implement
213 }
214 
setPopupBlockingEnabled(bool popupBlockingEnabled)215 void LayoutTestController::setPopupBlockingEnabled(bool popupBlockingEnabled)
216 {
217     // FIXME: implement
218 }
219 
setPluginsEnabled(bool flag)220 void LayoutTestController::setPluginsEnabled(bool flag)
221 {
222     // FIXME: Implement
223 }
224 
elementDoesAutoCompleteForElementWithId(JSStringRef id)225 bool LayoutTestController::elementDoesAutoCompleteForElementWithId(JSStringRef id)
226 {
227     // FIXME: implement
228     return false;
229 }
230 
execCommand(JSStringRef name,JSStringRef value)231 void LayoutTestController::execCommand(JSStringRef name, JSStringRef value)
232 {
233     // FIXME: implement
234 }
235 
setPersistentUserStyleSheetLocation(JSStringRef jsURL)236 void LayoutTestController::setPersistentUserStyleSheetLocation(JSStringRef jsURL)
237 {
238     // FIXME: implement
239 }
240 
clearPersistentUserStyleSheet()241 void LayoutTestController::clearPersistentUserStyleSheet()
242 {
243     // FIXME: implement
244 }
245 
clearAllApplicationCaches()246 void LayoutTestController::clearAllApplicationCaches()
247 {
248     // FIXME: Implement to support application cache quotas.
249 }
250 
clearApplicationCacheForOrigin(JSStringRef url)251 void LayoutTestController::clearApplicationCacheForOrigin(JSStringRef url)
252 {
253     // FIXME: Implement to support deleting all application cache for an origin.
254 }
255 
setApplicationCacheOriginQuota(unsigned long long quota)256 void LayoutTestController::setApplicationCacheOriginQuota(unsigned long long quota)
257 {
258     // FIXME: Implement to support application cache quotas.
259 }
260 
originsWithApplicationCache(JSContextRef context)261 JSValueRef LayoutTestController::originsWithApplicationCache(JSContextRef context)
262 {
263     // FIXME: Implement to get origins that have application caches.
264     return 0;
265 }
266 
clearAllDatabases()267 void LayoutTestController::clearAllDatabases()
268 {
269     // FIXME: implement
270 }
271 
setDatabaseQuota(unsigned long long quota)272 void LayoutTestController::setDatabaseQuota(unsigned long long quota)
273 {
274     // FIXME: implement
275 }
276 
setDomainRelaxationForbiddenForURLScheme(bool,JSStringRef)277 void LayoutTestController::setDomainRelaxationForbiddenForURLScheme(bool, JSStringRef)
278 {
279     // FIXME: implement
280 }
281 
setAppCacheMaximumSize(unsigned long long size)282 void LayoutTestController::setAppCacheMaximumSize(unsigned long long size)
283 {
284     // FIXME: implement
285 }
286 
numberOfActiveAnimations() const287 unsigned LayoutTestController::numberOfActiveAnimations() const
288 {
289     // FIXME: implement
290     return 0;
291 }
292 
suspendAnimations() const293 void LayoutTestController::suspendAnimations() const
294 {
295     // FIXME: implement
296 }
297 
resumeAnimations() const298 void LayoutTestController::resumeAnimations() const
299 {
300     // FIXME: implement
301 }
302 
workerThreadCount() const303 unsigned LayoutTestController::workerThreadCount() const
304 {
305     // FIXME: implement
306     return 0;
307 }
308 
setSelectTrailingWhitespaceEnabled(bool flag)309 void LayoutTestController::setSelectTrailingWhitespaceEnabled(bool flag)
310 {
311     // FIXME: implement
312 }
313 
pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName,double time,JSStringRef elementId)314 bool LayoutTestController::pauseTransitionAtTimeOnElementWithId(JSStringRef propertyName, double time, JSStringRef elementId)
315 {
316     // FIXME: implement
317     return false;
318 }
319 
setMockDeviceOrientation(bool canProvideAlpha,double alpha,bool canProvideBeta,double beta,bool canProvideGamma,double gamma)320 void LayoutTestController::setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma)
321 {
322     // FIXME: Implement for DeviceOrientation layout tests.
323     // See https://bugs.webkit.org/show_bug.cgi?id=30335.
324 }
325 
setMockGeolocationPosition(double latitude,double longitude,double accuracy)326 void LayoutTestController::setMockGeolocationPosition(double latitude, double longitude, double accuracy)
327 {
328     // FIXME: Implement for Geolocation layout tests.
329     // See https://bugs.webkit.org/show_bug.cgi?id=28264.
330 }
331 
setMockGeolocationError(int code,JSStringRef message)332 void LayoutTestController::setMockGeolocationError(int code, JSStringRef message)
333 {
334     // FIXME: Implement for Geolocation layout tests.
335     // See https://bugs.webkit.org/show_bug.cgi?id=28264.
336 }
337 
setGeolocationPermission(bool allow)338 void LayoutTestController::setGeolocationPermission(bool allow)
339 {
340     // FIXME: Implement for Geolocation layout tests.
341     setGeolocationPermissionCommon(allow);
342 }
343 
numberOfPendingGeolocationPermissionRequests()344 int LayoutTestController::numberOfPendingGeolocationPermissionRequests()
345 {
346     // FIXME: Implement for Geolocation layout tests.
347     return -1;
348 }
349 
addMockSpeechInputResult(JSStringRef result,double confidence,JSStringRef language)350 void LayoutTestController::addMockSpeechInputResult(JSStringRef result, double confidence, JSStringRef language)
351 {
352     // FIXME: Implement for speech input layout tests.
353     // See https://bugs.webkit.org/show_bug.cgi?id=39485.
354 }
355 
setIconDatabaseEnabled(bool iconDatabaseEnabled)356 void LayoutTestController::setIconDatabaseEnabled(bool iconDatabaseEnabled)
357 {
358     // FIXME: implement
359 }
360 
pauseAnimationAtTimeOnElementWithId(JSStringRef animationName,double time,JSStringRef elementId)361 bool LayoutTestController::pauseAnimationAtTimeOnElementWithId(JSStringRef animationName, double time, JSStringRef elementId)
362 {
363     // FIXME: implement
364     return false;
365 }
366 
sampleSVGAnimationForElementAtTime(JSStringRef animationId,double time,JSStringRef elementId)367 bool LayoutTestController::sampleSVGAnimationForElementAtTime(JSStringRef animationId, double time, JSStringRef elementId)
368 {
369     // FIXME: implement
370     return false;
371 }
372 
setCacheModel(int)373 void LayoutTestController::setCacheModel(int)
374 {
375     // FIXME: implement
376 }
377 
isCommandEnabled(JSStringRef)378 bool LayoutTestController::isCommandEnabled(JSStringRef /*name*/)
379 {
380     // FIXME: implement
381     return false;
382 }
383 
webHistoryItemCount()384 size_t LayoutTestController::webHistoryItemCount()
385 {
386     // FIXME: implement
387     return 0;
388 }
389 
waitForPolicyDelegate()390 void LayoutTestController::waitForPolicyDelegate()
391 {
392     // FIXME: Implement this.
393 }
394 
overridePreference(JSStringRef,JSStringRef)395 void LayoutTestController::overridePreference(JSStringRef /* key */, JSStringRef /* value */)
396 {
397     // FIXME: implement
398 }
399 
addUserScript(JSStringRef source,bool runAtStart,bool allFrames)400 void LayoutTestController::addUserScript(JSStringRef source, bool runAtStart, bool allFrames)
401 {
402     printf("LayoutTestController::addUserScript not implemented.\n");
403 }
404 
addUserStyleSheet(JSStringRef source,bool allFrames)405 void LayoutTestController::addUserStyleSheet(JSStringRef source, bool allFrames)
406 {
407     printf("LayoutTestController::addUserStyleSheet not implemented.\n");
408 }
409 
showWebInspector()410 void LayoutTestController::showWebInspector()
411 {
412     // FIXME: Implement this.
413 }
414 
closeWebInspector()415 void LayoutTestController::closeWebInspector()
416 {
417     // FIXME: Implement this.
418 }
419 
evaluateInWebInspector(long callId,JSStringRef script)420 void LayoutTestController::evaluateInWebInspector(long callId, JSStringRef script)
421 {
422     // FIXME: Implement this.
423 }
424 
removeAllVisitedLinks()425 void LayoutTestController::removeAllVisitedLinks()
426 {
427     // FIXME: Implement this.
428 }
429 
setTimelineProfilingEnabled(bool enabled)430 void LayoutTestController::setTimelineProfilingEnabled(bool enabled)
431 {
432 
433 }
434 
evaluateScriptInIsolatedWorld(unsigned worldId,JSObjectRef globalObject,JSStringRef script)435 void LayoutTestController::evaluateScriptInIsolatedWorld(unsigned worldId, JSObjectRef globalObject, JSStringRef script)
436 {
437 
438 }
439 
disableImageLoading()440 void LayoutTestController::disableImageLoading()
441 {
442 
443 }
444 
addOriginAccessWhitelistEntry(JSStringRef sourceOrigin,JSStringRef destinationProtocol,JSStringRef destinationHost,bool allowDestinationSubdomains)445 void LayoutTestController::addOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
446 {
447     // FIXME: implement
448 }
449 
removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin,JSStringRef destinationProtocol,JSStringRef destinationHost,bool allowDestinationSubdomains)450 void LayoutTestController::removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef destinationProtocol, JSStringRef destinationHost, bool allowDestinationSubdomains)
451 {
452     // FIXME: implement
453 }
454 
setScrollbarPolicy(JSStringRef orientation,JSStringRef policy)455 void LayoutTestController::setScrollbarPolicy(JSStringRef orientation, JSStringRef policy)
456 {
457     // FIXME: implement
458 }
459 
counterValueForElementById(JSStringRef id)460 JSRetainPtr<JSStringRef> LayoutTestController::counterValueForElementById(JSStringRef id)
461 {
462     return 0;
463 }
464 
pageNumberForElementById(JSStringRef,float,float)465 int LayoutTestController::pageNumberForElementById(JSStringRef, float, float)
466 {
467     // FIXME: implement
468     return -1;
469 }
470 
numberOfPages(float,float)471 int LayoutTestController::numberOfPages(float, float)
472 {
473     // FIXME: implement
474     return -1;
475 }
476 
apiTestNewWindowDataLoadBaseURL(JSStringRef utf8Data,JSStringRef baseURL)477 void LayoutTestController::apiTestNewWindowDataLoadBaseURL(JSStringRef utf8Data, JSStringRef baseURL)
478 {
479 
480 }
481 
apiTestGoToCurrentBackForwardItem()482 void LayoutTestController::apiTestGoToCurrentBackForwardItem()
483 {
484 
485 }
486 
setSpatialNavigationEnabled(bool)487 void LayoutTestController::setSpatialNavigationEnabled(bool)
488 {
489 
490 }
491 
setWebViewEditable(bool)492 void LayoutTestController::setWebViewEditable(bool)
493 {
494 }
495 
callShouldCloseOnWebView()496 bool LayoutTestController::callShouldCloseOnWebView()
497 {
498     return false;
499 }
500 
layerTreeAsText() const501 JSRetainPtr<JSStringRef> LayoutTestController::layerTreeAsText() const
502 {
503     return 0;
504 }
505 
markerTextForListItem(JSContextRef context,JSValueRef nodeObject) const506 JSRetainPtr<JSStringRef> LayoutTestController::markerTextForListItem(JSContextRef context, JSValueRef nodeObject) const
507 {
508     return 0;
509 }
510 
computedStyleIncludingVisitedInfo(JSContextRef,JSValueRef)511 JSValueRef LayoutTestController::computedStyleIncludingVisitedInfo(JSContextRef, JSValueRef)
512 {
513     return 0;
514 }
515 
nodesFromRect(JSContextRef context,JSValueRef value,int x,int y,unsigned top,unsigned right,unsigned bottom,unsigned left,bool ignoreClipping)516 JSValueRef LayoutTestController::nodesFromRect(JSContextRef context, JSValueRef value, int x, int y, unsigned top, unsigned right, unsigned bottom, unsigned left, bool ignoreClipping)
517 {
518     // FIXME: Implement this.
519     return 0;
520 }
521 
authenticateSession(JSStringRef,JSStringRef,JSStringRef)522 void LayoutTestController::authenticateSession(JSStringRef, JSStringRef, JSStringRef)
523 {
524 }
525 
setEditingBehavior(const char * editingBehavior)526 void LayoutTestController::setEditingBehavior(const char* editingBehavior)
527 {
528     // FIXME: Implement
529 }
530 
abortModal()531 void LayoutTestController::abortModal()
532 {
533 }
534 
hasSpellingMarker(int,int)535 bool LayoutTestController::hasSpellingMarker(int, int)
536 {
537     // FIXME: Implement
538     return false;
539 }
540 
hasGrammarMarker(int,int)541 bool LayoutTestController::hasGrammarMarker(int, int)
542 {
543     // FIXME: Implement
544     return false;
545 }
546 
dumpConfigurationForViewport(int,int,int,int,int)547 void LayoutTestController::dumpConfigurationForViewport(int /*deviceDPI*/, int /*deviceWidth*/, int /*deviceHeight*/, int /*availableWidth*/, int /*availableHeight*/)
548 {
549     // FIXME: Implement
550 }
551 
pageProperty(const char * propertyName,int pageNumber) const552 JSRetainPtr<JSStringRef> LayoutTestController::pageProperty(const char* propertyName, int pageNumber) const
553 {
554     // FIXME: Implement
555     return 0;
556 }
557 
isPageBoxVisible(int pageNumber) const558 bool LayoutTestController::isPageBoxVisible(int pageNumber) const
559 {
560     // FIXME: Implement
561     return true;
562 }
563 
pageSizeAndMarginsInPixels(int pageNumber,int width,int height,int marginTop,int marginRight,int marginBottom,int marginLeft) const564 JSRetainPtr<JSStringRef> LayoutTestController::pageSizeAndMarginsInPixels(int pageNumber, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft) const
565 {
566     // FIXME: Implement
567     return 0;
568 }
569 
setAsynchronousSpellCheckingEnabled(bool)570 void LayoutTestController::setAsynchronousSpellCheckingEnabled(bool)
571 {
572     // FIXME: Implement this.
573 }
574 
findString(JSContextRef context,JSStringRef target,JSObjectRef optionsArray)575 bool LayoutTestController::findString(JSContextRef context, JSStringRef target, JSObjectRef optionsArray)
576 {
577     // FIXME: Implement
578     return false;
579 }
580 
setSerializeHTTPLoads(bool)581 void LayoutTestController::setSerializeHTTPLoads(bool)
582 {
583     // FIXME: Implement.
584 }
585 
setMinimumTimerInterval(double interval)586 void LayoutTestController::setMinimumTimerInterval(double interval) {
587 
588 }
589 
syncLocalStorage()590 void LayoutTestController::syncLocalStorage()
591 {
592     // FIXME: Implement.
593 }
594 
observeStorageTrackerNotifications(unsigned number)595 void LayoutTestController::observeStorageTrackerNotifications(unsigned number)
596 {
597     // FIXME: Implement.
598 }
599 
deleteAllLocalStorage()600 void LayoutTestController::deleteAllLocalStorage()
601 {
602     // FIXME: Implement.
603 }
604 
originsWithLocalStorage(JSContextRef context)605 JSValueRef LayoutTestController::originsWithLocalStorage(JSContextRef context)
606 {
607     // FIXME: Implement.
608     return 0;
609 }
610 
deleteLocalStorageForOrigin(JSStringRef URL)611 void LayoutTestController::deleteLocalStorageForOrigin(JSStringRef URL)
612 {
613     // FIXME: Implement.
614 }
615 
shadowRoot(const OpaqueJSContext *,const OpaqueJSValue *)616 const OpaqueJSValue* LayoutTestController::shadowRoot(const OpaqueJSContext*, const OpaqueJSValue*)
617 {
618     // FIXME: Implement.
619     return 0;
620 }
621