blob: 0ed0c62e1b041c0a0a448264fcfea8e6f3181b35 [file] [log] [blame]
/*
* Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
* Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "TestRunnerQt.h"
#include "DumpRenderTreeQt.h"
#include "DumpRenderTreeSupportQt.h"
#include "NotificationPresenterClientQt.h"
#include "WorkQueue.h"
#include "WorkQueueItemQt.h"
#include <QCoreApplication>
#include <QDir>
#include <QLocale>
#include <qwebsettings.h>
TestRunner::TestRunner(WebCore::DumpRenderTree* drt)
: QObject()
, m_drt(drt)
, m_shouldTimeout(true)
, m_timeout(30000)
{
reset();
}
void TestRunner::reset()
{
m_hasDumped = false;
m_loadFinished = false;
m_textDump = false;
m_audioDump = false;
m_shouldDumpPixels = true;
m_dumpBackForwardList = false;
m_dumpChildrenAsText = false;
m_dumpChildFrameScrollPositions = false;
m_canOpenWindows = false;
m_waitForDone = false;
m_disallowIncreaseForApplicationCacheQuota = false;
m_dumpTitleChanges = false;
m_dumpDatabaseCallbacks = false;
m_dumpApplicationCacheDelegateCallbacks = false;
m_dumpStatusCallbacks = false;
m_timeoutTimer.stop();
m_topLoadingFrame = 0;
m_waitForPolicy = false;
m_handleErrorPages = false;
m_webHistory = 0;
m_globalFlag = false;
m_userStyleSheetEnabled = false;
m_ignoreDesktopNotification = false;
m_isGeolocationPermissionSet = false;
m_isPrinting = false;
m_geolocationPermission = false;
m_audioData.clear();
DumpRenderTreeSupportQt::dumpEditingCallbacks(false);
DumpRenderTreeSupportQt::dumpFrameLoader(false);
DumpRenderTreeSupportQt::dumpProgressFinishedCallback(false);
DumpRenderTreeSupportQt::dumpUserGestureInFrameLoader(false);
DumpRenderTreeSupportQt::dumpResourceLoadCallbacks(false);
DumpRenderTreeSupportQt::dumpResourceResponseMIMETypes(false);
DumpRenderTreeSupportQt::dumpWillCacheResponseCallbacks(false);
DumpRenderTreeSupportQt::setDeferMainResourceDataLoad(true);
DumpRenderTreeSupportQt::setWillSendRequestReturnsNullOnRedirect(false);
DumpRenderTreeSupportQt::setWillSendRequestReturnsNull(false);
DumpRenderTreeSupportQt::setWillSendRequestClearHeaders(QStringList());
DumpRenderTreeSupportQt::clearScriptWorlds();
DumpRenderTreeSupportQt::setCustomPolicyDelegate(false, false);
DumpRenderTreeSupportQt::dumpHistoryCallbacks(false);
DumpRenderTreeSupportQt::dumpVisitedLinksCallbacks(false);
DumpRenderTreeSupportQt::resetGeolocationMock(m_drt->pageAdapter());
DumpRenderTreeSupportQt::dumpNotification(false);
setIconDatabaseEnabled(false);
clearAllDatabases();
removeAllWebNotificationPermissions();
// The default state for DRT is to block third-party cookies, mimicing the Mac port
setAlwaysAcceptCookies(false);
emit hidePage();
}
void TestRunner::dumpNotifications()
{
DumpRenderTreeSupportQt::dumpNotification(true);
}
void TestRunner::processWork()
{
// qDebug() << ">>>processWork";
// if we didn't start a new load, then we finished all the commands, so we're ready to dump state
if (WorkQueue::shared()->processWork() && !shouldWaitUntilDone()) {
emit done();
m_hasDumped = true;
}
}
// Called on loadFinished on WebPage
void TestRunner::maybeDump(bool /*success*/)
{
// This can happen on any of the http/tests/security/window-events-*.html tests, where the test opens
// a new window, calls the unload and load event handlers on the window's page, and then immediately
// issues a notifyDone. Needs investigation.
if (!m_topLoadingFrame)
return;
// It is possible that we get called by windows created from the main page that have finished
// loading, so we don't ASSERT here. At the moment we do not gather results from such windows,
// but may need to in future.
if (sender() != m_topLoadingFrame->page())
return;
m_loadFinished = true;
// as the function is called on loadFinished, the test might
// already have dumped and thus no longer be active, thus
// bail out here.
if (m_hasDumped)
return;
WorkQueue::shared()->setFrozen(true); // first complete load freezes the queue for the rest of this test
if (WorkQueue::shared()->count())
QTimer::singleShot(0, this, SLOT(processWork()));
else if (!shouldWaitUntilDone()) {
emit done();
m_hasDumped = true;
}
}
void TestRunner::dumpAsText(bool shouldDumpPixels)
{
m_textDump = true;
m_shouldDumpPixels = shouldDumpPixels;
}
void TestRunner::waitUntilDone()
{
//qDebug() << ">>>>waitForDone";
m_waitForDone = true;
if (!m_shouldTimeout)
return;
m_timeoutTimer.start(m_timeout, this);
}
void TestRunner::setViewModeMediaFeature(const QString& mode)
{
m_drt->webPage()->setProperty("_q_viewMode", mode);
}
int TestRunner::webHistoryItemCount()
{
if (!m_webHistory)
return -1;
// Subtract one here as our QWebHistory::count() includes the actual page,
// which is not considered in the DRT tests.
return m_webHistory->count() - 1;
}
void TestRunner::keepWebHistory()
{
m_webHistory = m_drt->webPage()->history();
}
void TestRunner::notifyDone()
{
qDebug() << ">>>>notifyDone";
if (m_shouldTimeout && !m_timeoutTimer.isActive())
return;
m_timeoutTimer.stop();
m_waitForDone = false;
// If the page has not finished loading (i.e. loadFinished() has not been emitted) then
// content created by the likes of document.write() JS methods will not be available yet.
// When the page has finished loading, maybeDump above will dump the results now that we have
// just set shouldWaitUntilDone to false.
if (!m_loadFinished)
return;
emit done();
// FIXME: investigate why always resetting these result in timeouts
m_hasDumped = true;
m_waitForPolicy = false;
}
int TestRunner::windowCount()
{
return m_drt->windowCount();
}
void TestRunner::grantWebNotificationPermission(const QString& origin)
{
QWebFrame* frame = m_drt->webPage()->mainFrame();
m_drt->webPage()->setFeaturePermission(frame, QWebPage::Notifications, QWebPage::PermissionGrantedByUser);
}
void TestRunner::ignoreLegacyWebNotificationPermissionRequests()
{
m_ignoreDesktopNotification = true;
}
void TestRunner::denyWebNotificationPermission(const QString& origin)
{
QWebFrame* frame = m_drt->webPage()->mainFrame();
m_drt->webPage()->setFeaturePermission(frame, QWebPage::Notifications, QWebPage::PermissionDeniedByUser);
}
void TestRunner::removeAllWebNotificationPermissions()
{
DumpRenderTreeSupportQt::clearNotificationPermissions();
}
void TestRunner::simulateWebNotificationClick(const QWebElement& notification)
{
// FIXME: implement.
}
void TestRunner::simulateLegacyWebNotificationClick(const QString& title)
{
DumpRenderTreeSupportQt::simulateDesktopNotificationClick(title);
}
void TestRunner::display()
{
DumpRenderTreeSupportQt::setTrackRepaintRects(m_topLoadingFrame->handle(), true);
emit showPage();
}
void TestRunner::displayInvalidatedRegion()
{
display();
}
void TestRunner::clearBackForwardList()
{
m_drt->webPage()->history()->clear();
}
QString TestRunner::pathToLocalResource(const QString& url)
{
QString localTmpUrl(QLatin1String("file:///tmp/LayoutTests"));
// Translate a request for /tmp/LayoutTests to the repository LayoutTests directory.
// Do not rely on a symlink to be created via the test runner, which will not work on Windows.
if (url.startsWith(localTmpUrl)) {
// DumpRenderTree lives in WebKit/WebKitBuild/<build_mode>/bin.
// Translate from WebKit/WebKitBuild/Release/bin => WebKit/LayoutTests.
QFileInfo layoutTestsRoot(QCoreApplication::applicationDirPath() + QLatin1String("/../../../LayoutTests/"));
if (layoutTestsRoot.exists())
return QLatin1String("file://") + layoutTestsRoot.absolutePath() + url.mid(localTmpUrl.length());
}
return url;
}
void TestRunner::dumpEditingCallbacks()
{
qDebug() << ">>>dumpEditingCallbacks";
DumpRenderTreeSupportQt::dumpEditingCallbacks(true);
}
void TestRunner::dumpFrameLoadCallbacks()
{
DumpRenderTreeSupportQt::dumpFrameLoader(true);
}
void TestRunner::dumpProgressFinishedCallback()
{
DumpRenderTreeSupportQt::dumpProgressFinishedCallback(true);
}
void TestRunner::dumpUserGestureInFrameLoadCallbacks()
{
DumpRenderTreeSupportQt::dumpUserGestureInFrameLoader(true);
}
void TestRunner::dumpResourceLoadCallbacks()
{
DumpRenderTreeSupportQt::dumpResourceLoadCallbacks(true);
}
void TestRunner::dumpResourceResponseMIMETypes()
{
DumpRenderTreeSupportQt::dumpResourceResponseMIMETypes(true);
}
void TestRunner::dumpWillCacheResponse()
{
DumpRenderTreeSupportQt::dumpWillCacheResponseCallbacks(true);
}
void TestRunner::dumpHistoryCallbacks()
{
DumpRenderTreeSupportQt::dumpHistoryCallbacks(true);
}
void TestRunner::setWillSendRequestReturnsNullOnRedirect(bool enabled)
{
DumpRenderTreeSupportQt::setWillSendRequestReturnsNullOnRedirect(enabled);
}
void TestRunner::setWillSendRequestReturnsNull(bool enabled)
{
DumpRenderTreeSupportQt::setWillSendRequestReturnsNull(enabled);
}
void TestRunner::setWillSendRequestClearHeader(const QStringList& headers)
{
DumpRenderTreeSupportQt::setWillSendRequestClearHeaders(headers);
}
void TestRunner::setDeferMainResourceDataLoad(bool defer)
{
DumpRenderTreeSupportQt::setDeferMainResourceDataLoad(defer);
}
void TestRunner::queueBackNavigation(int howFarBackward)
{
//qDebug() << ">>>queueBackNavigation" << howFarBackward;
for (int i = 0; i != howFarBackward; ++i)
WorkQueue::shared()->queue(new BackItem(1, m_drt->webPage()));
}
void TestRunner::queueForwardNavigation(int howFarForward)
{
//qDebug() << ">>>queueForwardNavigation" << howFarForward;
for (int i = 0; i != howFarForward; ++i)
WorkQueue::shared()->queue(new ForwardItem(1, m_drt->webPage()));
}
void TestRunner::queueLoad(const QString& url, const QString& target)
{
//qDebug() << ">>>queueLoad" << url << target;
QUrl mainResourceUrl = m_drt->webPage()->mainFrame()->url();
QString absoluteUrl = mainResourceUrl.resolved(QUrl(url)).toEncoded();
WorkQueue::shared()->queue(new LoadItem(absoluteUrl, target, m_drt->webPage()));
}
void TestRunner::queueLoadHTMLString(const QString& content, const QString& baseURL, const QString& failingURL)
{
if (failingURL.isEmpty())
WorkQueue::shared()->queue(new LoadHTMLStringItem(content, baseURL, m_drt->webPage()));
else
WorkQueue::shared()->queue(new LoadAlternateHTMLStringItem(content, baseURL, failingURL, m_drt->webPage()));
}
void TestRunner::queueReload()
{
//qDebug() << ">>>queueReload";
WorkQueue::shared()->queue(new ReloadItem(m_drt->webPage()));
}
void TestRunner::queueLoadingScript(const QString& script)
{
//qDebug() << ">>>queueLoadingScript" << script;
WorkQueue::shared()->queue(new LoadingScriptItem(script, m_drt->webPage()));
}
void TestRunner::queueNonLoadingScript(const QString& script)
{
//qDebug() << ">>>queueNonLoadingScript" << script;
WorkQueue::shared()->queue(new NonLoadingScriptItem(script, m_drt->webPage()));
}
void TestRunner::provisionalLoad()
{
QWebFrame* frame = qobject_cast<QWebFrame*>(sender());
if (!m_topLoadingFrame && !m_hasDumped)
m_topLoadingFrame = frame;
}
void TestRunner::timerEvent(QTimerEvent *ev)
{
if (ev->timerId() == m_timeoutTimer.timerId()) {
const char* message = "FAIL: Timed out waiting for notifyDone to be called\n";
fprintf(stderr, "%s", message);
fprintf(stdout, "%s", message);
notifyDone();
} else
QObject::timerEvent(ev);
}
QString TestRunner::encodeHostName(const QString& host)
{
QString encoded = QString::fromLatin1(QUrl::toAce(host + QLatin1String(".no")));
encoded.truncate(encoded.length() - 3); // strip .no
return encoded;
}
QString TestRunner::decodeHostName(const QString& host)
{
QString decoded = QUrl::fromAce(host.toLatin1() + QByteArray(".no"));
decoded.truncate(decoded.length() - 3);
return decoded;
}
void TestRunner::closeWebInspector()
{
DumpRenderTreeSupportQt::webInspectorClose(m_drt->pageAdapter());
m_drt->webPage()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, false);
}
void TestRunner::setDeveloperExtrasEnabled(bool enabled)
{
m_drt->webPage()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, enabled);
}
void TestRunner::setAsynchronousSpellCheckingEnabled(bool)
{
// FIXME: Implement this.
}
void TestRunner::showWebInspector()
{
m_drt->webPage()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
DumpRenderTreeSupportQt::webInspectorShow(m_drt->pageAdapter());
}
void TestRunner::evaluateInWebInspector(long callId, const QString& script)
{
DumpRenderTreeSupportQt::webInspectorExecuteScript(m_drt->pageAdapter(), callId, script);
}
void TestRunner::setFrameFlatteningEnabled(bool enabled)
{
DumpRenderTreeSupportQt::setFrameFlatteningEnabled(m_drt->pageAdapter(), enabled);
}
void TestRunner::goBack()
{
DumpRenderTreeSupportQt::goBack(m_drt->pageAdapter());
}
void TestRunner::setDefersLoading(bool flag)
{
DumpRenderTreeSupportQt::setDefersLoading(m_drt->pageAdapter(), flag);
}
void TestRunner::setAllowUniversalAccessFromFileURLs(bool enabled)
{
m_drt->webPage()->settings()->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, enabled);
}
void TestRunner::setAllowFileAccessFromFileURLs(bool enabled)
{
m_drt->webPage()->settings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls, enabled);
}
void TestRunner::setAppCacheMaximumSize(unsigned long long quota)
{
m_drt->webPage()->settings()->setOfflineWebApplicationCacheQuota(quota);
}
void TestRunner::setAutofilled(const QWebElement& element, bool isAutofilled)
{
return DumpRenderTreeSupportQt::setAutofilled(element, isAutofilled);
}
void TestRunner::setValueForUser(const QWebElement& element, const QString& value)
{
DumpRenderTreeSupportQt::setValueForUser(element, value);
}
void TestRunner::setFixedContentsSize(int width, int height)
{
m_topLoadingFrame->page()->setPreferredContentsSize(QSize(width, height));
}
void TestRunner::setPrivateBrowsingEnabled(bool enable)
{
m_drt->webPage()->settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, enable);
}
void TestRunner::setSpatialNavigationEnabled(bool enable)
{
m_drt->webPage()->settings()->setAttribute(QWebSettings::SpatialNavigationEnabled, enable);
}
void TestRunner::setPopupBlockingEnabled(bool enable)
{
m_drt->webPage()->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, !enable);
}
void TestRunner::setPluginsEnabled(bool flag)
{
// FIXME: Implement
}
void TestRunner::setPOSIXLocale(const QString& locale)
{
QLocale qlocale(locale);
QLocale::setDefault(qlocale);
}
void TestRunner::setWindowIsKey(bool isKey)
{
m_drt->switchFocus(isKey);
}
void TestRunner::setMainFrameIsFirstResponder(bool isFirst)
{
//FIXME: only need this for the moment: https://bugs.webkit.org/show_bug.cgi?id=32990
}
void TestRunner::setJavaScriptCanAccessClipboard(bool enable)
{
m_drt->webPage()->settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, enable);
}
void TestRunner::setXSSAuditorEnabled(bool enable)
{
// Set XSSAuditingEnabled globally so that windows created by the test inherit it too.
// resetSettings() will call this to reset the page and global setting to false again.
// Needed by http/tests/security/xssAuditor/link-opens-new-window.html
QWebSettings* globalSettings = QWebSettings::globalSettings();
globalSettings->setAttribute(QWebSettings::XSSAuditingEnabled, enable);
m_drt->webPage()->settings()->setAttribute(QWebSettings::XSSAuditingEnabled, enable);
}
void TestRunner::dispatchPendingLoadRequests()
{
// FIXME: Implement for testing fix for 6727495
}
void TestRunner::clearAllApplicationCaches()
{
DumpRenderTreeSupportQt::clearAllApplicationCaches();
}
void TestRunner::clearApplicationCacheForOrigin(const QString& url)
{
// FIXME: Implement to support deleting all application caches for an origin.
}
long long TestRunner::localStorageDiskUsageForOrigin(const QString& originIdentifier)
{
// FIXME: Implement to support getting disk usage in bytes for an origin.
return 0;
}
void TestRunner::setApplicationCacheOriginQuota(unsigned long long quota)
{
if (!m_topLoadingFrame)
return;
m_topLoadingFrame->securityOrigin().setApplicationCacheQuota(quota);
}
long long TestRunner::applicationCacheDiskUsageForOrigin(const QString& origin)
{
// FIXME: Implement to support getting disk usage by all application caches for an origin.
return 0;
}
QStringList TestRunner::originsWithApplicationCache()
{
// FIXME: Implement to get origins that have application caches.
return QStringList();
}
void TestRunner::setCacheModel(int model)
{
// qwebsetting doesn't have matched setting yet :
// WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER
// WEBKIT_CACHE_MODEL_DOCUMENT_BROWSER
// WEBKIT_CACHE_MODEL_WEB_BROWSER
// FIXME: Implement.
}
void TestRunner::setDatabaseQuota(int size)
{
if (!m_topLoadingFrame)
return;
m_topLoadingFrame->securityOrigin().setDatabaseQuota(size);
}
void TestRunner::clearAllDatabases()
{
QWebDatabase::removeAllDatabases();
}
void TestRunner::addOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains)
{
DumpRenderTreeSupportQt::whiteListAccessFromOrigin(sourceOrigin, destinationProtocol, destinationHost, allowDestinationSubdomains);
}
void TestRunner::removeOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains)
{
DumpRenderTreeSupportQt::removeWhiteListAccessFromOrigin(sourceOrigin, destinationProtocol, destinationHost, allowDestinationSubdomains);
}
void TestRunner::setCustomPolicyDelegate(bool enabled, bool permissive)
{
DumpRenderTreeSupportQt::setCustomPolicyDelegate(enabled, permissive);
}
void TestRunner::waitForPolicyDelegate()
{
setCustomPolicyDelegate(true);
m_waitForPolicy = true;
waitUntilDone();
}
void TestRunner::overridePreference(const QString& name, const QVariant& value)
{
QWebSettings* settings = m_topLoadingFrame->page()->settings();
if (name == "WebKitJavaScriptEnabled")
settings->setAttribute(QWebSettings::JavascriptEnabled, value.toBool());
else if (name == "WebKitTabToLinksPreferenceKey")
settings->setAttribute(QWebSettings::LinksIncludedInFocusChain, value.toBool());
else if (name == "WebKitOfflineWebApplicationCacheEnabled")
settings->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, value.toBool());
else if (name == "WebKitDefaultFontSize")
settings->setFontSize(QWebSettings::DefaultFontSize, value.toInt());
else if (name == "WebKitUsesPageCachePreferenceKey")
QWebSettings::setMaximumPagesInCache(value.toInt());
else if (name == "WebKitEnableCaretBrowsing")
setCaretBrowsingEnabled(value.toBool());
else if (name == "WebKitPluginsEnabled")
settings->setAttribute(QWebSettings::PluginsEnabled, value.toBool());
else if (name == "WebKitWebGLEnabled")
settings->setAttribute(QWebSettings::WebGLEnabled, value.toBool());
else if (name == "WebKitCSSRegionsEnabled")
settings->setAttribute(QWebSettings::CSSRegionsEnabled, value.toBool());
else if (name == "WebKitCSSGridLayoutEnabled")
settings->setAttribute(QWebSettings::CSSGridLayoutEnabled, value.toBool());
else if (name == "WebKitHyperlinkAuditingEnabled")
settings->setAttribute(QWebSettings::HyperlinkAuditingEnabled, value.toBool());
else if (name == "WebKitAcceleratedCompositingEnabled")
settings->setAttribute(QWebSettings::AcceleratedCompositingEnabled, value.toBool());
else if (name == "WebKitDisplayImagesKey")
settings->setAttribute(QWebSettings::AutoLoadImages, value.toBool());
else if (name == "WebKitWebAudioEnabled")
settings->setAttribute(QWebSettings::WebAudioEnabled, value.toBool());
else
printf("ERROR: TestRunner::overridePreference() does not support the '%s' preference\n",
name.toLatin1().data());
}
void TestRunner::setUserStyleSheetLocation(const QString& url)
{
QByteArray urlData = pathToLocalResource(url).toLatin1();
m_userStyleSheetLocation = QUrl::fromEncoded(urlData, QUrl::StrictMode);
if (m_userStyleSheetEnabled)
setUserStyleSheetEnabled(true);
}
void TestRunner::setCaretBrowsingEnabled(bool value)
{
DumpRenderTreeSupportQt::setCaretBrowsingEnabled(m_drt->pageAdapter(), value);
}
void TestRunner::setAuthorAndUserStylesEnabled(bool value)
{
DumpRenderTreeSupportQt::setAuthorAndUserStylesEnabled(m_drt->pageAdapter(), value);
}
void TestRunner::setUserStyleSheetEnabled(bool enabled)
{
m_userStyleSheetEnabled = enabled;
if (enabled)
m_drt->webPage()->settings()->setUserStyleSheetUrl(m_userStyleSheetLocation);
else
m_drt->webPage()->settings()->setUserStyleSheetUrl(QUrl());
}
void TestRunner::setDomainRelaxationForbiddenForURLScheme(bool forbidden, const QString& scheme)
{
DumpRenderTreeSupportQt::setDomainRelaxationForbiddenForURLScheme(forbidden, scheme);
}
int TestRunner::workerThreadCount()
{
return DumpRenderTreeSupportQt::workerThreadCount();
}
bool TestRunner::callShouldCloseOnWebView()
{
return DumpRenderTreeSupportQt::shouldClose(m_drt->mainFrameAdapter());
}
void TestRunner::setScrollbarPolicy(const QString& orientation, const QString& policy)
{
Qt::Orientation o;
Qt::ScrollBarPolicy p;
if (orientation == "vertical")
o = Qt::Vertical;
else if (orientation == "horizontal")
o = Qt::Horizontal;
else
return;
if (policy == "on")
p = Qt::ScrollBarAlwaysOn;
else if (policy == "auto")
p = Qt::ScrollBarAsNeeded;
else if (policy == "off")
p = Qt::ScrollBarAlwaysOff;
else
return;
m_drt->webPage()->mainFrame()->setScrollBarPolicy(o, p);
}
void TestRunner::setSmartInsertDeleteEnabled(bool enable)
{
DumpRenderTreeSupportQt::setSmartInsertDeleteEnabled(m_drt->pageAdapter(), enable);
}
void TestRunner::setSelectTrailingWhitespaceEnabled(bool enable)
{
DumpRenderTreeSupportQt::setSelectTrailingWhitespaceEnabled(m_drt->pageAdapter(), enable);
}
void TestRunner::execCommand(const QString& name, const QString& value)
{
DumpRenderTreeSupportQt::executeCoreCommandByName(m_drt->pageAdapter(), name, value);
}
bool TestRunner::isCommandEnabled(const QString& name) const
{
return DumpRenderTreeSupportQt::isCommandEnabled(m_drt->pageAdapter(), name);
}
bool TestRunner::findString(const QString& string, const QStringList& optionArray)
{
return DumpRenderTreeSupportQt::findString(m_drt->pageAdapter(), string, optionArray);
}
QString TestRunner::markerTextForListItem(const QWebElement& listItem)
{
return DumpRenderTreeSupportQt::markerTextForListItem(listItem);
}
QVariantMap TestRunner::computedStyleIncludingVisitedInfo(const QWebElement& element) const
{
return DumpRenderTreeSupportQt::computedStyleIncludingVisitedInfo(element);
}
bool TestRunner::elementDoesAutoCompleteForElementWithId(const QString& elementId)
{
return DumpRenderTreeSupportQt::elementDoesAutoCompleteForElementWithId(m_drt->mainFrameAdapter(), elementId);
}
void TestRunner::authenticateSession(const QString&, const QString&, const QString&)
{
// FIXME: If there is a concept per-session (per-process) credential storage, the credentials should be added to it for later use.
}
void TestRunner::setIconDatabaseEnabled(bool enable)
{
if (enable && !m_drt->persistentStoragePath().isEmpty())
QWebSettings::setIconDatabasePath(m_drt->persistentStoragePath());
else
QWebSettings::setIconDatabasePath(QString());
}
void TestRunner::setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma)
{
QList<WebCore::WebPage*> pages = m_drt->getAllPages();
foreach (WebCore::WebPage* page, pages)
DumpRenderTreeSupportQt::setMockDeviceOrientation(page->handle(), canProvideAlpha, alpha, canProvideBeta, beta, canProvideGamma, gamma);
}
void TestRunner::setGeolocationPermission(bool allow)
{
setGeolocationPermissionCommon(allow);
QList<WebCore::WebPage*> pages = m_drt->getAllPages();
foreach (WebCore::WebPage* page, pages)
DumpRenderTreeSupportQt::setMockGeolocationPermission(page->handle(), allow);
}
int TestRunner::numberOfPendingGeolocationPermissionRequests()
{
int pendingPermissionCount = 0;
QList<WebCore::WebPage*> pages = m_drt->getAllPages();
foreach (WebCore::WebPage* page, pages)
pendingPermissionCount += DumpRenderTreeSupportQt::numberOfPendingGeolocationPermissionRequests(page->handle());
return pendingPermissionCount;
}
void TestRunner::setGeolocationPermissionCommon(bool allow)
{
m_isGeolocationPermissionSet = true;
m_geolocationPermission = allow;
}
void TestRunner::setMockGeolocationPositionUnavailableError(const QString& message)
{
QList<WebCore::WebPage*> pages = m_drt->getAllPages();
foreach (WebCore::WebPage* page, pages)
DumpRenderTreeSupportQt::setMockGeolocationPositionUnavailableError(page->handle(), message);
}
void TestRunner::setMockGeolocationPosition(double latitude, double longitude, double accuracy)
{
QList<WebCore::WebPage*> pages = m_drt->getAllPages();
foreach (WebCore::WebPage* page, pages)
DumpRenderTreeSupportQt::setMockGeolocationPosition(page->handle(), latitude, longitude, accuracy);
}
void TestRunner::addMockSpeechInputResult(const QString& result, double confidence, const QString& language)
{
// FIXME: Implement for speech input layout tests.
// See https://bugs.webkit.org/show_bug.cgi?id=39485.
}
void TestRunner::setMockSpeechInputDumpRect(bool flag)
{
// FIXME: Implement for speech input layout tests.
// See https://bugs.webkit.org/show_bug.cgi?id=39485.
}
void TestRunner::startSpeechInput(const QString& inputElement)
{
// FIXME: Implement for speech input layout tests.
// See https://bugs.webkit.org/show_bug.cgi?id=39485.
}
void TestRunner::evaluateScriptInIsolatedWorldAndReturnValue(int worldID, const QString& script)
{
// FIXME: Implement.
}
void TestRunner::evaluateScriptInIsolatedWorld(int worldID, const QString& script)
{
DumpRenderTreeSupportQt::evaluateScriptInIsolatedWorld(m_drt->mainFrameAdapter(), worldID, script);
}
void TestRunner::addUserStyleSheet(const QString& sourceCode)
{
DumpRenderTreeSupportQt::addUserStyleSheet(m_drt->pageAdapter(), sourceCode);
}
void TestRunner::removeAllVisitedLinks()
{
QWebHistory* history = m_drt->webPage()->history();
history->clear();
DumpRenderTreeSupportQt::dumpVisitedLinksCallbacks(true);
}
void TestRunner::addURLToRedirect(const QString& origin, const QString& destination)
{
DumpRenderTreeSupportQt::addURLToRedirect(origin, destination);
}
void TestRunner::setMinimumTimerInterval(double minimumTimerInterval)
{
DumpRenderTreeSupportQt::setMinimumTimerInterval(m_drt->pageAdapter(), minimumTimerInterval);
}
void TestRunner::originsWithLocalStorage()
{
// FIXME: Implement.
}
void TestRunner::deleteAllLocalStorage()
{
// FIXME: Implement.
}
void TestRunner::deleteLocalStorageForOrigin(const QString& originIdentifier)
{
// FIXME: Implement.
}
void TestRunner::observeStorageTrackerNotifications(unsigned number)
{
// FIXME: Implement.
}
void TestRunner::syncLocalStorage()
{
// FIXME: Implement.
}
void TestRunner::resetPageVisibility()
{
// FIXME: Implement this.
}
void TestRunner::setPageVisibility(const char*)
{
// FIXME: Implement this.
}
void TestRunner::setAutomaticLinkDetectionEnabled(bool)
{
// FIXME: Implement this.
}
void TestRunner::setTextDirection(const QString& directionName)
{
if (directionName == "auto")
m_drt->webPage()->triggerAction(QWebPage::SetTextDirectionDefault);
else if (directionName == "rtl")
m_drt->webPage()->triggerAction(QWebPage::SetTextDirectionRightToLeft);
else if (directionName == "ltr")
m_drt->webPage()->triggerAction(QWebPage::SetTextDirectionLeftToRight);
}
void TestRunner::setAlwaysAcceptCookies(bool accept)
{
QWebSettings* globalSettings = QWebSettings::globalSettings();
if (accept)
globalSettings->setThirdPartyCookiePolicy(QWebSettings::AlwaysAllowThirdPartyCookies);
else {
// This matches the Safari third-party cookie blocking policy tested in third-party-cookie-relaxing.html
globalSettings->setThirdPartyCookiePolicy(QWebSettings::AllowThirdPartyWithExistingCookies);
}
}
void TestRunner::setAlwaysBlockCookies(bool block)
{
QWebSettings* globalSettings = QWebSettings::globalSettings();
if (block)
globalSettings->setThirdPartyCookiePolicy(QWebSettings::AlwaysBlockThirdPartyCookies);
else
globalSettings->setThirdPartyCookiePolicy(QWebSettings::AlwaysAllowThirdPartyCookies);
}
void TestRunner::setAudioData(const QByteArray& audioData)
{
m_audioData = audioData;
m_audioDump = true;
}
const unsigned TestRunner::maxViewWidth = 800;
const unsigned TestRunner::maxViewHeight = 600;