/*
 * 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.
 */

interface InternalSettings : InternalSettingsGenerated {
    // All methods which access Page::settings() can raise an exception
    // when the page cannot be accessed. (Such as during page tear-down.)
    [RaisesException] void setMockScrollbarsEnabled(boolean enabled);
    [RaisesException] void setHideScrollbars(boolean enabled);
    [RaisesException] void setMockGestureTapHighlightsEnabled(boolean enabled);
    [RaisesException] void setStandardFontFamily(DOMString family, DOMString script);
    [RaisesException] void setSerifFontFamily(DOMString family, DOMString script);
    [RaisesException] void setSansSerifFontFamily(DOMString family, DOMString script);
    [RaisesException] void setFixedFontFamily(DOMString family, DOMString script);
    [RaisesException] void setCursiveFontFamily(DOMString family, DOMString script);
    [RaisesException] void setFantasyFontFamily(DOMString family, DOMString script);
    [RaisesException] void setPictographFontFamily(DOMString family, DOMString script);
    [RaisesException] void setTextAutosizingEnabled(boolean enabled);
    [RaisesException] void setTextAutosizingWindowSizeOverride(long width, long height);
    [RaisesException] void setTextTrackKindUserPreference(DOMString preference);
    [RaisesException] void setAccessibilityFontScaleFactor(float fontScaleFactor);
    [RaisesException] void setMediaTypeOverride(DOMString mediaTypeOverride);
    [RaisesException] void setDisplayModeOverride(DOMString displayModeOverride);
    [RaisesException] void setEditingBehavior(DOMString behavior);
    [RaisesException] void setImagesEnabled(boolean enabled);
    [RaisesException] void setDefaultVideoPosterURL(DOMString poster);
    [RaisesException] void setViewportEnabled(boolean enabled);
    [RaisesException] void setViewportMetaEnabled(boolean enabled);
    [RaisesException] void setViewportStyle(DOMString style);
    [RaisesException] void setAvailablePointerTypes(DOMString pointers);
    [RaisesException] void setPrimaryPointerType(DOMString pointer);
    [RaisesException] void setAvailableHoverTypes(DOMString types);
    [RaisesException] void setPrimaryHoverType(DOMString type);
    [RaisesException] void setImageAnimationPolicy(DOMString policy);
    [RaisesException] void setPresentationReceiver(boolean enabled);
    [RaisesException] void setAutoplayPolicy(DOMString policy);

    // FIXME: The following are RuntimeEnabledFeatures and likely
    // cannot be changed after process start.  These setters should
    // be removed or moved onto internals.runtimeFlags:
    void setCSSStickyPositionEnabled(boolean enabled);
    void setLangAttributeAwareFormControlUIEnabled(boolean enabled);
    void setOverlayScrollbarsEnabled(boolean enabled);
    void setExperimentalContentSecurityPolicyFeaturesEnabled(boolean enabled);
    void setScrollTopLeftInteropEnabled(boolean enabled);
};
