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