diff options
Diffstat (limited to 'WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp')
-rw-r--r-- | WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp new file mode 100644 index 0000000..b8de6a5 --- /dev/null +++ b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp @@ -0,0 +1,316 @@ +/* + * 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 "LayoutTestControllerQt.h" + +#include "DumpRenderTree.h" +#include "WorkQueue.h" +#include "WorkQueueItem.h" + +extern void qt_dump_editing_callbacks(bool b); +extern void qt_dump_resource_load_callbacks(bool b); +extern void qt_drt_setJavaScriptProfilingEnabled(QWebFrame*, bool enabled); +extern bool qt_drt_pauseAnimation(QWebFrame*, const QString& name, double time, const QString& elementId); +extern bool qt_drt_pauseTransitionOfProperty(QWebFrame*, const QString& name, double time, const QString& elementId); +extern int qt_drt_numberOfActiveAnimations(QWebFrame*); +extern void qt_drt_whiteListAccessFromOrigin(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains); +extern QString qt_drt_counterValueForElementById(QWebFrame* qFrame, const QString& id); + +LayoutTestController::LayoutTestController(WebCore::DumpRenderTree* drt) + : QObject() + , m_drt(drt) +{ + reset(); +} + +void LayoutTestController::reset() +{ + m_isLoading = true; + m_textDump = false; + m_dumpBackForwardList = false; + m_dumpChildrenAsText = false; + m_canOpenWindows = false; + m_waitForDone = false; + m_dumpTitleChanges = false; + m_dumpDatabaseCallbacks = false; + m_dumpStatusCallbacks = false; + m_timeoutTimer.stop(); + m_topLoadingFrame = 0; + m_waitForPolicy = false; + qt_dump_editing_callbacks(false); + qt_dump_resource_load_callbacks(false); +} + +void LayoutTestController::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_isLoading = false; + } +} + +// Called on loadFinished on mainFrame. +void LayoutTestController::maybeDump(bool success) +{ + Q_ASSERT(sender() == m_topLoadingFrame); + + // 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_isLoading) + return; + + m_topLoadingFrame = 0; + WorkQueue::shared()->setFrozen(true); // first complete load freezes the queue for the rest of this test + + if (!shouldWaitUntilDone()) { + if (WorkQueue::shared()->count()) + QTimer::singleShot(0, this, SLOT(processWork())); + else { + if (success) + emit done(); + m_isLoading = false; + } + } +} + +void LayoutTestController::waitUntilDone() +{ + //qDebug() << ">>>>waitForDone"; + m_waitForDone = true; + m_timeoutTimer.start(11000, this); +} + +QString LayoutTestController::counterValueForElementById(const QString& id) +{ + return qt_drt_counterValueForElementById(m_drt->webPage()->mainFrame(), id); +} + +void LayoutTestController::keepWebHistory() +{ + // FIXME: implement +} + +void LayoutTestController::notifyDone() +{ + qDebug() << ">>>>notifyDone"; + if (!m_timeoutTimer.isActive()) + return; + m_timeoutTimer.stop(); + emit done(); + m_isLoading = false; + m_waitForDone = false; + m_waitForPolicy = false; +} + +int LayoutTestController::windowCount() +{ + return m_drt->windowCount(); +} + +void LayoutTestController::clearBackForwardList() +{ + m_drt->webPage()->history()->clear(); +} + +void LayoutTestController::dumpEditingCallbacks() +{ + qDebug() << ">>>dumpEditingCallbacks"; + qt_dump_editing_callbacks(true); +} + +void LayoutTestController::dumpResourceLoadCallbacks() +{ + qt_dump_resource_load_callbacks(true); +} + +void LayoutTestController::queueBackNavigation(int howFarBackward) +{ + //qDebug() << ">>>queueBackNavigation" << howFarBackward; + WorkQueue::shared()->queue(new BackItem(howFarBackward, m_drt->webPage())); +} + +void LayoutTestController::queueForwardNavigation(int howFarForward) +{ + //qDebug() << ">>>queueForwardNavigation" << howFarForward; + WorkQueue::shared()->queue(new ForwardItem(howFarForward, m_drt->webPage())); +} + +void LayoutTestController::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 LayoutTestController::queueReload() +{ + //qDebug() << ">>>queueReload"; + WorkQueue::shared()->queue(new ReloadItem(m_drt->webPage())); +} + +void LayoutTestController::queueScript(const QString &url) +{ + //qDebug() << ">>>queueScript" << url; + WorkQueue::shared()->queue(new ScriptItem(url, m_drt->webPage())); +} + +void LayoutTestController::provisionalLoad() +{ + QWebFrame* frame = qobject_cast<QWebFrame*>(sender()); + if (!m_topLoadingFrame && m_isLoading) + m_topLoadingFrame = frame; +} + +void LayoutTestController::timerEvent(QTimerEvent *ev) +{ + if (ev->timerId() == m_timeoutTimer.timerId()) { + //qDebug() << ">>>>>>>>>>>>> timeout"; + notifyDone(); + } else + QObject::timerEvent(ev); +} + +QString LayoutTestController::encodeHostName(const QString& host) +{ + QString encoded = QString::fromLatin1(QUrl::toAce(host + QLatin1String(".no"))); + encoded.truncate(encoded.length() - 3); // strip .no + return encoded; +} + +QString LayoutTestController::decodeHostName(const QString& host) +{ + QString decoded = QUrl::fromAce(host.toLatin1() + QByteArray(".no")); + decoded.truncate(decoded.length() - 3); + return decoded; +} + +void LayoutTestController::setJavaScriptProfilingEnabled(bool enable) +{ + m_topLoadingFrame->page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); + qt_drt_setJavaScriptProfilingEnabled(m_topLoadingFrame, enable); +} + +void LayoutTestController::setFixedContentsSize(int width, int height) +{ + m_topLoadingFrame->page()->setPreferredContentsSize(QSize(width, height)); +} + +void LayoutTestController::setPrivateBrowsingEnabled(bool enable) +{ + m_drt->webPage()->settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, enable); +} + +void LayoutTestController::setPopupBlockingEnabled(bool enable) +{ + m_drt->webPage()->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, !enable); +} + +void LayoutTestController::setPOSIXLocale(const QString& locale) +{ + QLocale qlocale(locale); + QLocale::setDefault(qlocale); +} + +bool LayoutTestController::pauseAnimationAtTimeOnElementWithId(const QString& animationName, + double time, + const QString& elementId) +{ + QWebFrame* frame = m_drt->webPage()->mainFrame(); + Q_ASSERT(frame); + return qt_drt_pauseAnimation(frame, animationName, time, elementId); +} + +bool LayoutTestController::pauseTransitionAtTimeOnElementWithId(const QString& propertyName, + double time, + const QString& elementId) +{ + QWebFrame* frame = m_drt->webPage()->mainFrame(); + Q_ASSERT(frame); + return qt_drt_pauseTransitionOfProperty(frame, propertyName, time, elementId); +} + +unsigned LayoutTestController::numberOfActiveAnimations() const +{ + QWebFrame* frame = m_drt->webPage()->mainFrame(); + Q_ASSERT(frame); + return qt_drt_numberOfActiveAnimations(frame); +} + +void LayoutTestController::disableImageLoading() +{ + // FIXME: Implement for testing fix for https://bugs.webkit.org/show_bug.cgi?id=27896 + // Also need to make sure image loading is re-enabled for each new test. +} + +void LayoutTestController::dispatchPendingLoadRequests() +{ + // FIXME: Implement for testing fix for 6727495 +} + +void LayoutTestController::setDatabaseQuota(int size) +{ + if (!m_topLoadingFrame) + return; + m_topLoadingFrame->securityOrigin().setDatabaseQuota(size); +} + +void LayoutTestController::clearAllDatabases() +{ + QWebDatabase::removeAllDatabases(); +} + +void LayoutTestController::whiteListAccessFromOrigin(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains) +{ + qt_drt_whiteListAccessFromOrigin(sourceOrigin, destinationProtocol, destinationHost, allowDestinationSubdomains); +} + +void LayoutTestController::waitForPolicyDelegate() +{ + m_waitForPolicy = true; + waitUntilDone(); +} + +void LayoutTestController::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()); +} |