/*
 * 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 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);
    [RaisesException] void setUniversalAccessFromFileURLs(boolean enabled);

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