/*
 * Copyright (C) 2010 Apple Inc. All rights reserved.
 *
 * 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.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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.
 */

module WTR {

    interface LayoutTestController {
        // The basics.
        void dumpAsText(in boolean dumpPixels);
        void dumpChildFramesAsText();
        void waitForPolicyDelegate();
        void waitUntilDone();
        void notifyDone();

        // Other dumping.
        void dumpBackForwardList();
        void dumpChildFrameScrollPositions();
        void dumpEditingCallbacks();
        void dumpSelectionRect();
        void dumpStatusCallbacks();
        void dumpTitleChanges();
        void dumpFullScreenCallbacks();
        void dumpConfigurationForViewport(in int deviceDPI, in int deviceWidth, in int deviceHeight, in int availableWidth, in int availableHeight);

        // Special options.
        void keepWebHistory();
        void setAcceptsEditing(in boolean value);
        void setCanOpenWindows(in boolean value);
        void setCloseRemainingWindowsWhenComplete(in boolean value);
        void setXSSAuditorEnabled(in boolean value);
        void setAllowUniversalAccessFromFileURLs(in boolean value);
        void setAllowFileAccessFromFileURLs(in boolean value);
        void setFrameFlatteningEnabled(in boolean value);
        void setGeolocationPermission(in boolean value);
        void setJavaScriptCanAccessClipboard(in boolean value);
        void setPrivateBrowsingEnabled(in boolean value);
        void setPopupBlockingEnabled(in boolean value);
        void setAuthorAndUserStylesEnabled(in boolean value);
        void addOriginAccessWhitelistEntry(in DOMString sourceOrigin, in DOMString destinationProtocol, in DOMString destinationHost, in boolean allowDestinationSubdomains);
        void removeOriginAccessWhitelistEntry(in DOMString sourceOrigin, in DOMString destinationProtocol, in DOMString destinationHost, in boolean allowDestinationSubdomains);

        // Special DOM functions.
        void clearBackForwardList();
        object computedStyleIncludingVisitedInfo(in object element);
        DOMString counterValueForElementById(in DOMString elementId);
        void execCommand(in DOMString name, in DOMString argument);
        boolean isCommandEnabled(in DOMString name);
        DOMString markerTextForListItem(in object element);
        unsigned long windowCount();

        // Special DOM variables.
        attribute boolean globalFlag;

        // Repaint testing.
        void testRepaint();
        void repaintSweepHorizontally();
        void display();

        // Printing
        int numberOfPages(in double pageWidthInPixels, in double pageHeightInPixels);
        int pageNumberForElementById(in DOMString id, in double pageWidthInPixels, in double pageHeightInPixels);
        DOMString pageSizeAndMarginsInPixels(in int pageIndex, in int width, in int height, in int marginTop, in int marginRight, in int marginBottom, in int marginLeft);
        boolean isPageBoxVisible(in int pageIndex);

        // Animation testing.
        int numberOfActiveAnimations();
        boolean pauseAnimationAtTimeOnElementWithId(in DOMString animationName, in double time, in DOMString elementId);
        boolean pauseTransitionAtTimeOnElementWithId(in DOMString propertyName, in double time, in DOMString elementId);
        void suspendAnimations();
        void resumeAnimations();

        // UserContent testing.
        void addUserScript(in DOMString source, in boolean runAtStart, in boolean allFrames);
        void addUserStyleSheet(in DOMString source, in boolean allFrames);

        // Local storage API
        void clearAllDatabases();
        void setDatabaseQuota(in unsigned long long quota);
        DOMString pathToLocalResource(in DOMString url);

        // Application Cache API
        void clearAllApplicationCaches();
        void setAppCacheMaximumSize(in unsigned long long size);

        // Compositing testing.
        DOMString layerTreeAsText();

        // Text search testing.
        boolean findString(in DOMString target, in object optionsArray);

        // Evaluating script in a special context.
        [PassContext] void evaluateScriptInIsolatedWorld(in unsigned long worldID, in DOMString script);

        // For Web Inspector tests
        void showWebInspector();
        void closeWebInspector();
        void evaluateInWebInspector(in long callID, in DOMString script);

        void setPOSIXLocale(in DOMString locale);

        void setTextDirection(in DOMString direction);

        void setWillSendRequestReturnsNull(in boolean flag);
        
        void setShouldStayOnPageAfterHandlingBeforeUnload(in boolean flag);
        
        // Focus testing.
        void addChromeInputField(in object callback);
        void removeChromeInputField(in object callback);
        void focusWebView(in object callback);

        void setBackingScaleFactor(in double backingScaleFactor, in object callback);

        void setWindowIsKey(in boolean isKey);

        // FIXME: handle non-boolean preferences.
        void overridePreference(in DOMString preference, in boolean value);

        readonly attribute DOMString platformName;
    };

}
