Prevent assertion/duplicate loads for non-deferred subtitute-data loads
[WebKit-https.git] / WebKitTools / DumpRenderTree / qt / LayoutTestControllerQt.cpp
1 /*
2  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
3  * Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
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 #include "config.h"
30 #include "LayoutTestControllerQt.h"
31 #include "../../../WebKit/qt/WebCoreSupport/DumpRenderTreeSupportQt.h"
32
33 #include "DumpRenderTreeQt.h"
34 #include "WorkQueue.h"
35 #include "WorkQueueItemQt.h"
36 #include <QDir>
37 #include <QLocale>
38 #include <qwebsettings.h>
39
40 LayoutTestController::LayoutTestController(WebCore::DumpRenderTree* drt)
41     : QObject()
42     , m_drt(drt)
43 {
44     qRegisterMetaType<QWebElement>("QWebElement");
45     reset();
46     DumpRenderTreeSupportQt::dumpNotification(true);
47 }
48
49 void LayoutTestController::reset()
50 {
51     m_hasDumped = false;
52     m_loadFinished = false;
53     m_textDump = false;
54     m_dumpBackForwardList = false;
55     m_dumpChildrenAsText = false;
56     m_dumpChildFrameScrollPositions = false;
57     m_canOpenWindows = false;
58     m_waitForDone = false;
59     m_dumpTitleChanges = false;
60     m_dumpDatabaseCallbacks = false;
61     m_dumpStatusCallbacks = false;
62     m_timeoutTimer.stop();
63     m_topLoadingFrame = 0;
64     m_waitForPolicy = false;
65     m_handleErrorPages = false;
66     m_webHistory = 0;
67     m_globalFlag = false;
68     m_userStyleSheetEnabled = false;
69     m_desktopNotificationAllowedOrigins.clear();
70
71     DumpRenderTreeSupportQt::dumpEditingCallbacks(false);
72     DumpRenderTreeSupportQt::dumpFrameLoader(false);
73     DumpRenderTreeSupportQt::dumpResourceLoadCallbacks(false);
74     DumpRenderTreeSupportQt::dumpResourceResponseMIMETypes(false);
75     DumpRenderTreeSupportQt::setDeferMainResourceDataLoad(true);
76     DumpRenderTreeSupportQt::setWillSendRequestReturnsNullOnRedirect(false);
77     DumpRenderTreeSupportQt::setWillSendRequestReturnsNull(false);
78     DumpRenderTreeSupportQt::setWillSendRequestClearHeaders(QStringList());
79     DumpRenderTreeSupportQt::clearScriptWorlds();
80     DumpRenderTreeSupportQt::setCustomPolicyDelegate(false, false);
81     setIconDatabaseEnabled(false);
82
83     emit hidePage();
84 }
85
86 void LayoutTestController::processWork()
87 {
88     // qDebug() << ">>>processWork";
89
90     // if we didn't start a new load, then we finished all the commands, so we're ready to dump state
91     if (WorkQueue::shared()->processWork() && !shouldWaitUntilDone()) {
92         emit done();
93         m_hasDumped = true;
94     }
95 }
96
97 // Called on loadFinished on WebPage
98 void LayoutTestController::maybeDump(bool success)
99 {
100
101     // This can happen on any of the http/tests/security/window-events-*.html tests, where the test opens
102     // a new window, calls the unload and load event handlers on the window's page, and then immediately
103     // issues a notifyDone. Needs investigation.
104     if (!m_topLoadingFrame)
105         return;
106
107     // It is possible that we get called by windows created from the main page that have finished
108     // loading, so we don't ASSERT here. At the moment we do not gather results from such windows,
109     // but may need to in future.
110     if (sender() != m_topLoadingFrame->page())
111         return;
112
113     m_loadFinished = true;
114     // as the function is called on loadFinished, the test might
115     // already have dumped and thus no longer be active, thus
116     // bail out here.
117     if (m_hasDumped)
118         return;
119
120     WorkQueue::shared()->setFrozen(true); // first complete load freezes the queue for the rest of this test
121     if (WorkQueue::shared()->count())
122         QTimer::singleShot(0, this, SLOT(processWork()));
123     else if (!shouldWaitUntilDone()) {
124         if (success)
125             emit done();
126         m_hasDumped = true;
127     }
128 }
129
130 void LayoutTestController::waitUntilDone()
131 {
132     //qDebug() << ">>>>waitForDone";
133     m_waitForDone = true;
134     m_timeoutTimer.start(30000, this);
135 }
136
137 QString LayoutTestController::counterValueForElementById(const QString& id)
138 {
139     return DumpRenderTreeSupportQt::counterValueForElementById(m_drt->webPage()->mainFrame(), id);
140 }
141
142 void LayoutTestController::setViewModeMediaFeature(const QString& mode)
143 {
144     m_drt->webPage()->setProperty("_q_viewMode", mode);
145 }
146
147 int LayoutTestController::webHistoryItemCount()
148 {
149     if (!m_webHistory)
150         return -1;
151
152     // Subtract one here as our QWebHistory::count() includes the actual page,
153     // which is not considered in the DRT tests.
154     return m_webHistory->count() - 1;
155 }
156
157 void LayoutTestController::keepWebHistory()
158 {
159     m_webHistory = m_drt->webPage()->history();
160 }
161
162 void LayoutTestController::notifyDone()
163 {
164     qDebug() << ">>>>notifyDone";
165
166     if (!m_timeoutTimer.isActive())
167         return;
168
169     m_timeoutTimer.stop();
170     m_waitForDone = false;
171
172     // If the page has not finished loading (i.e. loadFinished() has not been emitted) then
173     // content created by the likes of document.write() JS methods will not be available yet.
174     // When the page has finished loading, maybeDump above will dump the results now that we have
175     // just set shouldWaitUntilDone to false.
176     if (!m_loadFinished)
177         return;
178
179     emit done();
180
181     // FIXME: investigate why always resetting these result in timeouts
182     m_hasDumped = true;
183     m_waitForPolicy = false;
184 }
185
186 int LayoutTestController::windowCount()
187 {
188     return m_drt->windowCount();
189 }
190
191 void LayoutTestController::grantDesktopNotificationPermission(const QString& origin)
192 {
193     m_desktopNotificationAllowedOrigins.append(origin);
194 }
195
196 bool LayoutTestController::checkDesktopNotificationPermission(const QString& origin)
197 {
198     return m_desktopNotificationAllowedOrigins.contains(origin);
199 }
200
201 void LayoutTestController::display()
202 {
203     emit showPage();
204 }
205
206 void LayoutTestController::clearBackForwardList()
207 {
208     m_drt->webPage()->history()->clear();
209 }
210
211 QString LayoutTestController::pathToLocalResource(const QString& url)
212 {
213     // Function introduced in r28690.
214     return QDir::toNativeSeparators(url);
215 }
216
217 void LayoutTestController::dumpEditingCallbacks()
218 {
219     qDebug() << ">>>dumpEditingCallbacks";
220     DumpRenderTreeSupportQt::dumpEditingCallbacks(true);
221 }
222
223 void LayoutTestController::dumpFrameLoadCallbacks()
224 {
225     DumpRenderTreeSupportQt::dumpFrameLoader(true);
226 }
227
228 void LayoutTestController::dumpResourceLoadCallbacks()
229 {
230     DumpRenderTreeSupportQt::dumpResourceLoadCallbacks(true);
231 }
232
233 void LayoutTestController::dumpResourceResponseMIMETypes()
234 {
235     DumpRenderTreeSupportQt::dumpResourceResponseMIMETypes(true);
236 }
237
238 void LayoutTestController::setWillSendRequestReturnsNullOnRedirect(bool enabled)
239 {
240     DumpRenderTreeSupportQt::setWillSendRequestReturnsNullOnRedirect(enabled);
241 }
242
243 void LayoutTestController::setWillSendRequestReturnsNull(bool enabled)
244 {
245     DumpRenderTreeSupportQt::setWillSendRequestReturnsNull(enabled);
246 }
247
248 void LayoutTestController::setWillSendRequestClearHeader(const QStringList& headers)
249 {
250     DumpRenderTreeSupportQt::setWillSendRequestClearHeaders(headers);
251 }
252
253 void LayoutTestController::setDeferMainResourceDataLoad(bool defer)
254 {
255     DumpRenderTreeSupportQt::setDeferMainResourceDataLoad(defer);
256 }
257
258 void LayoutTestController::queueBackNavigation(int howFarBackward)
259 {
260     //qDebug() << ">>>queueBackNavigation" << howFarBackward;
261     WorkQueue::shared()->queue(new BackItem(howFarBackward, m_drt->webPage()));
262 }
263
264 void LayoutTestController::queueForwardNavigation(int howFarForward)
265 {
266     //qDebug() << ">>>queueForwardNavigation" << howFarForward;
267     WorkQueue::shared()->queue(new ForwardItem(howFarForward, m_drt->webPage()));
268 }
269
270 void LayoutTestController::queueLoad(const QString& url, const QString& target)
271 {
272     //qDebug() << ">>>queueLoad" << url << target;
273     QUrl mainResourceUrl = m_drt->webPage()->mainFrame()->url();
274     QString absoluteUrl = mainResourceUrl.resolved(QUrl(url)).toEncoded();
275     WorkQueue::shared()->queue(new LoadItem(absoluteUrl, target, m_drt->webPage()));
276 }
277
278 void LayoutTestController::queueLoadHTMLString(const QString& content, const QString& baseURL)
279 {
280     WorkQueue::shared()->queue(new LoadHTMLStringItem(content, baseURL, m_drt->webPage()));
281 }
282
283 void LayoutTestController::queueReload()
284 {
285     //qDebug() << ">>>queueReload";
286     WorkQueue::shared()->queue(new ReloadItem(m_drt->webPage()));
287 }
288
289 void LayoutTestController::queueLoadingScript(const QString& script)
290 {
291     //qDebug() << ">>>queueLoadingScript" << script;
292     WorkQueue::shared()->queue(new LoadingScriptItem(script, m_drt->webPage()));
293 }
294
295 void LayoutTestController::queueNonLoadingScript(const QString& script)
296 {
297     //qDebug() << ">>>queueNonLoadingScript" << script;
298     WorkQueue::shared()->queue(new NonLoadingScriptItem(script, m_drt->webPage()));
299 }
300
301 void LayoutTestController::provisionalLoad()
302 {
303     QWebFrame* frame = qobject_cast<QWebFrame*>(sender());
304     if (!m_topLoadingFrame && !m_hasDumped)
305         m_topLoadingFrame = frame;
306 }
307
308 void LayoutTestController::timerEvent(QTimerEvent *ev)
309 {
310     if (ev->timerId() == m_timeoutTimer.timerId()) {
311         const char* message = "FAIL: Timed out waiting for notifyDone to be called\n";
312         fprintf(stderr, "%s", message);
313         fprintf(stdout, "%s", message);
314         notifyDone();
315     } else
316         QObject::timerEvent(ev);
317 }
318
319 QString LayoutTestController::encodeHostName(const QString& host)
320 {
321     QString encoded = QString::fromLatin1(QUrl::toAce(host + QLatin1String(".no")));
322     encoded.truncate(encoded.length() - 3); // strip .no
323     return encoded;
324 }
325
326 QString LayoutTestController::decodeHostName(const QString& host)
327 {
328     QString decoded = QUrl::fromAce(host.toLatin1() + QByteArray(".no"));
329     decoded.truncate(decoded.length() - 3);
330     return decoded;
331 }
332
333 void LayoutTestController::setMediaType(const QString& type)
334 {
335     DumpRenderTreeSupportQt::setMediaType(m_drt->webPage()->mainFrame(), type);
336 }
337
338 void LayoutTestController::closeWebInspector()
339 {
340     DumpRenderTreeSupportQt::webInspectorClose(m_drt->webPage());
341     m_drt->webPage()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, false);
342 }
343
344 void LayoutTestController::setDeveloperExtrasEnabled(bool enabled)
345 {
346     m_drt->webPage()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, enabled);
347 }
348
349 void LayoutTestController::showWebInspector()
350 {
351     m_drt->webPage()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
352     DumpRenderTreeSupportQt::webInspectorShow(m_drt->webPage());
353 }
354
355 void LayoutTestController::evaluateInWebInspector(long callId, const QString& script)
356 {
357     DumpRenderTreeSupportQt::webInspectorExecuteScript(m_drt->webPage(), callId, script);
358 }
359
360 void LayoutTestController::setFrameFlatteningEnabled(bool enabled)
361 {
362     DumpRenderTreeSupportQt::setFrameFlatteningEnabled(m_drt->webPage(), enabled);
363 }
364
365 void LayoutTestController::setAllowUniversalAccessFromFileURLs(bool enabled)
366 {
367     m_drt->webPage()->settings()->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, enabled);
368 }
369
370 void LayoutTestController::setAllowFileAccessFromFileURLs(bool enabled)
371 {
372     m_drt->webPage()->settings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls, enabled);
373 }
374
375 void LayoutTestController::setAppCacheMaximumSize(unsigned long long quota)
376 {
377     m_drt->webPage()->settings()->setOfflineWebApplicationCacheQuota(quota);
378 }
379
380 void LayoutTestController::setJavaScriptProfilingEnabled(bool enable)
381 {
382     setDeveloperExtrasEnabled(enable);
383     DumpRenderTreeSupportQt::setJavaScriptProfilingEnabled(m_topLoadingFrame, enable);
384 }
385
386 void LayoutTestController::setTimelineProfilingEnabled(bool enable)
387 {
388     DumpRenderTreeSupportQt::setTimelineProfilingEnabled(m_drt->webPage(), enable);
389 }
390
391 void LayoutTestController::setFixedContentsSize(int width, int height)
392 {
393     m_topLoadingFrame->page()->setPreferredContentsSize(QSize(width, height));
394 }
395
396 void LayoutTestController::setPrivateBrowsingEnabled(bool enable)
397 {
398     m_drt->webPage()->settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, enable);
399 }
400
401 void LayoutTestController::setSpatialNavigationEnabled(bool enable)
402 {
403     m_drt->webPage()->settings()->setAttribute(QWebSettings::SpatialNavigationEnabled, enable);
404 }
405
406 void LayoutTestController::setPopupBlockingEnabled(bool enable)
407 {
408     m_drt->webPage()->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, !enable);
409 }
410
411 void LayoutTestController::setPluginsEnabled(bool flag)
412 {
413     // FIXME: Implement
414 }
415
416 void LayoutTestController::setPOSIXLocale(const QString& locale)
417 {
418     QLocale qlocale(locale);
419     QLocale::setDefault(qlocale);
420
421
422 void LayoutTestController::setWindowIsKey(bool isKey)
423 {
424     m_drt->switchFocus(isKey);
425 }
426
427 void LayoutTestController::setMainFrameIsFirstResponder(bool isFirst)
428 {
429     //FIXME: only need this for the moment: https://bugs.webkit.org/show_bug.cgi?id=32990
430 }
431
432 void LayoutTestController::setJavaScriptCanAccessClipboard(bool enable)
433 {
434     m_drt->webPage()->settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, enable);
435 }
436
437 void LayoutTestController::setXSSAuditorEnabled(bool enable)
438 {
439     // Set XSSAuditingEnabled globally so that windows created by the test inherit it too.
440     // resetSettings() will call this to reset the page and global setting to false again.
441     // Needed by http/tests/security/xssAuditor/link-opens-new-window.html
442     QWebSettings* globalSettings = QWebSettings::globalSettings();
443     globalSettings->setAttribute(QWebSettings::XSSAuditingEnabled, enable);
444     m_drt->webPage()->settings()->setAttribute(QWebSettings::XSSAuditingEnabled, enable);
445 }
446
447 bool LayoutTestController::pauseAnimationAtTimeOnElementWithId(const QString& animationName,
448                                                                double time,
449                                                                const QString& elementId)
450 {
451     QWebFrame* frame = m_drt->webPage()->mainFrame();
452     Q_ASSERT(frame);
453     return DumpRenderTreeSupportQt::pauseAnimation(frame, animationName, time, elementId);
454 }
455
456 bool LayoutTestController::pauseTransitionAtTimeOnElementWithId(const QString& propertyName,
457                                                                 double time,
458                                                                 const QString& elementId)
459 {
460     QWebFrame* frame = m_drt->webPage()->mainFrame();
461     Q_ASSERT(frame);
462     return DumpRenderTreeSupportQt::pauseTransitionOfProperty(frame, propertyName, time, elementId);
463 }
464
465 bool LayoutTestController::sampleSVGAnimationForElementAtTime(const QString& animationId,
466                                                               double time,
467                                                               const QString& elementId)
468 {
469     QWebFrame* frame = m_drt->webPage()->mainFrame();
470     Q_ASSERT(frame);
471     return DumpRenderTreeSupportQt::pauseSVGAnimation(frame, animationId, time, elementId);
472 }
473
474 unsigned LayoutTestController::numberOfActiveAnimations() const
475 {
476     QWebFrame* frame = m_drt->webPage()->mainFrame();
477     Q_ASSERT(frame);
478     return DumpRenderTreeSupportQt::numberOfActiveAnimations(frame);
479 }
480
481 void LayoutTestController::disableImageLoading()
482 {
483     m_drt->webPage()->settings()->setAttribute(QWebSettings::AutoLoadImages, false);
484 }
485
486 void LayoutTestController::dispatchPendingLoadRequests()
487 {
488     // FIXME: Implement for testing fix for 6727495
489 }
490
491 void LayoutTestController::setDatabaseQuota(int size)
492 {
493     if (!m_topLoadingFrame)
494         return;
495     m_topLoadingFrame->securityOrigin().setDatabaseQuota(size);
496 }
497
498 void LayoutTestController::clearAllDatabases()
499 {
500     QWebDatabase::removeAllDatabases();
501 }
502
503 void LayoutTestController::addOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains)
504 {
505     DumpRenderTreeSupportQt::whiteListAccessFromOrigin(sourceOrigin, destinationProtocol, destinationHost, allowDestinationSubdomains);
506 }
507
508 void LayoutTestController::removeOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains)
509 {
510     DumpRenderTreeSupportQt::removeWhiteListAccessFromOrigin(sourceOrigin, destinationProtocol, destinationHost, allowDestinationSubdomains);
511 }
512
513 void LayoutTestController::setCustomPolicyDelegate(bool enabled, bool permissive)
514 {
515     DumpRenderTreeSupportQt::setCustomPolicyDelegate(enabled, permissive);
516 }
517
518 void LayoutTestController::waitForPolicyDelegate()
519 {
520     m_waitForPolicy = true;
521     waitUntilDone();
522 }
523
524 void LayoutTestController::overridePreference(const QString& name, const QVariant& value)
525 {
526     QWebSettings* settings = m_topLoadingFrame->page()->settings();
527
528     if (name == "WebKitJavaScriptEnabled")
529         settings->setAttribute(QWebSettings::JavascriptEnabled, value.toBool());
530     else if (name == "WebKitTabToLinksPreferenceKey")
531         settings->setAttribute(QWebSettings::LinksIncludedInFocusChain, value.toBool());
532     else if (name == "WebKitOfflineWebApplicationCacheEnabled")
533         settings->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, value.toBool());
534     else if (name == "WebKitDefaultFontSize")
535         settings->setFontSize(QWebSettings::DefaultFontSize, value.toInt());
536     else if (name == "WebKitUsesPageCachePreferenceKey")
537         QWebSettings::setMaximumPagesInCache(value.toInt());
538     else if (name == "WebKitEnableCaretBrowsing")
539         setCaretBrowsingEnabled(value.toBool());
540     else if (name == "WebKitPluginsEnabled")
541         settings->setAttribute(QWebSettings::PluginsEnabled, value.toBool());
542     else if (name == "WebKitWebGLEnabled")
543         settings->setAttribute(QWebSettings::WebGLEnabled, value.toBool());
544     else
545         printf("ERROR: LayoutTestController::overridePreference() does not support the '%s' preference\n",
546             name.toLatin1().data());
547 }
548
549 void LayoutTestController::setUserStyleSheetLocation(const QString& url)
550 {
551     m_userStyleSheetLocation = QUrl(url);
552
553     if (m_userStyleSheetEnabled)
554         setUserStyleSheetEnabled(true);
555 }
556
557 void LayoutTestController::setCaretBrowsingEnabled(bool value)
558 {
559     DumpRenderTreeSupportQt::setCaretBrowsingEnabled(m_drt->webPage(), value);
560 }
561
562 void LayoutTestController::setUserStyleSheetEnabled(bool enabled)
563 {
564     m_userStyleSheetEnabled = enabled;
565
566     if (enabled)
567         m_drt->webPage()->settings()->setUserStyleSheetUrl(m_userStyleSheetLocation);
568     else
569         m_drt->webPage()->settings()->setUserStyleSheetUrl(QUrl());
570 }
571
572 void LayoutTestController::setDomainRelaxationForbiddenForURLScheme(bool forbidden, const QString& scheme)
573 {
574     DumpRenderTreeSupportQt::setDomainRelaxationForbiddenForURLScheme(forbidden, scheme);
575 }
576
577 int LayoutTestController::workerThreadCount()
578 {
579     return DumpRenderTreeSupportQt::workerThreadCount();
580 }
581
582 int LayoutTestController::pageNumberForElementById(const QString& id, float width, float height)
583 {
584     // If no size specified, webpage viewport size is used
585     if (!width && !height) {
586         width = m_drt->webPage()->viewportSize().width();
587         height = m_drt->webPage()->viewportSize().height();
588     }
589
590     return DumpRenderTreeSupportQt::pageNumberForElementById(m_drt->webPage()->mainFrame(), id, width, height);
591 }
592
593 int LayoutTestController::numberOfPages(float width, float height)
594 {
595     return DumpRenderTreeSupportQt::numberOfPages(m_drt->webPage()->mainFrame(), width, height);
596 }
597
598 bool LayoutTestController::callShouldCloseOnWebView()
599 {
600     return DumpRenderTreeSupportQt::shouldClose(m_drt->webPage()->mainFrame());
601 }
602
603 void LayoutTestController::setScrollbarPolicy(const QString& orientation, const QString& policy)
604 {
605     Qt::Orientation o;
606     Qt::ScrollBarPolicy p;
607
608     if (orientation == "vertical")
609         o = Qt::Vertical;
610     else if (orientation == "horizontal")
611         o = Qt::Horizontal;
612     else
613         return;
614
615     if (policy == "on")
616         p = Qt::ScrollBarAlwaysOn;
617     else if (policy == "auto")
618         p = Qt::ScrollBarAsNeeded;
619     else if (policy == "off")
620         p = Qt::ScrollBarAlwaysOff;
621     else
622         return;
623
624     m_drt->webPage()->mainFrame()->setScrollBarPolicy(o, p);
625 }
626
627 void LayoutTestController::setSmartInsertDeleteEnabled(bool enable)
628 {
629     DumpRenderTreeSupportQt::setSmartInsertDeleteEnabled(m_drt->webPage(), enable);
630 }
631
632 void LayoutTestController::setSelectTrailingWhitespaceEnabled(bool enable)
633 {
634     DumpRenderTreeSupportQt::setSelectTrailingWhitespaceEnabled(m_drt->webPage(), enable);
635 }
636
637 void LayoutTestController::execCommand(const QString& name, const QString& value)
638 {
639     DumpRenderTreeSupportQt::executeCoreCommandByName(m_drt->webPage(), name, value);
640 }
641
642 bool LayoutTestController::isCommandEnabled(const QString& name) const
643 {
644     return DumpRenderTreeSupportQt::isCommandEnabled(m_drt->webPage(), name);
645 }
646
647 QString LayoutTestController::markerTextForListItem(const QWebElement& listItem)
648 {
649     return DumpRenderTreeSupportQt::markerTextForListItem(listItem);
650 }
651
652 QVariantMap LayoutTestController::computedStyleIncludingVisitedInfo(const QWebElement& element) const
653 {
654     return DumpRenderTreeSupportQt::computedStyleIncludingVisitedInfo(element);
655 }
656
657 bool LayoutTestController::elementDoesAutoCompleteForElementWithId(const QString& elementId)
658 {
659     return DumpRenderTreeSupportQt::elementDoesAutoCompleteForElementWithId(m_drt->webPage()->mainFrame(), elementId);
660 }
661
662 void LayoutTestController::authenticateSession(const QString&, const QString&, const QString&)
663 {
664     // FIXME: If there is a concept per-session (per-process) credential storage, the credentials should be added to it for later use.
665 }
666
667 void LayoutTestController::setIconDatabaseEnabled(bool enable)
668 {
669     if (enable && !m_drt->persistentStoragePath().isEmpty())
670         QWebSettings::setIconDatabasePath(m_drt->persistentStoragePath());
671     else
672         QWebSettings::setIconDatabasePath(QString());
673 }
674
675 void LayoutTestController::setEditingBehavior(const QString& editingBehavior)
676 {
677     DumpRenderTreeSupportQt::setEditingBehavior(m_drt->webPage(), editingBehavior);
678 }
679
680 void LayoutTestController::setGeolocationPermission(bool allow)
681 {
682      m_isGeolocationPermissionSet = true;
683      m_geolocationPermission = allow;
684 }
685
686 void LayoutTestController::setMockGeolocationError(int code, const QString& message)
687 {
688     DumpRenderTreeSupportQt::setMockGeolocationError(code, message);
689 }
690
691 void LayoutTestController::setMockGeolocationPosition(double latitude, double longitude, double accuracy)
692 {
693     DumpRenderTreeSupportQt::setMockGeolocationPosition(latitude, longitude, accuracy);
694 }
695
696 void LayoutTestController::evaluateScriptInIsolatedWorld(int worldID, const QString& script)
697 {
698     DumpRenderTreeSupportQt::evaluateScriptInIsolatedWorld(m_drt->webPage()->mainFrame(), worldID, script);
699 }
700
701 bool LayoutTestController::isPageBoxVisible(int pageIndex)
702 {
703     return DumpRenderTreeSupportQt::isPageBoxVisible(m_drt->webPage()->mainFrame(), pageIndex);
704 }
705
706 QString LayoutTestController::pageSizeAndMarginsInPixels(int pageIndex, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft)
707 {
708     return DumpRenderTreeSupportQt::pageSizeAndMarginsInPixels(m_drt->webPage()->mainFrame(), pageIndex,
709                                                                width, height, marginTop, marginRight, marginBottom, marginLeft);
710 }
711
712 QString LayoutTestController::pageProperty(const QString& propertyName, int pageNumber)
713 {
714     return DumpRenderTreeSupportQt::pageProperty(m_drt->webPage()->mainFrame(), propertyName, pageNumber);
715 }
716
717 void LayoutTestController::addUserStyleSheet(const QString& sourceCode)
718 {
719     DumpRenderTreeSupportQt::addUserStyleSheet(m_drt->webPage(), sourceCode);
720 }
721
722 const unsigned LayoutTestController::maxViewWidth = 800;
723 const unsigned LayoutTestController::maxViewHeight = 600;