/* * 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. */ #ifndef LayoutTestControllerQt_h #define LayoutTestControllerQt_h #include <QBasicTimer> #include <QObject> #include <QSize> #include <QString> #include <QtDebug> #include <QTimer> #include <QTimerEvent> #include <QVariant> #include <qwebdatabase.h> #include <qwebelement.h> #include <qwebframe.h> #include <qwebhistory.h> #include <qwebpage.h> #include <qwebsecurityorigin.h> class QWebFrame; class DumpRenderTreeSupportQt; namespace WebCore { class DumpRenderTree; } class LayoutTestController : public QObject { Q_OBJECT Q_PROPERTY(int webHistoryItemCount READ webHistoryItemCount) Q_PROPERTY(int workerThreadCount READ workerThreadCount) Q_PROPERTY(bool globalFlag READ globalFlag WRITE setGlobalFlag) public: LayoutTestController(WebCore::DumpRenderTree* drt); bool shouldDumpAsText() const { return m_textDump; } bool shouldDumpBackForwardList() const { return m_dumpBackForwardList; } bool shouldDumpChildrenAsText() const { return m_dumpChildrenAsText; } bool shouldDumpChildFrameScrollPositions() const { return m_dumpChildFrameScrollPositions; } bool shouldDumpDatabaseCallbacks() const { return m_dumpDatabaseCallbacks; } bool shouldDumpApplicationCacheDelegateCallbacks() const { return m_dumpApplicationCacheDelegateCallbacks; } bool shouldDumpStatusCallbacks() const { return m_dumpStatusCallbacks; } bool shouldWaitUntilDone() const { return m_waitForDone; } bool shouldHandleErrorPages() const { return m_handleErrorPages; } bool canOpenWindows() const { return m_canOpenWindows; } bool shouldDumpTitleChanges() const { return m_dumpTitleChanges; } bool waitForPolicy() const { return m_waitForPolicy; } bool ignoreReqestForPermission() const { return m_ignoreDesktopNotification; } bool isPrinting() { return m_isPrinting; } void reset(); static const unsigned int maxViewWidth; static const unsigned int maxViewHeight; protected: void timerEvent(QTimerEvent*); signals: void done(); void showPage(); void hidePage(); void geolocationPermissionSet(); public slots: void maybeDump(bool ok); void dumpAsText() { m_textDump = true; } void dumpChildFramesAsText() { m_dumpChildrenAsText = true; } void dumpChildFrameScrollPositions() { m_dumpChildFrameScrollPositions = true; } void dumpDatabaseCallbacks() { m_dumpDatabaseCallbacks = true; } void dumpApplicationCacheDelegateCallbacks() { m_dumpApplicationCacheDelegateCallbacks = true;} void dumpStatusCallbacks() { m_dumpStatusCallbacks = true; } void setCanOpenWindows() { m_canOpenWindows = true; } void setPrinting() { m_isPrinting = true; } void waitUntilDone(); QString counterValueForElementById(const QString& id); int webHistoryItemCount(); void keepWebHistory(); void notifyDone(); void dumpBackForwardList() { m_dumpBackForwardList = true; } bool globalFlag() const { return m_globalFlag; } void setGlobalFlag(bool flag) { m_globalFlag = flag; } void handleErrorPages() { m_handleErrorPages = true; } void dumpEditingCallbacks(); void dumpFrameLoadCallbacks(); void dumpUserGestureInFrameLoadCallbacks(); void dumpResourceLoadCallbacks(); void dumpResourceResponseMIMETypes(); void dumpHistoryCallbacks(); void dumpConfigurationForViewport(int deviceDPI, int deviceWidth, int deviceHeight, int availableWidth, int availableHeight); void setWillSendRequestReturnsNullOnRedirect(bool enabled); void setWillSendRequestReturnsNull(bool enabled); void setWillSendRequestClearHeader(const QStringList& headers); void queueBackNavigation(int howFarBackward); void queueForwardNavigation(int howFarForward); void queueLoad(const QString& url, const QString& target = QString()); void queueLoadHTMLString(const QString& content, const QString& baseURL = QString(), const QString& failingURL = QString()); void queueReload(); void queueLoadingScript(const QString& script); void queueNonLoadingScript(const QString& script); void provisionalLoad(); void setCloseRemainingWindowsWhenComplete(bool = false) {} int windowCount(); void grantDesktopNotificationPermission(const QString& origin); void ignoreDesktopNotificationPermissionRequests(); bool checkDesktopNotificationPermission(const QString& origin); void simulateDesktopNotificationClick(const QString& title); void display(); void clearBackForwardList(); QString pathToLocalResource(const QString& url); void dumpTitleChanges() { m_dumpTitleChanges = true; } QString encodeHostName(const QString& host); QString decodeHostName(const QString& host); void dumpSelectionRect() const {} void setDeveloperExtrasEnabled(bool); void setAsynchronousSpellCheckingEnabled(bool); void showWebInspector(); void closeWebInspector(); void evaluateInWebInspector(long callId, const QString& script); void removeAllVisitedLinks(); void setMediaType(const QString& type); void setFrameFlatteningEnabled(bool enable); void setAllowUniversalAccessFromFileURLs(bool enable); void setAllowFileAccessFromFileURLs(bool enable); void setAppCacheMaximumSize(unsigned long long quota); void setJavaScriptProfilingEnabled(bool enable); void setTimelineProfilingEnabled(bool enable); void setFixedContentsSize(int width, int height); void setPrivateBrowsingEnabled(bool enable); void setSpatialNavigationEnabled(bool enabled); void setPluginsEnabled(bool flag); void setPopupBlockingEnabled(bool enable); void setPOSIXLocale(const QString& locale); void resetLoadFinished() { m_loadFinished = false; } void setWindowIsKey(bool isKey); void setMainFrameIsFirstResponder(bool isFirst); void setDeferMainResourceDataLoad(bool); void setJavaScriptCanAccessClipboard(bool enable); void setXSSAuditorEnabled(bool enable); void setCaretBrowsingEnabled(bool enable); void setViewModeMediaFeature(const QString& mode); void setSmartInsertDeleteEnabled(bool enable); void setSelectTrailingWhitespaceEnabled(bool enable); void execCommand(const QString& name, const QString& value = QString()); bool isCommandEnabled(const QString& name) const; bool findString(const QString& string, const QStringList& optionArray); bool pauseAnimationAtTimeOnElementWithId(const QString& animationName, double time, const QString& elementId); bool pauseTransitionAtTimeOnElementWithId(const QString& propertyName, double time, const QString& elementId); bool sampleSVGAnimationForElementAtTime(const QString& animationId, double time, const QString& elementId); bool elementDoesAutoCompleteForElementWithId(const QString& elementId); unsigned numberOfActiveAnimations() const; void suspendAnimations() const; void resumeAnimations() const; void addOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains); void removeOriginAccessWhitelistEntry(const QString& sourceOrigin, const QString& destinationProtocol, const QString& destinationHost, bool allowDestinationSubdomains); void dispatchPendingLoadRequests(); void disableImageLoading(); void clearAllApplicationCaches(); void clearApplicationCacheForOrigin(const QString& url); void setApplicationCacheOriginQuota(unsigned long long quota); QStringList originsWithApplicationCache(); void setDatabaseQuota(int size); void clearAllDatabases(); void setIconDatabaseEnabled(bool enable); void setCustomPolicyDelegate(bool enabled, bool permissive = false); void waitForPolicyDelegate(); void overridePreference(const QString& name, const QVariant& value); void setUserStyleSheetLocation(const QString& url); void setUserStyleSheetEnabled(bool enabled); void setDomainRelaxationForbiddenForURLScheme(bool forbidden, const QString& scheme); int workerThreadCount(); int pageNumberForElementById(const QString& id, float width = 0, float height = 0); int numberOfPages(float width = maxViewWidth, float height = maxViewHeight); bool callShouldCloseOnWebView(); // For now, this is a no-op. This may change depending on outcome of // https://bugs.webkit.org/show_bug.cgi?id=33333 void setCallCloseOnWebViews() {} // This is a no-op - it allows us to pass // plugins/get-url-that-the-resource-load-delegate-will-disallow.html // which is a Mac-specific test. void addDisallowedURL(const QString&) {} void setMockDeviceOrientation(bool canProvideAlpha, double alpha, bool canProvideBeta, double beta, bool canProvideGamma, double gamma); void setMockGeolocationError(int code, const QString& message); void setMockGeolocationPosition(double latitude, double longitude, double accuracy); void setGeolocationPermission(bool allow); int numberOfPendingGeolocationPermissionRequests(); bool isGeolocationPermissionSet() const { return m_isGeolocationPermissionSet; } bool geolocationPermission() const { return m_geolocationPermission; } void addMockSpeechInputResult(const QString& result, double confidence, const QString& language); // Empty stub method to keep parity with object model exposed by global LayoutTestController. void abortModal() {} bool hasSpellingMarker(int from, int length); QVariantList nodesFromRect(const QWebElement& document, int x, int y, unsigned top, unsigned right, unsigned bottom, unsigned left, bool ignoreClipping); void addURLToRedirect(const QString& origin, const QString& destination); /* Policy values: 'on', 'auto' or 'off'. Orientation values: 'vertical' or 'horizontal'. */ void setScrollbarPolicy(const QString& orientation, const QString& policy); QString markerTextForListItem(const QWebElement& listItem); QVariantMap computedStyleIncludingVisitedInfo(const QWebElement& element) const; // Simulate a request an embedding application could make, populating per-session credential storage. void authenticateSession(const QString& url, const QString& username, const QString& password); void setEditingBehavior(const QString& editingBehavior); QVariant shadowRoot(const QWebElement&); void evaluateScriptInIsolatedWorld(int worldID, const QString& script); bool isPageBoxVisible(int pageIndex); QString pageSizeAndMarginsInPixels(int pageIndex, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft); QString pageProperty(const QString& propertyName, int pageNumber); void addUserStyleSheet(const QString& sourceCode); void setMinimumTimerInterval(double); void originsWithLocalStorage(); void deleteAllLocalStorage(); void deleteLocalStorageForOrigin(const QString& originIdentifier); void observeStorageTrackerNotifications(unsigned number); void syncLocalStorage(); private slots: void processWork(); private: void setGeolocationPermissionCommon(bool allow); private: bool m_hasDumped; bool m_textDump; bool m_dumpBackForwardList; bool m_dumpChildrenAsText; bool m_dumpChildFrameScrollPositions; bool m_canOpenWindows; bool m_waitForDone; bool m_dumpTitleChanges; bool m_dumpDatabaseCallbacks; bool m_dumpApplicationCacheDelegateCallbacks; bool m_dumpStatusCallbacks; bool m_waitForPolicy; bool m_handleErrorPages; bool m_loadFinished; bool m_globalFlag; bool m_userStyleSheetEnabled; bool m_isGeolocationPermissionSet; bool m_isPrinting; bool m_geolocationPermission; QUrl m_userStyleSheetLocation; QBasicTimer m_timeoutTimer; QWebFrame* m_topLoadingFrame; WebCore::DumpRenderTree* m_drt; QWebHistory* m_webHistory; QStringList m_desktopNotificationAllowedOrigins; bool m_ignoreDesktopNotification; }; #endif // LayoutTestControllerQt_h