/*
 * 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
] 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 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);
    void setDefaultVideoPosterURL(in DOMString poster) raises(DOMException);
    void setTimeWithoutMouseMovementBeforeHidingControls(in double time) raises(DOMException);
    void setUseLegacyBackgroundSizeShorthandBehavior(in boolean enabled) raises(DOMException);
};
