/*
 * Copyright (C) 2012 Google 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 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.
 */

[
    OmitConstructor,
    JSGenerateToJSObject
] interface InternalSettings : InternalSettingsGenerated {
    void setMockScrollbarsEnabled(in boolean enabled) raises(DOMException);
    void setTouchEventEmulationEnabled(in boolean enabled) raises(DOMException);
    void setShadowDOMEnabled(in boolean enabled) raises(DOMException);
    void setAuthorShadowDOMForAnyElementEnabled(in boolean isEnabled);
    void setStyleScopedEnabled(in boolean isEnabled);
    void setStandardFontFamily(in DOMString family, in DOMString script) raises(DOMException);
    void setSerifFontFamily(in DOMString family, in DOMString script) raises(DOMException);
    void setSansSerifFontFamily(in DOMString family, in DOMString script) raises(DOMException);
    void setFixedFontFamily(in DOMString family, in DOMString script) raises(DOMException);
    void setCursiveFontFamily(in DOMString family, in DOMString script) raises(DOMException);
    void setFantasyFontFamily(in DOMString family, in DOMString script) raises(DOMException);
    void setPictographFontFamily(in DOMString family, in DOMString script) raises(DOMException);
    void setTextAutosizingEnabled(in boolean enabled) raises(DOMException);
    void setTextAutosizingWindowSizeOverride(in long width, in long height) raises(DOMException);
    void setTextAutosizingFontScaleFactor(in float fontScaleFactor) raises(DOMException);
    void setResolutionOverride(in long dotsPerCSSInchHorizontally, in long dotsPerCSSInchVertically) raises(DOMException);
    void setMediaTypeOverride(in DOMString mediaTypeOverride) raises(DOMException);
    void setEnableScrollAnimator(in boolean enabled) raises(DOMException);
    boolean scrollAnimatorEnabled() raises(DOMException);
    void setCSSExclusionsEnabled(in boolean enabled) raises(DOMException);
    void setCSSVariablesEnabled(in boolean enabled) raises(DOMException);
    boolean cssVariablesEnabled() raises(DOMException);
    void setCanStartMedia(in boolean enabled) raises(DOMException);
    void setEditingBehavior(in DOMString behavior) raises(DOMException);
    void setDialogElementEnabled(in boolean enabled) raises(DOMException);
    void setLangAttributeAwareFormControlUIEnabled(in boolean enabled);

    [Conditional=VIDEO_TRACK] void setShouldDisplayTrackKind(in DOMString kind, in boolean enabled) raises (DOMException);
    [Conditional=VIDEO_TRACK] boolean shouldDisplayTrackKind(in DOMString trackKind) raises (DOMException);
    void setStorageBlockingPolicy(in DOMString policy) raises(DOMException);
    void setImagesEnabled(in boolean enabled) raises(DOMException);
    void setMinimumTimerInterval(in double intervalInSeconds) raises(DOMException);
};
