1/*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.  All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "WebKit.h"
28#include "WebKitDLL.h"
29#include "WebPreferences.h"
30
31#include "WebNotificationCenter.h"
32#include "WebPreferenceKeysPrivate.h"
33
34#include <CoreFoundation/CoreFoundation.h>
35#include <WebCore/CACFLayerTreeHost.h>
36#include <WebCore/COMPtr.h>
37#include <WebCore/FileSystem.h>
38#include <WebCore/Font.h>
39#include <WebCore/LocalizedStrings.h>
40#include <limits>
41#include <shlobj.h>
42#include <wchar.h>
43#include <wtf/HashMap.h>
44#include <wtf/OwnArrayPtr.h>
45#include <wtf/text/CString.h>
46#include <wtf/text/StringHash.h>
47#include <wtf/text/WTFString.h>
48
49#if USE(CG)
50#include <CoreGraphics/CoreGraphics.h>
51#include <WebKitSystemInterface/WebKitSystemInterface.h>
52#endif
53
54using namespace WebCore;
55using std::numeric_limits;
56
57static const String& oldPreferencesPath()
58{
59    static String path = pathByAppendingComponent(roamingUserSpecificStorageDirectory(), "WebKitPreferences.plist");
60    return path;
61}
62
63template<typename NumberType> struct CFNumberTraits { static const unsigned Type; };
64template<> struct CFNumberTraits<int> { static const unsigned Type = kCFNumberSInt32Type; };
65template<> struct CFNumberTraits<LONGLONG> { static const unsigned Type = kCFNumberLongLongType; };
66template<> struct CFNumberTraits<float> { static const unsigned Type = kCFNumberFloat32Type; };
67
68template<typename NumberType>
69static NumberType numberValueForPreferencesValue(CFPropertyListRef value)
70{
71    if (!value)
72        return 0;
73
74    CFTypeID cfType = CFGetTypeID(value);
75    if (cfType == CFStringGetTypeID())
76        return static_cast<NumberType>(CFStringGetIntValue(static_cast<CFStringRef>(value)));
77    else if (cfType == CFBooleanGetTypeID()) {
78        Boolean boolVal = CFBooleanGetValue(static_cast<CFBooleanRef>(value));
79        return boolVal ? 1 : 0;
80    } else if (cfType == CFNumberGetTypeID()) {
81        NumberType val = 0;
82        CFNumberGetValue(static_cast<CFNumberRef>(value), CFNumberTraits<NumberType>::Type, &val);
83        return val;
84    }
85
86    return 0;
87}
88
89template<typename NumberType>
90static RetainPtr<CFNumberRef> cfNumber(NumberType value)
91{
92    return adoptCF(CFNumberCreate(0, CFNumberTraits<NumberType>::Type, &value));
93}
94
95static bool booleanValueForPreferencesValue(CFPropertyListRef value)
96{
97    return numberValueForPreferencesValue<int>(value);
98}
99
100// WebPreferences ----------------------------------------------------------------
101
102static CFDictionaryRef defaultSettings;
103
104static HashMap<WTF::String, COMPtr<WebPreferences> > webPreferencesInstances;
105
106WebPreferences* WebPreferences::sharedStandardPreferences()
107{
108    static WebPreferences* standardPreferences;
109    if (!standardPreferences) {
110        standardPreferences = WebPreferences::createInstance();
111        standardPreferences->setAutosaves(TRUE);
112        standardPreferences->load();
113    }
114
115    return standardPreferences;
116}
117
118WebPreferences::WebPreferences()
119    : m_refCount(0)
120    , m_autoSaves(0)
121    , m_automaticallyDetectsCacheModel(true)
122    , m_numWebViews(0)
123{
124    gClassCount++;
125    gClassNameCount.add("WebPreferences");
126}
127
128WebPreferences::~WebPreferences()
129{
130    gClassCount--;
131    gClassNameCount.remove("WebPreferences");
132}
133
134WebPreferences* WebPreferences::createInstance()
135{
136    WebPreferences* instance = new WebPreferences();
137    instance->AddRef();
138    return instance;
139}
140
141HRESULT WebPreferences::postPreferencesChangesNotification()
142{
143    IWebNotificationCenter* nc = WebNotificationCenter::defaultCenterInternal();
144    HRESULT hr = nc->postNotificationName(webPreferencesChangedNotification(), static_cast<IWebPreferences*>(this), 0);
145    if (FAILED(hr))
146        return hr;
147
148    return S_OK;
149}
150
151WebPreferences* WebPreferences::getInstanceForIdentifier(BSTR identifier)
152{
153    if (!identifier)
154        return sharedStandardPreferences();
155
156    WTF::String identifierString(identifier, SysStringLen(identifier));
157    return webPreferencesInstances.get(identifierString).get();
158}
159
160void WebPreferences::setInstance(WebPreferences* instance, BSTR identifier)
161{
162    if (!identifier || !instance)
163        return;
164    WTF::String identifierString(identifier, SysStringLen(identifier));
165    webPreferencesInstances.add(identifierString, instance);
166}
167
168void WebPreferences::removeReferenceForIdentifier(BSTR identifier)
169{
170    if (!identifier || webPreferencesInstances.isEmpty())
171        return;
172
173    WTF::String identifierString(identifier, SysStringLen(identifier));
174    WebPreferences* webPreference = webPreferencesInstances.get(identifierString).get();
175    if (webPreference && webPreference->m_refCount == 1)
176        webPreferencesInstances.remove(identifierString);
177}
178
179void WebPreferences::initializeDefaultSettings()
180{
181    if (defaultSettings)
182        return;
183
184    CFMutableDictionaryRef defaults = CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
185
186    CFDictionaryAddValue(defaults, CFSTR(WebKitStandardFontPreferenceKey), CFSTR("Times New Roman"));
187    CFDictionaryAddValue(defaults, CFSTR(WebKitFixedFontPreferenceKey), CFSTR("Courier New"));
188    CFDictionaryAddValue(defaults, CFSTR(WebKitSerifFontPreferenceKey), CFSTR("Times New Roman"));
189    CFDictionaryAddValue(defaults, CFSTR(WebKitSansSerifFontPreferenceKey), CFSTR("Arial"));
190    CFDictionaryAddValue(defaults, CFSTR(WebKitCursiveFontPreferenceKey), CFSTR("Comic Sans MS"));
191    CFDictionaryAddValue(defaults, CFSTR(WebKitFantasyFontPreferenceKey), CFSTR("Comic Sans MS"));
192    CFDictionaryAddValue(defaults, CFSTR(WebKitPictographFontPreferenceKey), CFSTR("Times New Roman"));
193    CFDictionaryAddValue(defaults, CFSTR(WebKitMinimumFontSizePreferenceKey), CFSTR("0"));
194    CFDictionaryAddValue(defaults, CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), CFSTR("9"));
195    CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultFontSizePreferenceKey), CFSTR("16"));
196    CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultFixedFontSizePreferenceKey), CFSTR("13"));
197
198    String defaultDefaultEncoding(WEB_UI_STRING("ISO-8859-1", "The default, default character encoding on Windows"));
199    CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), defaultDefaultEncoding.createCFString().get());
200
201    CFDictionaryAddValue(defaults, CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), kCFBooleanFalse);
202    CFDictionaryAddValue(defaults, CFSTR(WebKitUserStyleSheetLocationPreferenceKey), CFSTR(""));
203    CFDictionaryAddValue(defaults, CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), kCFBooleanFalse);
204    CFDictionaryAddValue(defaults, CFSTR(WebKitTextAreasAreResizablePreferenceKey), kCFBooleanFalse);
205    CFDictionaryAddValue(defaults, CFSTR(WebKitJavaEnabledPreferenceKey), kCFBooleanTrue);
206    CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptEnabledPreferenceKey), kCFBooleanTrue);
207    CFDictionaryAddValue(defaults, CFSTR(WebKitWebSecurityEnabledPreferenceKey), kCFBooleanTrue);
208    CFDictionaryAddValue(defaults, CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey), kCFBooleanFalse);
209    CFDictionaryAddValue(defaults, CFSTR(WebKitAllowFileAccessFromFileURLsPreferenceKey), kCFBooleanTrue);
210    CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptCanAccessClipboardPreferenceKey), kCFBooleanFalse);
211    CFDictionaryAddValue(defaults, CFSTR(WebKitXSSAuditorEnabledPreferenceKey), kCFBooleanTrue);
212    CFDictionaryAddValue(defaults, CFSTR(WebKitFrameFlatteningEnabledPreferenceKey), kCFBooleanFalse);
213    CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), kCFBooleanTrue);
214    CFDictionaryAddValue(defaults, CFSTR(WebKitPluginsEnabledPreferenceKey), kCFBooleanTrue);
215    CFDictionaryAddValue(defaults, CFSTR(WebKitCSSRegionsEnabledPreferenceKey), kCFBooleanTrue);
216    CFDictionaryAddValue(defaults, CFSTR(WebKitDatabasesEnabledPreferenceKey), kCFBooleanTrue);
217    CFDictionaryAddValue(defaults, CFSTR(WebKitLocalStorageEnabledPreferenceKey), kCFBooleanTrue);
218    CFDictionaryAddValue(defaults, CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey), kCFBooleanFalse);
219    CFDictionaryAddValue(defaults, CFSTR(WebKitZoomsTextOnlyPreferenceKey), kCFBooleanTrue);
220    CFDictionaryAddValue(defaults, CFSTR(WebKitAllowAnimatedImagesPreferenceKey), kCFBooleanTrue);
221    CFDictionaryAddValue(defaults, CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), kCFBooleanTrue);
222    CFDictionaryAddValue(defaults, CFSTR(WebKitDisplayImagesKey), kCFBooleanTrue);
223    CFDictionaryAddValue(defaults, CFSTR(WebKitLoadSiteIconsKey), kCFBooleanFalse);
224    CFDictionaryAddValue(defaults, CFSTR(WebKitBackForwardCacheExpirationIntervalKey), CFSTR("1800"));
225    CFDictionaryAddValue(defaults, CFSTR(WebKitTabToLinksPreferenceKey), kCFBooleanFalse);
226    CFDictionaryAddValue(defaults, CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), kCFBooleanFalse);
227    CFDictionaryAddValue(defaults, CFSTR(WebKitRespectStandardStyleKeyEquivalentsPreferenceKey), kCFBooleanFalse);
228    CFDictionaryAddValue(defaults, CFSTR(WebKitShowsURLsInToolTipsPreferenceKey), kCFBooleanFalse);
229    CFDictionaryAddValue(defaults, CFSTR(WebKitShowsToolTipOverTruncatedTextPreferenceKey), kCFBooleanFalse);
230    CFDictionaryAddValue(defaults, CFSTR(WebKitPDFDisplayModePreferenceKey), CFSTR("1"));
231    CFDictionaryAddValue(defaults, CFSTR(WebKitPDFScaleFactorPreferenceKey), CFSTR("0"));
232    CFDictionaryAddValue(defaults, CFSTR(WebKitShouldDisplaySubtitlesPreferenceKey), kCFBooleanFalse);
233    CFDictionaryAddValue(defaults, CFSTR(WebKitShouldDisplayCaptionsPreferenceKey), kCFBooleanFalse);
234    CFDictionaryAddValue(defaults, CFSTR(WebKitShouldDisplayTextDescriptionsPreferenceKey), kCFBooleanFalse);
235
236    RetainPtr<CFStringRef> linkBehaviorStringRef = adoptCF(CFStringCreateWithFormat(0, 0, CFSTR("%d"), WebKitEditableLinkDefaultBehavior));
237    CFDictionaryAddValue(defaults, CFSTR(WebKitEditableLinkBehaviorPreferenceKey), linkBehaviorStringRef.get());
238
239    CFDictionaryAddValue(defaults, CFSTR(WebKitHistoryItemLimitKey), CFSTR("1000"));
240    CFDictionaryAddValue(defaults, CFSTR(WebKitHistoryAgeInDaysLimitKey), CFSTR("7"));
241    CFDictionaryAddValue(defaults, CFSTR(WebKitIconDatabaseLocationKey), CFSTR(""));
242    CFDictionaryAddValue(defaults, CFSTR(WebKitIconDatabaseEnabledPreferenceKey), kCFBooleanTrue);
243    CFDictionaryAddValue(defaults, CFSTR(WebKitFontSmoothingTypePreferenceKey), CFSTR("2"));
244    CFDictionaryAddValue(defaults, CFSTR(WebKitFontSmoothingContrastPreferenceKey), CFSTR("2"));
245    CFDictionaryAddValue(defaults, CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), CFSTR("2"));
246    CFDictionaryAddValue(defaults, CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), kCFBooleanFalse);
247    CFDictionaryAddValue(defaults, CFSTR(WebGrammarCheckingEnabledPreferenceKey), kCFBooleanFalse);
248    CFDictionaryAddValue(defaults, CFSTR(AllowContinuousSpellCheckingPreferenceKey), kCFBooleanTrue);
249    CFDictionaryAddValue(defaults, CFSTR(WebKitUsesPageCachePreferenceKey), kCFBooleanTrue);
250    CFDictionaryAddValue(defaults, CFSTR(WebKitLocalStorageDatabasePathPreferenceKey), CFSTR(""));
251
252    RetainPtr<CFStringRef> cacheModelRef = adoptCF(CFStringCreateWithFormat(0, 0, CFSTR("%d"), WebCacheModelDocumentViewer));
253    CFDictionaryAddValue(defaults, CFSTR(WebKitCacheModelPreferenceKey), cacheModelRef.get());
254
255    CFDictionaryAddValue(defaults, CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey), kCFBooleanTrue);
256    CFDictionaryAddValue(defaults, CFSTR(WebKitApplicationChromeModePreferenceKey), kCFBooleanFalse);
257
258    CFDictionaryAddValue(defaults, CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey), kCFBooleanFalse);
259
260    CFDictionaryAddValue(defaults, CFSTR(WebKitPaintNativeControlsPreferenceKey), kCFBooleanTrue);
261
262    CFDictionaryAddValue(defaults, CFSTR(WebKitUseHighResolutionTimersPreferenceKey), kCFBooleanTrue);
263
264#if USE(CG)
265    CFDictionaryAddValue(defaults, CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey), kCFBooleanTrue);
266#else
267    CFDictionaryAddValue(defaults, CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey), kCFBooleanFalse);
268#endif
269
270    CFDictionaryAddValue(defaults, CFSTR(WebKitShowDebugBordersPreferenceKey), kCFBooleanFalse);
271
272    CFDictionaryAddValue(defaults, CFSTR(WebKitDNSPrefetchingEnabledPreferenceKey), kCFBooleanFalse);
273
274    CFDictionaryAddValue(defaults, CFSTR(WebKitHyperlinkAuditingEnabledPreferenceKey), kCFBooleanTrue);
275
276    CFDictionaryAddValue(defaults, CFSTR(WebKitMediaPlaybackRequiresUserGesturePreferenceKey), kCFBooleanFalse);
277    CFDictionaryAddValue(defaults, CFSTR(WebKitMediaPlaybackAllowsInlinePreferenceKey), kCFBooleanTrue);
278
279    CFDictionaryAddValue(defaults, CFSTR(WebKitRequestAnimationFrameEnabledPreferenceKey), kCFBooleanTrue);
280
281    CFDictionaryAddValue(defaults, CFSTR(WebKitFullScreenEnabledPreferenceKey), kCFBooleanFalse);
282
283    CFDictionaryAddValue(defaults, CFSTR(WebKitRequestAnimationFrameEnabledPreferenceKey), kCFBooleanFalse);
284
285    defaultSettings = defaults;
286}
287
288RetainPtr<CFPropertyListRef> WebPreferences::valueForKey(CFStringRef key)
289{
290    RetainPtr<CFPropertyListRef> value = CFDictionaryGetValue(m_privatePrefs.get(), key);
291    if (value)
292        return value;
293
294    value = adoptCF(CFPreferencesCopyAppValue(key, kCFPreferencesCurrentApplication));
295    if (value)
296        return value;
297
298    return CFDictionaryGetValue(defaultSettings, key);
299}
300
301void WebPreferences::setValueForKey(CFStringRef key, CFPropertyListRef value)
302{
303    CFDictionarySetValue(m_privatePrefs.get(), key, value);
304    if (m_autoSaves) {
305        CFPreferencesSetAppValue(key, value, kCFPreferencesCurrentApplication);
306        save();
307    }
308}
309
310BSTR WebPreferences::stringValueForKey(CFStringRef key)
311{
312    RetainPtr<CFPropertyListRef> value = valueForKey(key);
313
314    if (!value || (CFGetTypeID(value.get()) != CFStringGetTypeID()))
315        return 0;
316
317    CFStringRef str = static_cast<CFStringRef>(value.get());
318
319    CFIndex length = CFStringGetLength(str);
320    const UniChar* uniChars = CFStringGetCharactersPtr(str);
321    if (uniChars)
322        return SysAllocStringLen((LPCTSTR)uniChars, length);
323
324    BSTR bstr = SysAllocStringLen(0, length);
325    if (!bstr)
326        return 0;
327
328    if (!CFStringGetCString(str, (char*)bstr, (length+1)*sizeof(WCHAR), kCFStringEncodingUTF16)) {
329        SysFreeString(bstr);
330        return 0;
331    }
332
333    bstr[length] = 0;
334    return bstr;
335}
336
337int WebPreferences::integerValueForKey(CFStringRef key)
338{
339    return numberValueForPreferencesValue<int>(valueForKey(key).get());
340}
341
342BOOL WebPreferences::boolValueForKey(CFStringRef key)
343{
344    return booleanValueForPreferencesValue(valueForKey(key).get());
345}
346
347float WebPreferences::floatValueForKey(CFStringRef key)
348{
349    return numberValueForPreferencesValue<float>(valueForKey(key).get());
350}
351
352LONGLONG WebPreferences::longlongValueForKey(CFStringRef key)
353{
354    return numberValueForPreferencesValue<LONGLONG>(valueForKey(key).get());
355}
356
357void WebPreferences::setStringValue(CFStringRef key, LPCTSTR value)
358{
359    BString val;
360    val.adoptBSTR(stringValueForKey(key));
361    if (val && !wcscmp(val, value))
362        return;
363
364    RetainPtr<CFStringRef> valueRef = adoptCF(CFStringCreateWithCharacters(0, reinterpret_cast<const UniChar*>(value), static_cast<CFIndex>(wcslen(value))));
365    setValueForKey(key, valueRef.get());
366
367    postPreferencesChangesNotification();
368}
369
370void WebPreferences::setIntegerValue(CFStringRef key, int value)
371{
372    if (integerValueForKey(key) == value)
373        return;
374
375    setValueForKey(key, cfNumber(value).get());
376
377    postPreferencesChangesNotification();
378}
379
380void WebPreferences::setFloatValue(CFStringRef key, float value)
381{
382    if (floatValueForKey(key) == value)
383        return;
384
385    setValueForKey(key, cfNumber(value).get());
386
387    postPreferencesChangesNotification();
388}
389
390void WebPreferences::setBoolValue(CFStringRef key, BOOL value)
391{
392    if (boolValueForKey(key) == value)
393        return;
394
395    setValueForKey(key, value ? kCFBooleanTrue : kCFBooleanFalse);
396
397    postPreferencesChangesNotification();
398}
399
400void WebPreferences::setLongLongValue(CFStringRef key, LONGLONG value)
401{
402    if (longlongValueForKey(key) == value)
403        return;
404
405    setValueForKey(key, cfNumber(value).get());
406
407    postPreferencesChangesNotification();
408}
409
410BSTR WebPreferences::webPreferencesChangedNotification()
411{
412    static BSTR webPreferencesChangedNotification = SysAllocString(WebPreferencesChangedNotification);
413    return webPreferencesChangedNotification;
414}
415
416BSTR WebPreferences::webPreferencesRemovedNotification()
417{
418    static BSTR webPreferencesRemovedNotification = SysAllocString(WebPreferencesRemovedNotification);
419    return webPreferencesRemovedNotification;
420}
421
422void WebPreferences::save()
423{
424    CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
425}
426
427void WebPreferences::load()
428{
429    initializeDefaultSettings();
430
431    m_privatePrefs = adoptCF(CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
432
433    migrateWebKitPreferencesToCFPreferences();
434}
435
436void WebPreferences::migrateWebKitPreferencesToCFPreferences()
437{
438    CFStringRef didMigrateKey = CFSTR(WebKitDidMigrateWebKitPreferencesToCFPreferencesPreferenceKey);
439    if (boolValueForKey(didMigrateKey))
440        return;
441    bool oldValue = m_autoSaves;
442    m_autoSaves = true;
443    setBoolValue(didMigrateKey, TRUE);
444    m_autoSaves = oldValue;
445
446    WTF::CString path = oldPreferencesPath().utf8();
447
448    RetainPtr<CFURLRef> urlRef = adoptCF(CFURLCreateFromFileSystemRepresentation(0, reinterpret_cast<const UInt8*>(path.data()), path.length(), false));
449    if (!urlRef)
450        return;
451
452    RetainPtr<CFReadStreamRef> stream = adoptCF(CFReadStreamCreateWithFile(0, urlRef.get()));
453    if (!stream)
454        return;
455
456    if (!CFReadStreamOpen(stream.get()))
457        return;
458
459    CFPropertyListFormat format = kCFPropertyListBinaryFormat_v1_0 | kCFPropertyListXMLFormat_v1_0;
460    RetainPtr<CFPropertyListRef> plist = adoptCF(CFPropertyListCreateFromStream(0, stream.get(), 0, kCFPropertyListMutableContainersAndLeaves, &format, 0));
461    CFReadStreamClose(stream.get());
462
463    if (!plist || CFGetTypeID(plist.get()) != CFDictionaryGetTypeID())
464        return;
465
466    copyWebKitPreferencesToCFPreferences(static_cast<CFDictionaryRef>(plist.get()));
467
468    deleteFile(oldPreferencesPath());
469}
470
471void WebPreferences::copyWebKitPreferencesToCFPreferences(CFDictionaryRef dict)
472{
473    ASSERT_ARG(dict, dict);
474
475    int count = CFDictionaryGetCount(dict);
476    if (count <= 0)
477        return;
478
479    CFStringRef didRemoveDefaultsKey = CFSTR(WebKitDidMigrateDefaultSettingsFromSafari3BetaPreferenceKey);
480    bool omitDefaults = !booleanValueForPreferencesValue(CFDictionaryGetValue(dict, didRemoveDefaultsKey));
481
482    OwnArrayPtr<CFTypeRef> keys = adoptArrayPtr(new CFTypeRef[count]);
483    OwnArrayPtr<CFTypeRef> values = adoptArrayPtr(new CFTypeRef[count]);
484    CFDictionaryGetKeysAndValues(dict, keys.get(), values.get());
485
486    for (int i = 0; i < count; ++i) {
487        if (!keys[i] || !values[i] || CFGetTypeID(keys[i]) != CFStringGetTypeID())
488            continue;
489
490        if (omitDefaults) {
491            CFTypeRef defaultValue = CFDictionaryGetValue(defaultSettings, keys[i]);
492            if (defaultValue && CFEqual(defaultValue, values[i]))
493                continue;
494        }
495
496        setValueForKey(static_cast<CFStringRef>(keys[i]), values[i]);
497    }
498}
499
500// IUnknown -------------------------------------------------------------------
501
502HRESULT STDMETHODCALLTYPE WebPreferences::QueryInterface(REFIID riid, void** ppvObject)
503{
504    *ppvObject = 0;
505    if (IsEqualGUID(riid, IID_IUnknown))
506        *ppvObject = static_cast<IWebPreferences*>(this);
507    else if (IsEqualGUID(riid, IID_IWebPreferences))
508        *ppvObject = static_cast<IWebPreferences*>(this);
509    else if (IsEqualGUID(riid, IID_IWebPreferencesPrivate))
510        *ppvObject = static_cast<IWebPreferencesPrivate*>(this);
511    else if (IsEqualGUID(riid, CLSID_WebPreferences))
512        *ppvObject = this;
513    else
514        return E_NOINTERFACE;
515
516    AddRef();
517    return S_OK;
518}
519
520ULONG STDMETHODCALLTYPE WebPreferences::AddRef(void)
521{
522    return ++m_refCount;
523}
524
525ULONG STDMETHODCALLTYPE WebPreferences::Release(void)
526{
527    ULONG newRef = --m_refCount;
528    if (!newRef)
529        delete(this);
530
531    return newRef;
532}
533
534// IWebPreferences ------------------------------------------------------------
535
536HRESULT STDMETHODCALLTYPE WebPreferences::standardPreferences(
537    /* [retval][out] */ IWebPreferences** standardPreferences)
538{
539    if (!standardPreferences)
540        return E_POINTER;
541    *standardPreferences = sharedStandardPreferences();
542    (*standardPreferences)->AddRef();
543    return S_OK;
544}
545
546HRESULT STDMETHODCALLTYPE WebPreferences::initWithIdentifier(
547        /* [in] */ BSTR anIdentifier,
548        /* [retval][out] */ IWebPreferences** preferences)
549{
550    WebPreferences *instance = getInstanceForIdentifier(anIdentifier);
551    if (instance) {
552        *preferences = instance;
553        instance->AddRef();
554        return S_OK;
555    }
556
557    load();
558
559    *preferences = this;
560    AddRef();
561
562    if (anIdentifier) {
563        m_identifier = anIdentifier;
564        setInstance(this, m_identifier);
565    }
566
567    this->postPreferencesChangesNotification();
568
569    return S_OK;
570}
571
572HRESULT STDMETHODCALLTYPE WebPreferences::identifier(
573    /* [retval][out] */ BSTR* ident)
574{
575    if (!ident)
576        return E_POINTER;
577    *ident = m_identifier ? SysAllocString(m_identifier) : 0;
578    return S_OK;
579}
580
581HRESULT STDMETHODCALLTYPE WebPreferences::standardFontFamily(
582    /* [retval][out] */ BSTR* family)
583{
584    *family = stringValueForKey(CFSTR(WebKitStandardFontPreferenceKey));
585    return (*family) ? S_OK : E_FAIL;
586}
587
588HRESULT STDMETHODCALLTYPE WebPreferences::setStandardFontFamily(
589    /* [in] */ BSTR family)
590{
591    setStringValue(CFSTR(WebKitStandardFontPreferenceKey), family);
592    return S_OK;
593}
594
595HRESULT STDMETHODCALLTYPE WebPreferences::fixedFontFamily(
596    /* [retval][out] */ BSTR* family)
597{
598    *family = stringValueForKey(CFSTR(WebKitFixedFontPreferenceKey));
599    return (*family) ? S_OK : E_FAIL;
600}
601
602HRESULT STDMETHODCALLTYPE WebPreferences::setFixedFontFamily(
603    /* [in] */ BSTR family)
604{
605    setStringValue(CFSTR(WebKitFixedFontPreferenceKey), family);
606    return S_OK;
607}
608
609HRESULT STDMETHODCALLTYPE WebPreferences::serifFontFamily(
610    /* [retval][out] */ BSTR* fontFamily)
611{
612    *fontFamily = stringValueForKey(CFSTR(WebKitSerifFontPreferenceKey));
613    return (*fontFamily) ? S_OK : E_FAIL;
614}
615
616HRESULT STDMETHODCALLTYPE WebPreferences::setSerifFontFamily(
617    /* [in] */ BSTR family)
618{
619    setStringValue(CFSTR(WebKitSerifFontPreferenceKey), family);
620    return S_OK;
621}
622
623HRESULT STDMETHODCALLTYPE WebPreferences::sansSerifFontFamily(
624    /* [retval][out] */ BSTR* family)
625{
626    *family = stringValueForKey(CFSTR(WebKitSansSerifFontPreferenceKey));
627    return (*family) ? S_OK : E_FAIL;
628}
629
630HRESULT STDMETHODCALLTYPE WebPreferences::setSansSerifFontFamily(
631    /* [in] */ BSTR family)
632{
633    setStringValue(CFSTR(WebKitSansSerifFontPreferenceKey), family);
634    return S_OK;
635}
636
637HRESULT STDMETHODCALLTYPE WebPreferences::cursiveFontFamily(
638    /* [retval][out] */ BSTR* family)
639{
640    *family = stringValueForKey(CFSTR(WebKitCursiveFontPreferenceKey));
641    return (*family) ? S_OK : E_FAIL;
642}
643
644HRESULT STDMETHODCALLTYPE WebPreferences::setCursiveFontFamily(
645    /* [in] */ BSTR family)
646{
647    setStringValue(CFSTR(WebKitCursiveFontPreferenceKey), family);
648    return S_OK;
649}
650
651HRESULT STDMETHODCALLTYPE WebPreferences::fantasyFontFamily(
652    /* [retval][out] */ BSTR* family)
653{
654    *family = stringValueForKey(CFSTR(WebKitFantasyFontPreferenceKey));
655    return (*family) ? S_OK : E_FAIL;
656}
657
658HRESULT STDMETHODCALLTYPE WebPreferences::setFantasyFontFamily(
659    /* [in] */ BSTR family)
660{
661    setStringValue(CFSTR(WebKitFantasyFontPreferenceKey), family);
662    return S_OK;
663}
664
665HRESULT STDMETHODCALLTYPE WebPreferences::pictographFontFamily(
666    /* [retval][out] */ BSTR* family)
667{
668    *family = stringValueForKey(CFSTR(WebKitPictographFontPreferenceKey));
669    return (*family) ? S_OK : E_FAIL;
670}
671
672HRESULT STDMETHODCALLTYPE WebPreferences::setPictographFontFamily(
673    /* [in] */ BSTR family)
674{
675    setStringValue(CFSTR(WebKitPictographFontPreferenceKey), family);
676    return S_OK;
677}
678
679HRESULT STDMETHODCALLTYPE WebPreferences::defaultFontSize(
680    /* [retval][out] */ int* fontSize)
681{
682    *fontSize = integerValueForKey(CFSTR(WebKitDefaultFontSizePreferenceKey));
683    return S_OK;
684}
685
686HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFontSize(
687    /* [in] */ int fontSize)
688{
689    setIntegerValue(CFSTR(WebKitDefaultFontSizePreferenceKey), fontSize);
690    return S_OK;
691}
692
693HRESULT STDMETHODCALLTYPE WebPreferences::defaultFixedFontSize(
694    /* [retval][out] */ int* fontSize)
695{
696    *fontSize = integerValueForKey(CFSTR(WebKitDefaultFixedFontSizePreferenceKey));
697    return S_OK;
698}
699
700HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFixedFontSize(
701    /* [in] */ int fontSize)
702{
703    setIntegerValue(CFSTR(WebKitDefaultFixedFontSizePreferenceKey), fontSize);
704    return S_OK;
705}
706
707HRESULT STDMETHODCALLTYPE WebPreferences::minimumFontSize(
708    /* [retval][out] */ int* fontSize)
709{
710    *fontSize = integerValueForKey(CFSTR(WebKitMinimumFontSizePreferenceKey));
711    return S_OK;
712}
713
714HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumFontSize(
715    /* [in] */ int fontSize)
716{
717    setIntegerValue(CFSTR(WebKitMinimumFontSizePreferenceKey), fontSize);
718    return S_OK;
719}
720
721HRESULT STDMETHODCALLTYPE WebPreferences::minimumLogicalFontSize(
722    /* [retval][out] */ int* fontSize)
723{
724    *fontSize = integerValueForKey(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey));
725    return S_OK;
726}
727
728HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumLogicalFontSize(
729    /* [in] */ int fontSize)
730{
731    setIntegerValue(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), fontSize);
732    return S_OK;
733}
734
735HRESULT STDMETHODCALLTYPE WebPreferences::defaultTextEncodingName(
736    /* [retval][out] */ BSTR* name)
737{
738    *name = stringValueForKey(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey));
739    return (*name) ? S_OK : E_FAIL;
740}
741
742HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultTextEncodingName(
743    /* [in] */ BSTR name)
744{
745    setStringValue(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), name);
746    return S_OK;
747}
748
749HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetEnabled(
750    /* [retval][out] */ BOOL* enabled)
751{
752    *enabled = boolValueForKey(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey));
753    return S_OK;
754}
755
756HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetEnabled(
757    /* [in] */ BOOL enabled)
758{
759    setBoolValue(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), enabled);
760    return S_OK;
761}
762
763HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetLocation(
764    /* [retval][out] */ BSTR* location)
765{
766    *location = stringValueForKey(CFSTR(WebKitUserStyleSheetLocationPreferenceKey));
767    return (*location) ? S_OK : E_FAIL;
768}
769
770HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetLocation(
771    /* [in] */ BSTR location)
772{
773    setStringValue(CFSTR(WebKitUserStyleSheetLocationPreferenceKey), location);
774    return S_OK;
775}
776
777HRESULT STDMETHODCALLTYPE WebPreferences::isJavaEnabled(
778    /* [retval][out] */ BOOL* enabled)
779{
780    *enabled = boolValueForKey(CFSTR(WebKitJavaEnabledPreferenceKey));
781    return S_OK;
782}
783
784HRESULT STDMETHODCALLTYPE WebPreferences::setJavaEnabled(
785    /* [in] */ BOOL enabled)
786{
787    setBoolValue(CFSTR(WebKitJavaEnabledPreferenceKey), enabled);
788    return S_OK;
789}
790
791HRESULT STDMETHODCALLTYPE WebPreferences::isJavaScriptEnabled(
792    /* [retval][out] */ BOOL* enabled)
793{
794    *enabled = boolValueForKey(CFSTR(WebKitJavaScriptEnabledPreferenceKey));
795    return S_OK;
796}
797
798HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptEnabled(
799    /* [in] */ BOOL enabled)
800{
801    setBoolValue(CFSTR(WebKitJavaScriptEnabledPreferenceKey), enabled);
802    return S_OK;
803}
804
805HRESULT STDMETHODCALLTYPE WebPreferences::isWebSecurityEnabled(
806    /* [retval][out] */ BOOL* enabled)
807{
808    *enabled = boolValueForKey(CFSTR(WebKitWebSecurityEnabledPreferenceKey));
809    return S_OK;
810}
811
812HRESULT STDMETHODCALLTYPE WebPreferences::setWebSecurityEnabled(
813    /* [in] */ BOOL enabled)
814{
815    setBoolValue(CFSTR(WebKitWebSecurityEnabledPreferenceKey), enabled);
816    return S_OK;
817}
818
819HRESULT STDMETHODCALLTYPE WebPreferences::allowUniversalAccessFromFileURLs(
820    /* [retval][out] */ BOOL* allowAccess)
821{
822    *allowAccess = boolValueForKey(CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey));
823    return S_OK;
824}
825
826HRESULT STDMETHODCALLTYPE WebPreferences::setAllowUniversalAccessFromFileURLs(
827    /* [in] */ BOOL allowAccess)
828{
829    setBoolValue(CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey), allowAccess);
830    return S_OK;
831}
832
833HRESULT STDMETHODCALLTYPE WebPreferences::allowFileAccessFromFileURLs(
834    /* [retval][out] */ BOOL* allowAccess)
835{
836    *allowAccess = boolValueForKey(CFSTR(WebKitAllowFileAccessFromFileURLsPreferenceKey));
837    return S_OK;
838}
839
840HRESULT STDMETHODCALLTYPE WebPreferences::setAllowFileAccessFromFileURLs(
841    /* [in] */ BOOL allowAccess)
842{
843    setBoolValue(CFSTR(WebKitAllowFileAccessFromFileURLsPreferenceKey), allowAccess);
844    return S_OK;
845}
846
847HRESULT STDMETHODCALLTYPE WebPreferences::javaScriptCanAccessClipboard(
848    /* [retval][out] */ BOOL* enabled)
849{
850    *enabled = boolValueForKey(CFSTR(WebKitJavaScriptCanAccessClipboardPreferenceKey));
851    return S_OK;
852}
853
854HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptCanAccessClipboard(
855    /* [in] */ BOOL enabled)
856{
857    setBoolValue(CFSTR(WebKitJavaScriptCanAccessClipboardPreferenceKey), enabled);
858    return S_OK;
859}
860
861HRESULT STDMETHODCALLTYPE WebPreferences::isXSSAuditorEnabled(
862    /* [retval][out] */ BOOL* enabled)
863{
864    *enabled = boolValueForKey(CFSTR(WebKitXSSAuditorEnabledPreferenceKey));
865    return S_OK;
866}
867
868HRESULT STDMETHODCALLTYPE WebPreferences::setXSSAuditorEnabled(
869    /* [in] */ BOOL enabled)
870{
871    setBoolValue(CFSTR(WebKitXSSAuditorEnabledPreferenceKey), enabled);
872    return S_OK;
873}
874
875HRESULT STDMETHODCALLTYPE WebPreferences::isFrameFlatteningEnabled(
876    /* [retval][out] */ BOOL* enabled)
877{
878    *enabled = boolValueForKey(CFSTR(WebKitFrameFlatteningEnabledPreferenceKey));
879    return S_OK;
880}
881
882HRESULT STDMETHODCALLTYPE WebPreferences::setFrameFlatteningEnabled(
883    /* [in] */ BOOL enabled)
884{
885    setBoolValue(CFSTR(WebKitFrameFlatteningEnabledPreferenceKey), enabled);
886    return S_OK;
887}
888
889HRESULT STDMETHODCALLTYPE WebPreferences::javaScriptCanOpenWindowsAutomatically(
890    /* [retval][out] */ BOOL* enabled)
891{
892    *enabled = boolValueForKey(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey));
893    return S_OK;
894}
895
896HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptCanOpenWindowsAutomatically(
897    /* [in] */ BOOL enabled)
898{
899    setBoolValue(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), enabled);
900    return S_OK;
901}
902
903HRESULT STDMETHODCALLTYPE WebPreferences::arePlugInsEnabled(
904    /* [retval][out] */ BOOL* enabled)
905{
906    *enabled = boolValueForKey(CFSTR(WebKitPluginsEnabledPreferenceKey));
907    return S_OK;
908}
909
910HRESULT STDMETHODCALLTYPE WebPreferences::setPlugInsEnabled(
911    /* [in] */ BOOL enabled)
912{
913    setBoolValue(CFSTR(WebKitPluginsEnabledPreferenceKey), enabled);
914    return S_OK;
915}
916
917HRESULT STDMETHODCALLTYPE WebPreferences::isCSSRegionsEnabled(
918    /* [retval][out] */ BOOL* enabled)
919{
920    *enabled = boolValueForKey(CFSTR(WebKitCSSRegionsEnabledPreferenceKey));
921    return S_OK;
922}
923
924HRESULT STDMETHODCALLTYPE WebPreferences::setCSSRegionsEnabled(
925    /* [in] */ BOOL enabled)
926{
927    setBoolValue(CFSTR(WebKitCSSRegionsEnabledPreferenceKey), enabled);
928    return S_OK;
929}
930
931HRESULT STDMETHODCALLTYPE WebPreferences::allowsAnimatedImages(
932    /* [retval][out] */ BOOL* enabled)
933{
934    *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImagesPreferenceKey));
935    return S_OK;
936}
937
938HRESULT STDMETHODCALLTYPE WebPreferences::setAllowsAnimatedImages(
939    /* [in] */ BOOL enabled)
940{
941    setBoolValue(CFSTR(WebKitAllowAnimatedImagesPreferenceKey), enabled);
942    return S_OK;
943}
944
945HRESULT STDMETHODCALLTYPE WebPreferences::allowAnimatedImageLooping(
946    /* [retval][out] */ BOOL* enabled)
947{
948    *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey));
949    return S_OK;
950}
951
952HRESULT STDMETHODCALLTYPE WebPreferences::setAllowAnimatedImageLooping(
953    /* [in] */ BOOL enabled)
954{
955    setBoolValue(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), enabled);
956    return S_OK;
957}
958
959HRESULT STDMETHODCALLTYPE WebPreferences::setLoadsImagesAutomatically(
960    /* [in] */ BOOL enabled)
961{
962    setBoolValue(CFSTR(WebKitDisplayImagesKey), enabled);
963    return S_OK;
964}
965
966HRESULT STDMETHODCALLTYPE WebPreferences::loadsImagesAutomatically(
967    /* [retval][out] */ BOOL* enabled)
968{
969    *enabled = boolValueForKey(CFSTR(WebKitDisplayImagesKey));
970    return S_OK;
971}
972
973HRESULT STDMETHODCALLTYPE WebPreferences::setLoadsSiteIconsIgnoringImageLoadingPreference(
974    /* [in] */ BOOL enabled)
975{
976    setBoolValue(CFSTR(WebKitLoadSiteIconsKey), enabled);
977    return S_OK;
978}
979
980HRESULT STDMETHODCALLTYPE WebPreferences::loadsSiteIconsIgnoringImageLoadingPreference(
981    /* [retval][out] */ BOOL* enabled)
982{
983    *enabled = boolValueForKey(CFSTR(WebKitLoadSiteIconsKey));
984    return S_OK;
985}
986
987HRESULT STDMETHODCALLTYPE WebPreferences::setHixie76WebSocketProtocolEnabled(
988    /* [in] */ BOOL enabled)
989{
990    return S_OK;
991}
992
993HRESULT STDMETHODCALLTYPE WebPreferences::hixie76WebSocketProtocolEnabled(
994    /* [retval][out] */ BOOL* enabled)
995{
996    *enabled = false;
997    return S_OK;
998}
999
1000HRESULT STDMETHODCALLTYPE WebPreferences::setMediaPlaybackRequiresUserGesture(
1001    /* [in] */ BOOL enabled)
1002{
1003    setBoolValue(CFSTR(WebKitMediaPlaybackRequiresUserGesturePreferenceKey), enabled);
1004    return S_OK;
1005}
1006
1007HRESULT STDMETHODCALLTYPE WebPreferences::mediaPlaybackRequiresUserGesture(
1008    /* [retval][out] */ BOOL* enabled)
1009{
1010    *enabled = boolValueForKey(CFSTR(WebKitMediaPlaybackRequiresUserGesturePreferenceKey));
1011    return S_OK;
1012}
1013
1014HRESULT STDMETHODCALLTYPE WebPreferences::setMediaPlaybackAllowsInline(
1015    /* [in] */ BOOL enabled)
1016{
1017    setBoolValue(CFSTR(WebKitMediaPlaybackAllowsInlinePreferenceKey), enabled);
1018    return S_OK;
1019}
1020
1021HRESULT STDMETHODCALLTYPE WebPreferences::mediaPlaybackAllowsInline(
1022    /* [retval][out] */ BOOL* enabled)
1023{
1024    *enabled = boolValueForKey(CFSTR(WebKitMediaPlaybackAllowsInlinePreferenceKey));
1025    return S_OK;
1026}
1027
1028HRESULT STDMETHODCALLTYPE WebPreferences::setAutosaves(
1029    /* [in] */ BOOL enabled)
1030{
1031    m_autoSaves = !!enabled;
1032    return S_OK;
1033}
1034
1035HRESULT STDMETHODCALLTYPE WebPreferences::autosaves(
1036    /* [retval][out] */ BOOL* enabled)
1037{
1038    *enabled = m_autoSaves ? TRUE : FALSE;
1039    return S_OK;
1040}
1041
1042HRESULT STDMETHODCALLTYPE WebPreferences::setShouldPrintBackgrounds(
1043    /* [in] */ BOOL enabled)
1044{
1045    setBoolValue(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), enabled);
1046    return S_OK;
1047}
1048
1049HRESULT STDMETHODCALLTYPE WebPreferences::shouldPrintBackgrounds(
1050    /* [retval][out] */ BOOL* enabled)
1051{
1052    *enabled = boolValueForKey(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey));
1053    return S_OK;
1054}
1055
1056HRESULT STDMETHODCALLTYPE WebPreferences::setPrivateBrowsingEnabled(
1057    /* [in] */ BOOL enabled)
1058{
1059    setBoolValue(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), enabled);
1060    return S_OK;
1061}
1062
1063HRESULT STDMETHODCALLTYPE WebPreferences::privateBrowsingEnabled(
1064    /* [retval][out] */ BOOL* enabled)
1065{
1066    *enabled = boolValueForKey(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey));
1067    return S_OK;
1068}
1069
1070HRESULT STDMETHODCALLTYPE WebPreferences::setTabsToLinks(
1071    /* [in] */ BOOL enabled)
1072{
1073    setBoolValue(CFSTR(WebKitTabToLinksPreferenceKey), enabled);
1074    return S_OK;
1075}
1076
1077HRESULT STDMETHODCALLTYPE WebPreferences::tabsToLinks(
1078    /* [retval][out] */ BOOL* enabled)
1079{
1080    *enabled = boolValueForKey(CFSTR(WebKitTabToLinksPreferenceKey));
1081    return S_OK;
1082}
1083
1084HRESULT STDMETHODCALLTYPE WebPreferences::setUsesPageCache(
1085        /* [in] */ BOOL usesPageCache)
1086{
1087    setBoolValue(CFSTR(WebKitUsesPageCachePreferenceKey), usesPageCache);
1088    return S_OK;
1089}
1090
1091HRESULT STDMETHODCALLTYPE WebPreferences::usesPageCache(
1092    /* [retval][out] */ BOOL* usesPageCache)
1093{
1094    *usesPageCache = boolValueForKey(CFSTR(WebKitUsesPageCachePreferenceKey));
1095    return S_OK;
1096}
1097
1098HRESULT STDMETHODCALLTYPE WebPreferences::textAreasAreResizable(
1099    /* [retval][out] */ BOOL* enabled)
1100{
1101    *enabled = boolValueForKey(CFSTR(WebKitTextAreasAreResizablePreferenceKey));
1102    return S_OK;
1103}
1104
1105HRESULT STDMETHODCALLTYPE WebPreferences::setTextAreasAreResizable(
1106    /* [in] */ BOOL enabled)
1107{
1108    setBoolValue(CFSTR(WebKitTextAreasAreResizablePreferenceKey), enabled);
1109    return S_OK;
1110}
1111
1112HRESULT WebPreferences::historyItemLimit(int* limit)
1113{
1114    *limit = integerValueForKey(CFSTR(WebKitHistoryItemLimitKey));
1115    return S_OK;
1116}
1117
1118HRESULT WebPreferences::setHistoryItemLimit(int limit)
1119{
1120    setIntegerValue(CFSTR(WebKitHistoryItemLimitKey), limit);
1121    return S_OK;
1122}
1123
1124HRESULT WebPreferences::historyAgeInDaysLimit(int* limit)
1125{
1126    *limit = integerValueForKey(CFSTR(WebKitHistoryAgeInDaysLimitKey));
1127    return S_OK;
1128}
1129
1130HRESULT WebPreferences::setHistoryAgeInDaysLimit(int limit)
1131{
1132    setIntegerValue(CFSTR(WebKitHistoryAgeInDaysLimitKey), limit);
1133    return S_OK;
1134}
1135
1136HRESULT WebPreferences::unused1()
1137{
1138    ASSERT_NOT_REACHED();
1139    return E_FAIL;
1140}
1141
1142HRESULT WebPreferences::unused2()
1143{
1144    ASSERT_NOT_REACHED();
1145    return E_FAIL;
1146}
1147
1148HRESULT WebPreferences::iconDatabaseLocation(
1149    /* [out] */ BSTR* location)
1150{
1151    *location = stringValueForKey(CFSTR(WebKitIconDatabaseLocationKey));
1152    return (*location) ? S_OK : E_FAIL;
1153}
1154
1155HRESULT WebPreferences::setIconDatabaseLocation(
1156    /* [in] */ BSTR location)
1157{
1158    setStringValue(CFSTR(WebKitIconDatabaseLocationKey), location);
1159    return S_OK;
1160}
1161
1162HRESULT WebPreferences::iconDatabaseEnabled(BOOL* enabled)//location)
1163{
1164    *enabled = boolValueForKey(CFSTR(WebKitIconDatabaseEnabledPreferenceKey));
1165    return S_OK;
1166}
1167
1168HRESULT WebPreferences::setIconDatabaseEnabled(BOOL enabled )//location)
1169{
1170    setBoolValue(CFSTR(WebKitIconDatabaseEnabledPreferenceKey), enabled);
1171    return S_OK;
1172}
1173
1174HRESULT STDMETHODCALLTYPE WebPreferences::fontSmoothing(
1175    /* [retval][out] */ FontSmoothingType* smoothingType)
1176{
1177    *smoothingType = (FontSmoothingType) integerValueForKey(CFSTR(WebKitFontSmoothingTypePreferenceKey));
1178    return S_OK;
1179}
1180
1181HRESULT STDMETHODCALLTYPE WebPreferences::setFontSmoothing(
1182    /* [in] */ FontSmoothingType smoothingType)
1183{
1184    setIntegerValue(CFSTR(WebKitFontSmoothingTypePreferenceKey), smoothingType);
1185    if (smoothingType == FontSmoothingTypeWindows)
1186        smoothingType = FontSmoothingTypeMedium;
1187#if USE(CG)
1188    wkSetFontSmoothingLevel((int)smoothingType);
1189#endif
1190    return S_OK;
1191}
1192
1193HRESULT STDMETHODCALLTYPE WebPreferences::fontSmoothingContrast(
1194    /* [retval][out] */ float* contrast)
1195{
1196    *contrast = floatValueForKey(CFSTR(WebKitFontSmoothingContrastPreferenceKey));
1197    return S_OK;
1198}
1199
1200HRESULT STDMETHODCALLTYPE WebPreferences::setFontSmoothingContrast(
1201    /* [in] */ float contrast)
1202{
1203    setFloatValue(CFSTR(WebKitFontSmoothingContrastPreferenceKey), contrast);
1204#if USE(CG)
1205    wkSetFontSmoothingContrast(contrast);
1206#endif
1207    return S_OK;
1208}
1209
1210HRESULT STDMETHODCALLTYPE WebPreferences::editableLinkBehavior(
1211    /* [out, retval] */ WebKitEditableLinkBehavior* editableLinkBehavior)
1212{
1213    WebKitEditableLinkBehavior value = (WebKitEditableLinkBehavior) integerValueForKey(CFSTR(WebKitEditableLinkBehaviorPreferenceKey));
1214    switch (value) {
1215        case WebKitEditableLinkDefaultBehavior:
1216        case WebKitEditableLinkAlwaysLive:
1217        case WebKitEditableLinkOnlyLiveWithShiftKey:
1218        case WebKitEditableLinkLiveWhenNotFocused:
1219        case WebKitEditableLinkNeverLive:
1220            *editableLinkBehavior = value;
1221            break;
1222        default: // ensure that a valid result is returned
1223            *editableLinkBehavior = WebKitEditableLinkDefaultBehavior;
1224            break;
1225    }
1226    return S_OK;
1227}
1228
1229HRESULT STDMETHODCALLTYPE WebPreferences::setEditableLinkBehavior(
1230    /* [in] */ WebKitEditableLinkBehavior behavior)
1231{
1232    setIntegerValue(CFSTR(WebKitEditableLinkBehaviorPreferenceKey), behavior);
1233    return S_OK;
1234}
1235
1236HRESULT WebPreferences::unused5()
1237{
1238    ASSERT_NOT_REACHED();
1239    return E_FAIL;
1240}
1241
1242HRESULT WebPreferences::unused6()
1243{
1244    ASSERT_NOT_REACHED();
1245    return E_FAIL;
1246}
1247
1248HRESULT STDMETHODCALLTYPE WebPreferences::hyperlinkAuditingEnabled(
1249    /* [in] */ BOOL* enabled)
1250{
1251    *enabled = boolValueForKey(CFSTR(WebKitHyperlinkAuditingEnabledPreferenceKey));
1252    return S_OK;
1253}
1254
1255HRESULT STDMETHODCALLTYPE WebPreferences::setHyperlinkAuditingEnabled(
1256    /* [retval][out] */ BOOL enabled)
1257{
1258    setBoolValue(CFSTR(WebKitHyperlinkAuditingEnabledPreferenceKey), enabled);
1259    return S_OK;
1260}
1261
1262HRESULT STDMETHODCALLTYPE WebPreferences::cookieStorageAcceptPolicy(
1263        /* [retval][out] */ WebKitCookieStorageAcceptPolicy *acceptPolicy )
1264{
1265    if (!acceptPolicy)
1266        return E_POINTER;
1267
1268    *acceptPolicy = (WebKitCookieStorageAcceptPolicy)integerValueForKey(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey));
1269    return S_OK;
1270}
1271
1272HRESULT STDMETHODCALLTYPE WebPreferences::setCookieStorageAcceptPolicy(
1273        /* [in] */ WebKitCookieStorageAcceptPolicy acceptPolicy)
1274{
1275    setIntegerValue(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), acceptPolicy);
1276    return S_OK;
1277}
1278
1279
1280HRESULT WebPreferences::continuousSpellCheckingEnabled(BOOL* enabled)
1281{
1282    *enabled = boolValueForKey(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey));
1283    return S_OK;
1284}
1285
1286HRESULT WebPreferences::setContinuousSpellCheckingEnabled(BOOL enabled)
1287{
1288    setBoolValue(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), enabled);
1289    return S_OK;
1290}
1291
1292HRESULT WebPreferences::grammarCheckingEnabled(BOOL* enabled)
1293{
1294    *enabled = boolValueForKey(CFSTR(WebGrammarCheckingEnabledPreferenceKey));
1295    return S_OK;
1296}
1297
1298HRESULT WebPreferences::setGrammarCheckingEnabled(BOOL enabled)
1299{
1300    setBoolValue(CFSTR(WebGrammarCheckingEnabledPreferenceKey), enabled);
1301    return S_OK;
1302}
1303
1304HRESULT WebPreferences::allowContinuousSpellChecking(BOOL* enabled)
1305{
1306    *enabled = boolValueForKey(CFSTR(AllowContinuousSpellCheckingPreferenceKey));
1307    return S_OK;
1308}
1309
1310HRESULT WebPreferences::setAllowContinuousSpellChecking(BOOL enabled)
1311{
1312    setBoolValue(CFSTR(AllowContinuousSpellCheckingPreferenceKey), enabled);
1313    return S_OK;
1314}
1315
1316HRESULT WebPreferences::areSeamlessIFramesEnabled(BOOL* enabled)
1317{
1318    *enabled = boolValueForKey(CFSTR(SeamlessIFramesPreferenceKey));
1319    return S_OK;
1320}
1321
1322HRESULT WebPreferences::setSeamlessIFramesEnabled(BOOL enabled)
1323{
1324    setBoolValue(CFSTR(SeamlessIFramesPreferenceKey), enabled);
1325    return S_OK;
1326}
1327
1328HRESULT WebPreferences::isDOMPasteAllowed(BOOL* enabled)
1329{
1330    *enabled = boolValueForKey(CFSTR(WebKitDOMPasteAllowedPreferenceKey));
1331    return S_OK;
1332}
1333
1334HRESULT WebPreferences::setDOMPasteAllowed(BOOL enabled)
1335{
1336    setBoolValue(CFSTR(WebKitDOMPasteAllowedPreferenceKey), enabled);
1337    return S_OK;
1338}
1339
1340HRESULT WebPreferences::cacheModel(WebCacheModel* cacheModel)
1341{
1342    if (!cacheModel)
1343        return E_POINTER;
1344
1345    *cacheModel = (WebCacheModel)integerValueForKey(CFSTR(WebKitCacheModelPreferenceKey));
1346    return S_OK;
1347}
1348
1349HRESULT WebPreferences::setCacheModel(WebCacheModel cacheModel)
1350{
1351    setIntegerValue(CFSTR(WebKitCacheModelPreferenceKey), cacheModel);
1352    return S_OK;
1353}
1354
1355HRESULT WebPreferences::unused3()
1356{
1357    ASSERT_NOT_REACHED();
1358    return E_FAIL;
1359}
1360
1361HRESULT WebPreferences::unused4()
1362{
1363    ASSERT_NOT_REACHED();
1364    return E_FAIL;
1365}
1366
1367HRESULT WebPreferences::shouldPaintNativeControls(BOOL* shouldPaint)
1368{
1369    *shouldPaint = boolValueForKey(CFSTR(WebKitPaintNativeControlsPreferenceKey));
1370    return S_OK;
1371}
1372
1373HRESULT WebPreferences::setShouldPaintNativeControls(BOOL shouldPaint)
1374{
1375    setBoolValue(CFSTR(WebKitPaintNativeControlsPreferenceKey), shouldPaint);
1376    return S_OK;
1377}
1378
1379HRESULT WebPreferences::setDeveloperExtrasEnabled(BOOL enabled)
1380{
1381    setBoolValue(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey), enabled);
1382    return S_OK;
1383}
1384
1385HRESULT WebPreferences::developerExtrasEnabled(BOOL* enabled)
1386{
1387    if (!enabled)
1388        return E_POINTER;
1389
1390    *enabled = boolValueForKey(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey));
1391    return S_OK;
1392}
1393
1394bool WebPreferences::developerExtrasDisabledByOverride()
1395{
1396    return !!boolValueForKey(CFSTR(DisableWebKitDeveloperExtrasPreferenceKey));
1397}
1398
1399HRESULT WebPreferences::setAutomaticallyDetectsCacheModel(BOOL automaticallyDetectsCacheModel)
1400{
1401    m_automaticallyDetectsCacheModel = !!automaticallyDetectsCacheModel;
1402    return S_OK;
1403}
1404
1405HRESULT WebPreferences::automaticallyDetectsCacheModel(BOOL* automaticallyDetectsCacheModel)
1406{
1407    if (!automaticallyDetectsCacheModel)
1408        return E_POINTER;
1409
1410    *automaticallyDetectsCacheModel = m_automaticallyDetectsCacheModel;
1411    return S_OK;
1412}
1413
1414HRESULT STDMETHODCALLTYPE WebPreferences::setAuthorAndUserStylesEnabled(BOOL enabled)
1415{
1416    setBoolValue(CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey), enabled);
1417    return S_OK;
1418}
1419
1420HRESULT STDMETHODCALLTYPE WebPreferences::authorAndUserStylesEnabled(BOOL* enabled)
1421{
1422    if (!enabled)
1423        return E_POINTER;
1424
1425    *enabled = boolValueForKey(CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey));
1426    return S_OK;
1427}
1428
1429HRESULT WebPreferences::inApplicationChromeMode(BOOL* enabled)
1430{
1431    *enabled = boolValueForKey(CFSTR(WebKitApplicationChromeModePreferenceKey));
1432    return S_OK;
1433}
1434
1435HRESULT WebPreferences::setApplicationChromeMode(BOOL enabled)
1436{
1437    setBoolValue(CFSTR(WebKitApplicationChromeModePreferenceKey), enabled);
1438    return S_OK;
1439}
1440
1441HRESULT STDMETHODCALLTYPE WebPreferences::setOfflineWebApplicationCacheEnabled(BOOL enabled)
1442{
1443    setBoolValue(CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey), enabled);
1444    return S_OK;
1445}
1446
1447HRESULT STDMETHODCALLTYPE WebPreferences::offlineWebApplicationCacheEnabled(BOOL* enabled)
1448{
1449    *enabled = boolValueForKey(CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey));
1450    return S_OK;
1451}
1452
1453HRESULT STDMETHODCALLTYPE WebPreferences::setDatabasesEnabled(BOOL enabled)
1454{
1455    setBoolValue(CFSTR(WebKitDatabasesEnabledPreferenceKey), enabled);
1456    return S_OK;
1457}
1458
1459HRESULT STDMETHODCALLTYPE WebPreferences::databasesEnabled(BOOL* enabled)
1460{
1461    *enabled = boolValueForKey(CFSTR(WebKitDatabasesEnabledPreferenceKey));
1462    return S_OK;
1463}
1464
1465HRESULT STDMETHODCALLTYPE WebPreferences::setLocalStorageEnabled(BOOL enabled)
1466{
1467    setBoolValue(CFSTR(WebKitLocalStorageEnabledPreferenceKey), enabled);
1468    return S_OK;
1469}
1470
1471HRESULT STDMETHODCALLTYPE WebPreferences::localStorageEnabled(BOOL* enabled)
1472{
1473    *enabled = boolValueForKey(CFSTR(WebKitLocalStorageEnabledPreferenceKey));
1474    return S_OK;
1475}
1476
1477HRESULT STDMETHODCALLTYPE WebPreferences::localStorageDatabasePath(BSTR* location)
1478{
1479    *location = stringValueForKey(CFSTR(WebKitLocalStorageDatabasePathPreferenceKey));
1480    return (*location) ? S_OK : E_FAIL;
1481}
1482
1483HRESULT STDMETHODCALLTYPE WebPreferences::setLocalStorageDatabasePath(BSTR location)
1484{
1485    setStringValue(CFSTR(WebKitLocalStorageDatabasePathPreferenceKey), location);
1486    return S_OK;
1487}
1488
1489HRESULT STDMETHODCALLTYPE WebPreferences::setExperimentalNotificationsEnabled(BOOL enabled)
1490{
1491    setBoolValue(CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey), enabled);
1492    return S_OK;
1493}
1494
1495HRESULT STDMETHODCALLTYPE WebPreferences::experimentalNotificationsEnabled(BOOL* enabled)
1496{
1497    *enabled = boolValueForKey(CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey));
1498    return S_OK;
1499}
1500
1501HRESULT WebPreferences::setZoomsTextOnly(BOOL zoomsTextOnly)
1502{
1503    setBoolValue(CFSTR(WebKitZoomsTextOnlyPreferenceKey), zoomsTextOnly);
1504    return S_OK;
1505}
1506
1507HRESULT WebPreferences::zoomsTextOnly(BOOL* zoomsTextOnly)
1508{
1509    *zoomsTextOnly = boolValueForKey(CFSTR(WebKitZoomsTextOnlyPreferenceKey));
1510    return S_OK;
1511}
1512
1513HRESULT STDMETHODCALLTYPE WebPreferences::setShouldUseHighResolutionTimers(BOOL useHighResolutionTimers)
1514{
1515    setBoolValue(CFSTR(WebKitUseHighResolutionTimersPreferenceKey), useHighResolutionTimers);
1516    return S_OK;
1517}
1518
1519HRESULT STDMETHODCALLTYPE WebPreferences::shouldUseHighResolutionTimers(BOOL* useHighResolutionTimers)
1520{
1521    *useHighResolutionTimers = boolValueForKey(CFSTR(WebKitUseHighResolutionTimersPreferenceKey));
1522    return S_OK;
1523}
1524
1525HRESULT WebPreferences::setPreferenceForTest(BSTR key, BSTR value)
1526{
1527    if (!SysStringLen(key) || !SysStringLen(value))
1528        return E_FAIL;
1529    RetainPtr<CFStringRef> keyString = adoptCF(CFStringCreateWithCharacters(0, reinterpret_cast<UniChar*>(key), SysStringLen(key)));
1530    RetainPtr<CFStringRef> valueString = adoptCF(CFStringCreateWithCharacters(0, reinterpret_cast<UniChar*>(value), SysStringLen(value)));
1531    setValueForKey(keyString.get(), valueString.get());
1532    postPreferencesChangesNotification();
1533    return S_OK;
1534}
1535
1536HRESULT WebPreferences::setAcceleratedCompositingEnabled(BOOL enabled)
1537{
1538    setBoolValue(CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey), enabled);
1539    return S_OK;
1540}
1541
1542HRESULT WebPreferences::acceleratedCompositingEnabled(BOOL* enabled)
1543{
1544#if USE(ACCELERATED_COMPOSITING)
1545    *enabled = CACFLayerTreeHost::acceleratedCompositingAvailable() && boolValueForKey(CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey));
1546#else
1547    *enabled = FALSE;
1548#endif
1549    return S_OK;
1550}
1551
1552HRESULT WebPreferences::showDebugBorders(BOOL* enabled)
1553{
1554    *enabled = boolValueForKey(CFSTR(WebKitShowDebugBordersPreferenceKey));
1555    return S_OK;
1556}
1557
1558HRESULT WebPreferences::setShowDebugBorders(BOOL enabled)
1559{
1560    setBoolValue(CFSTR(WebKitShowDebugBordersPreferenceKey), enabled);
1561    return S_OK;
1562}
1563
1564HRESULT WebPreferences::showRepaintCounter(BOOL* enabled)
1565{
1566    *enabled = boolValueForKey(CFSTR(WebKitShowRepaintCounterPreferenceKey));
1567    return S_OK;
1568}
1569
1570HRESULT WebPreferences::setShowRepaintCounter(BOOL enabled)
1571{
1572    setBoolValue(CFSTR(WebKitShowRepaintCounterPreferenceKey), enabled);
1573    return S_OK;
1574}
1575
1576HRESULT WebPreferences::setCustomDragCursorsEnabled(BOOL enabled)
1577{
1578    setBoolValue(CFSTR(WebKitCustomDragCursorsEnabledPreferenceKey), enabled);
1579    return S_OK;
1580}
1581
1582HRESULT WebPreferences::customDragCursorsEnabled(BOOL* enabled)
1583{
1584    *enabled = boolValueForKey(CFSTR(WebKitCustomDragCursorsEnabledPreferenceKey));
1585    return S_OK;
1586}
1587
1588HRESULT WebPreferences::setDNSPrefetchingEnabled(BOOL enabled)
1589{
1590    setBoolValue(CFSTR(WebKitDNSPrefetchingEnabledPreferenceKey), enabled);
1591    return S_OK;
1592}
1593
1594HRESULT WebPreferences::isDNSPrefetchingEnabled(BOOL* enabled)
1595{
1596    *enabled = boolValueForKey(CFSTR(WebKitDNSPrefetchingEnabledPreferenceKey));
1597    return S_OK;
1598}
1599
1600HRESULT WebPreferences::isFullScreenEnabled(BOOL* enabled)
1601{
1602#if ENABLE(FULLSCREEN_API)
1603    if (!enabled)
1604        return E_POINTER;
1605
1606    *enabled = boolValueForKey(CFSTR(WebKitFullScreenEnabledPreferenceKey));
1607    return S_OK;
1608#else
1609    return E_NOTIMPL;
1610#endif
1611}
1612
1613HRESULT WebPreferences::setFullScreenEnabled(BOOL enabled)
1614{
1615#if ENABLE(FULLSCREEN_API)
1616    setBoolValue(CFSTR(WebKitFullScreenEnabledPreferenceKey), enabled);
1617    return S_OK;
1618#else
1619    return E_NOTIMPL;
1620#endif
1621}
1622
1623HRESULT WebPreferences::avFoundationEnabled(BOOL* enabled)
1624{
1625#if USE(AVFOUNDATION)
1626    if (!enabled)
1627        return E_POINTER;
1628
1629    *enabled = boolValueForKey(CFSTR(WebKitAVFoundationEnabledPreferenceKey));
1630    return S_OK;
1631#else
1632    return E_NOTIMPL;
1633#endif
1634}
1635
1636HRESULT WebPreferences::setAVFoundationEnabled(BOOL enabled)
1637{
1638#if USE(AVFOUNDATION)
1639    setBoolValue(CFSTR(WebKitAVFoundationEnabledPreferenceKey), enabled);
1640    return S_OK;
1641#else
1642    return E_NOTIMPL;
1643#endif
1644}
1645
1646HRESULT WebPreferences::showsToolTipOverTruncatedText(BOOL* showsToolTip)
1647{
1648    if (!showsToolTip)
1649        return E_POINTER;
1650
1651    *showsToolTip = boolValueForKey(CFSTR(WebKitShowsToolTipOverTruncatedTextPreferenceKey));
1652    return S_OK;
1653}
1654
1655HRESULT WebPreferences::setShowsToolTipOverTruncatedText(BOOL showsToolTip)
1656{
1657    setBoolValue(CFSTR(WebKitShowsToolTipOverTruncatedTextPreferenceKey), showsToolTip);
1658    return S_OK;
1659}
1660
1661HRESULT WebPreferences::shouldInvertColors(BOOL* shouldInvertColors)
1662{
1663    if (!shouldInvertColors)
1664        return E_POINTER;
1665
1666    *shouldInvertColors = boolValueForKey(CFSTR(WebKitShouldInvertColorsPreferenceKey));
1667    return S_OK;
1668}
1669
1670HRESULT WebPreferences::setShouldInvertColors(BOOL shouldInvertColors)
1671{
1672    setBoolValue(CFSTR(WebKitShouldInvertColorsPreferenceKey), shouldInvertColors);
1673    return S_OK;
1674}
1675
1676void WebPreferences::willAddToWebView()
1677{
1678    ++m_numWebViews;
1679}
1680
1681void WebPreferences::didRemoveFromWebView()
1682{
1683    ASSERT(m_numWebViews);
1684    if (--m_numWebViews == 0) {
1685        IWebNotificationCenter* nc = WebNotificationCenter::defaultCenterInternal();
1686        nc->postNotificationName(webPreferencesRemovedNotification(), static_cast<IWebPreferences*>(this), 0);
1687    }
1688}
1689
1690HRESULT WebPreferences::shouldDisplaySubtitles(BOOL* enabled)
1691{
1692#if ENABLE(VIDEO_TRACK)
1693    if (!enabled)
1694        return E_POINTER;
1695
1696    *enabled = boolValueForKey(CFSTR(WebKitShouldDisplaySubtitlesPreferenceKey));
1697    return S_OK;
1698#else
1699    return E_NOTIMPL;
1700#endif
1701}
1702
1703HRESULT WebPreferences::setShouldDisplaySubtitles(BOOL enabled)
1704{
1705#if ENABLE(VIDEO_TRACK)
1706    setBoolValue(CFSTR(WebKitShouldDisplaySubtitlesPreferenceKey), enabled);
1707    return S_OK;
1708#else
1709    return E_NOTIMPL;
1710#endif
1711}
1712
1713HRESULT WebPreferences::shouldDisplayCaptions(BOOL* enabled)
1714{
1715#if ENABLE(VIDEO_TRACK)
1716    if (!enabled)
1717        return E_POINTER;
1718
1719    *enabled = boolValueForKey(CFSTR(WebKitShouldDisplayCaptionsPreferenceKey));
1720    return S_OK;
1721#else
1722    return E_NOTIMPL;
1723#endif
1724}
1725
1726HRESULT WebPreferences::setShouldDisplayCaptions(BOOL enabled)
1727{
1728#if ENABLE(VIDEO_TRACK)
1729    setBoolValue(CFSTR(WebKitShouldDisplayCaptionsPreferenceKey), enabled);
1730    return S_OK;
1731#else
1732    return E_NOTIMPL;
1733#endif
1734}
1735
1736HRESULT WebPreferences::shouldDisplayTextDescriptions(BOOL* enabled)
1737{
1738#if ENABLE(VIDEO_TRACK)
1739    if (!enabled)
1740        return E_POINTER;
1741
1742    *enabled = boolValueForKey(CFSTR(WebKitShouldDisplayTextDescriptionsPreferenceKey));
1743    return S_OK;
1744#else
1745    return E_NOTIMPL;
1746#endif
1747}
1748
1749HRESULT WebPreferences::setShouldDisplayTextDescriptions(BOOL enabled)
1750{
1751#if ENABLE(VIDEO_TRACK)
1752    setBoolValue(CFSTR(WebKitShouldDisplayTextDescriptionsPreferenceKey), enabled);
1753    return S_OK;
1754#else
1755    return E_NOTIMPL;
1756#endif
1757}
1758
1759HRESULT WebPreferences::setRequestAnimationFrameEnabled(BOOL enabled)
1760{
1761    setBoolValue(CFSTR(WebKitRequestAnimationFrameEnabledPreferenceKey), enabled);
1762    return S_OK;
1763}
1764
1765HRESULT WebPreferences::requestAnimationFrameEnabled(BOOL* enabled)
1766{
1767    *enabled = boolValueForKey(CFSTR(WebKitRequestAnimationFrameEnabledPreferenceKey));
1768    return S_OK;
1769}
1770
1771HRESULT WebPreferences::isInheritURIQueryComponentEnabled(BOOL* enabled)
1772{
1773    *enabled = boolValueForKey(CFSTR(WebKitEnableInheritURIQueryComponentPreferenceKey));
1774    return S_OK;
1775}
1776
1777HRESULT WebPreferences::setEnableInheritURIQueryComponent(BOOL enabled)
1778{
1779    setBoolValue(CFSTR(WebKitEnableInheritURIQueryComponentPreferenceKey), enabled);
1780    return S_OK;
1781}
1782