/*
 * Copyright (C) 2003, 2004, 2005, 2012 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. 
 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission. 
 *
 * 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.
 */

#import <Foundation/Foundation.h>

/*!
@enum WebCacheModel

@abstract Specifies a usage model for a WebView, which WebKit will use to 
determine its caching behavior.

@constant WebCacheModelDocumentViewer Appropriate for a WebView displaying 
a fixed document -- like a splash screen, a chat document, or a word processing 
document -- with no UI for navigation. The WebView will behave like any other 
view, releasing resources when they are no longer referenced. Remote resources, 
if any, will be cached to disk. This is the most memory-efficient setting.

Examples: iChat, Mail, TextMate, Growl.

@constant WebCacheModelDocumentBrowser Appropriate for a WebView displaying 
a browsable series of documents with a UI for navigating between them -- for 
example, a reference materials browser or a website designer. The WebView will 
cache a reasonable number of resources and previously viewed documents in 
memory and/or on disk.

Examples: Dictionary, Help Viewer, Coda.

@constant WebCacheModelPrimaryWebBrowser Appropriate for a WebView in the 
application that acts as the user's primary web browser. The WebView will cache
a very large number of resources and previously viewed documents in memory 
and/or on disk.

Examples: Safari, OmniWeb, Shiira.
*/
typedef NS_ENUM(NSUInteger, WebCacheModel) {
    WebCacheModelDocumentViewer = 0,
    WebCacheModelDocumentBrowser = 1,
    WebCacheModelPrimaryWebBrowser = 2
};

typedef struct WebPreferencesPrivate WebPreferencesPrivate;

extern NSString *WebPreferencesChangedNotification;

/*!
    @class WebPreferences
*/
@interface WebPreferences: NSObject <NSCoding>
{
@package
    WebPreferencesPrivate *_private;
}

/*!
    @method standardPreferences
*/
+ (WebPreferences *)standardPreferences;

/*!
    @method initWithIdentifier:
    @param anIdentifier A string used to identify the WebPreferences.
    @discussion WebViews can share instances of WebPreferences by using an instance of WebPreferences with
    the same identifier.  Typically, instance are not created directly.  Instead you set the preferences
    identifier on a WebView.  The identifier is used as a prefix that is added to the user defaults keys
    for the WebPreferences.
    @result Returns a new instance of WebPreferences or a previously allocated instance with the same identifier.
*/
- (instancetype)initWithIdentifier:(NSString *)anIdentifier;

/*!
    @property identifier
    @result Returns the identifier for this WebPreferences.
*/
@property (nonatomic, readonly, copy) NSString *identifier;

/*!
    @property standardFontFamily
*/
@property (nonatomic, copy) NSString *standardFontFamily;

/*!
    @property fixedFontFamily
*/
@property (nonatomic, copy) NSString *fixedFontFamily;

/*!
    @property serifFontFamily
*/
@property (nonatomic, copy) NSString *serifFontFamily;

/*!
    @property sansSerifFontFamily
*/
@property (nonatomic, copy) NSString *sansSerifFontFamily;

/*!
    @property cursiveFontFamily
*/
@property (nonatomic, copy) NSString *cursiveFontFamily;

/*!
    @property fantasyFontFamily
*/
@property (nonatomic, copy) NSString *fantasyFontFamily;

/*!
    @property defaultFontSize
*/
@property (nonatomic) int defaultFontSize;

/*!
    @property defaultFixedFontSize
*/
@property (nonatomic) int defaultFixedFontSize;

/*!
    @property minimumFontSize
*/
@property (nonatomic) int minimumFontSize;

/*!
    @property minimumLogicalFontSize
*/
@property (nonatomic) int minimumLogicalFontSize;

/*!
    @property defaultTextEncodingName
*/
@property (nonatomic, copy) NSString *defaultTextEncodingName;

/*!
    @property userStyleSheetEnabled
*/
@property (nonatomic) BOOL userStyleSheetEnabled;

/*!
    @property userStyleSheetLocation
    @abstract The location of the user style sheet.
*/
@property (nonatomic, strong) NSURL *userStyleSheetLocation;

/*!
    @property javaEnabled
*/
@property (nonatomic, getter=isJavaEnabled) BOOL javaEnabled;

/*!
    @property javaScriptEnabled
*/
@property (nonatomic, getter=isJavaScriptEnabled) BOOL javaScriptEnabled;

/*!
    @property javaScriptCanOpenWindowsAutomatically
*/
@property (nonatomic) BOOL javaScriptCanOpenWindowsAutomatically;

/*!
    @property plugInsEnabled
*/
@property (nonatomic, getter=arePlugInsEnabled) BOOL plugInsEnabled;

/*!
    @property allowsAnimatedImages
*/
@property (nonatomic) BOOL allowsAnimatedImages;

/*!
    @property allowsAnimatedImageLooping
*/
@property (nonatomic) BOOL allowsAnimatedImageLooping;

/*!
    @property willLoadImagesAutomatically
*/
@property (nonatomic) BOOL loadsImagesAutomatically;

/*!
    @property autosaves
    @discussion If autosaves is YES the settings represented by
    WebPreferences will be stored in the user defaults database.
*/
@property (nonatomic) BOOL autosaves;

#if !TARGET_OS_IPHONE
/*!
    @property shouldPrintBackgrounds
*/
@property (nonatomic) BOOL shouldPrintBackgrounds;
#endif

/*!
    @property privateBrowsingEnabled:
    @abstract If private browsing is enabled, WebKit will not store information
    about sites the user visits.
 */
@property (nonatomic) BOOL privateBrowsingEnabled;

#if !TARGET_OS_IPHONE
/*!
    @property tabsToLinks
    @abstract If tabsToLinks is YES, the tab key will focus links and form controls.
    The option key temporarily reverses this preference.
*/
@property (nonatomic) BOOL tabsToLinks;
#endif

/*!
    @property usesPageCache
    @abstract Whether the receiver's associated WebViews use the shared
    page cache.
    @discussion Pages are cached as they are added to a WebBackForwardList, and
    removed from the cache as they are removed from a WebBackForwardList. Because 
    the page cache is global, caching a page in one WebBackForwardList may cause
    a page in another WebBackForwardList to be evicted from the cache.
*/
@property (nonatomic) BOOL usesPageCache;

/*!
    @property cacheModel
    @abstract Specifies a usage model for a WebView, which WebKit will use to
    determine its caching behavior. If necessary, WebKit
    will prune its caches to match cacheModel when set.

    @discussion Research indicates that users tend to browse within clusters of
    documents that hold resources in common, and to revisit previously visited
    documents. WebKit and the frameworks below it include built-in caches that take
    advantage of these patterns, substantially improving document load speed in
    browsing situations. The WebKit cache model controls the behaviors of all of
    these caches, including NSURLCache and the various WebCore caches.

    Applications with a browsing interface can improve document load speed
    substantially by specifying WebCacheModelDocumentBrowser. Applications without
    a browsing interface can reduce memory usage substantially by specifying
    WebCacheModelDocumentViewer.

    If cacheModel is not set, WebKit will select a cache model automatically.
*/
@property (nonatomic) WebCacheModel cacheModel;

/*!
    @property suppressesIncrementalRendering
*/
@property (nonatomic) BOOL suppressesIncrementalRendering;

/*!
    @property allowsAirPlayForMediaPlayback
 */
@property (nonatomic) BOOL allowsAirPlayForMediaPlayback;

@end
