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