1/*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010 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 "COMPtr.h"
32#include "WebNotificationCenter.h"
33#include "WebPreferenceKeysPrivate.h"
34
35#include <WebCore/CString.h>
36#include <WebCore/FileSystem.h>
37#include <WebCore/Font.h>
38#include <WebCore/PlatformString.h>
39#include <WebCore/StringHash.h>
40#include <WebCore/WKCACFLayerRenderer.h>
41#include "WebLocalizableStrings.h"
42
43#include <CoreFoundation/CoreFoundation.h>
44#include <limits>
45#include <shlobj.h>
46#include <tchar.h>
47#include <wtf/HashMap.h>
48#include <wtf/OwnArrayPtr.h>
49
50#if PLATFORM(CG)
51#include <CoreGraphics/CoreGraphics.h>
52#include <WebKitSystemInterface/WebKitSystemInterface.h>
53#endif
54
55using namespace WebCore;
56using std::numeric_limits;
57
58static const String& oldPreferencesPath()
59{
60    static String path = pathByAppendingComponent(roamingUserSpecificStorageDirectory(), "WebKitPreferences.plist");
61    return path;
62}
63
64template<typename NumberType> struct CFNumberTraits { static const unsigned Type; };
65template<> struct CFNumberTraits<int> { static const unsigned Type = kCFNumberSInt32Type; };
66template<> struct CFNumberTraits<LONGLONG> { static const unsigned Type = kCFNumberLongLongType; };
67template<> struct CFNumberTraits<float> { static const unsigned Type = kCFNumberFloat32Type; };
68
69template<typename NumberType>
70static NumberType numberValueForPreferencesValue(CFPropertyListRef value)
71{
72    if (!value)
73        return 0;
74
75    CFTypeID cfType = CFGetTypeID(value);
76    if (cfType == CFStringGetTypeID())
77        return static_cast<NumberType>(CFStringGetIntValue(static_cast<CFStringRef>(value)));
78    else if (cfType == CFBooleanGetTypeID()) {
79        Boolean boolVal = CFBooleanGetValue(static_cast<CFBooleanRef>(value));
80        return boolVal ? 1 : 0;
81    } else if (cfType == CFNumberGetTypeID()) {
82        NumberType val = 0;
83        CFNumberGetValue(static_cast<CFNumberRef>(value), CFNumberTraits<NumberType>::Type, &val);
84        return val;
85    }
86
87    return 0;
88}
89
90template<typename NumberType>
91static RetainPtr<CFNumberRef> cfNumber(NumberType value)
92{
93    return RetainPtr<CFNumberRef>(AdoptCF, CFNumberCreate(0, CFNumberTraits<NumberType>::Type, &value));
94}
95
96static bool booleanValueForPreferencesValue(CFPropertyListRef value)
97{
98    return numberValueForPreferencesValue<int>(value);
99}
100
101// WebPreferences ----------------------------------------------------------------
102
103static CFDictionaryRef defaultSettings;
104
105static HashMap<WebCore::String, COMPtr<WebPreferences> > webPreferencesInstances;
106
107WebPreferences* WebPreferences::sharedStandardPreferences()
108{
109    static WebPreferences* standardPreferences;
110    if (!standardPreferences) {
111        standardPreferences = WebPreferences::createInstance();
112        standardPreferences->setAutosaves(TRUE);
113        standardPreferences->load();
114    }
115
116    return standardPreferences;
117}
118
119WebPreferences::WebPreferences()
120    : m_refCount(0)
121    , m_autoSaves(0)
122    , m_automaticallyDetectsCacheModel(true)
123    , m_numWebViews(0)
124{
125    gClassCount++;
126    gClassNameCount.add("WebPreferences");
127}
128
129WebPreferences::~WebPreferences()
130{
131    gClassCount--;
132    gClassNameCount.remove("WebPreferences");
133}
134
135WebPreferences* WebPreferences::createInstance()
136{
137    WebPreferences* instance = new WebPreferences();
138    instance->AddRef();
139    return instance;
140}
141
142HRESULT WebPreferences::postPreferencesChangesNotification()
143{
144    IWebNotificationCenter* nc = WebNotificationCenter::defaultCenterInternal();
145    HRESULT hr = nc->postNotificationName(webPreferencesChangedNotification(), static_cast<IWebPreferences*>(this), 0);
146    if (FAILED(hr))
147        return hr;
148
149    return S_OK;
150}
151
152WebPreferences* WebPreferences::getInstanceForIdentifier(BSTR identifier)
153{
154    if (!identifier)
155        return sharedStandardPreferences();
156
157    WebCore::String identifierString(identifier, SysStringLen(identifier));
158    return webPreferencesInstances.get(identifierString).get();
159}
160
161void WebPreferences::setInstance(WebPreferences* instance, BSTR identifier)
162{
163    if (!identifier || !instance)
164        return;
165    WebCore::String identifierString(identifier, SysStringLen(identifier));
166    webPreferencesInstances.add(identifierString, instance);
167}
168
169void WebPreferences::removeReferenceForIdentifier(BSTR identifier)
170{
171    if (!identifier || webPreferencesInstances.isEmpty())
172        return;
173
174    WebCore::String identifierString(identifier, SysStringLen(identifier));
175    WebPreferences* webPreference = webPreferencesInstances.get(identifierString).get();
176    if (webPreference && webPreference->m_refCount == 1)
177        webPreferencesInstances.remove(identifierString);
178}
179
180void WebPreferences::initializeDefaultSettings()
181{
182    if (defaultSettings)
183        return;
184
185    CFMutableDictionaryRef defaults = CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
186
187    CFDictionaryAddValue(defaults, CFSTR(WebKitStandardFontPreferenceKey), CFSTR("Times New Roman"));
188    CFDictionaryAddValue(defaults, CFSTR(WebKitFixedFontPreferenceKey), CFSTR("Courier New"));
189    CFDictionaryAddValue(defaults, CFSTR(WebKitSerifFontPreferenceKey), CFSTR("Times New Roman"));
190    CFDictionaryAddValue(defaults, CFSTR(WebKitSansSerifFontPreferenceKey), CFSTR("Arial"));
191    CFDictionaryAddValue(defaults, CFSTR(WebKitCursiveFontPreferenceKey), CFSTR("Comic Sans MS"));
192    CFDictionaryAddValue(defaults, CFSTR(WebKitFantasyFontPreferenceKey), CFSTR("Comic Sans MS"));
193    CFDictionaryAddValue(defaults, CFSTR(WebKitMinimumFontSizePreferenceKey), CFSTR("1"));
194    CFDictionaryAddValue(defaults, CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), CFSTR("9"));
195    CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultFontSizePreferenceKey), CFSTR("16"));
196    CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultFixedFontSizePreferenceKey), CFSTR("13"));
197    WebCore::String defaultDefaultEncoding(LPCTSTR_UI_STRING("ISO-8859-1", "The default, default character encoding"));
198    CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), defaultDefaultEncoding.createCFString());
199
200    CFDictionaryAddValue(defaults, CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), kCFBooleanFalse);
201    CFDictionaryAddValue(defaults, CFSTR(WebKitUserStyleSheetLocationPreferenceKey), CFSTR(""));
202    CFDictionaryAddValue(defaults, CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), kCFBooleanFalse);
203    CFDictionaryAddValue(defaults, CFSTR(WebKitTextAreasAreResizablePreferenceKey), kCFBooleanFalse);
204    CFDictionaryAddValue(defaults, CFSTR(WebKitJavaEnabledPreferenceKey), kCFBooleanTrue);
205    CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptEnabledPreferenceKey), kCFBooleanTrue);
206    CFDictionaryAddValue(defaults, CFSTR(WebKitWebSecurityEnabledPreferenceKey), kCFBooleanTrue);
207    CFDictionaryAddValue(defaults, CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey), kCFBooleanFalse);
208    CFDictionaryAddValue(defaults, CFSTR(WebKitXSSAuditorEnabledPreferenceKey), kCFBooleanTrue);
209    CFDictionaryAddValue(defaults, CFSTR(WebKitFrameSetFlatteningEnabledPreferenceKey), kCFBooleanFalse);
210    CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), kCFBooleanTrue);
211    CFDictionaryAddValue(defaults, CFSTR(WebKitPluginsEnabledPreferenceKey), kCFBooleanTrue);
212    CFDictionaryAddValue(defaults, CFSTR(WebKitDatabasesEnabledPreferenceKey), kCFBooleanTrue);
213    CFDictionaryAddValue(defaults, CFSTR(WebKitLocalStorageEnabledPreferenceKey), kCFBooleanTrue);
214    CFDictionaryAddValue(defaults, CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey), kCFBooleanFalse);
215    CFDictionaryAddValue(defaults, CFSTR(WebKitZoomsTextOnlyPreferenceKey), kCFBooleanTrue);
216    CFDictionaryAddValue(defaults, CFSTR(WebKitAllowAnimatedImagesPreferenceKey), kCFBooleanTrue);
217    CFDictionaryAddValue(defaults, CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), kCFBooleanTrue);
218    CFDictionaryAddValue(defaults, CFSTR(WebKitDisplayImagesKey), kCFBooleanTrue);
219    CFDictionaryAddValue(defaults, CFSTR(WebKitBackForwardCacheExpirationIntervalKey), CFSTR("1800"));
220    CFDictionaryAddValue(defaults, CFSTR(WebKitTabToLinksPreferenceKey), kCFBooleanFalse);
221    CFDictionaryAddValue(defaults, CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), kCFBooleanFalse);
222    CFDictionaryAddValue(defaults, CFSTR(WebKitRespectStandardStyleKeyEquivalentsPreferenceKey), kCFBooleanFalse);
223    CFDictionaryAddValue(defaults, CFSTR(WebKitShowsURLsInToolTipsPreferenceKey), kCFBooleanFalse);
224    CFDictionaryAddValue(defaults, CFSTR(WebKitPDFDisplayModePreferenceKey), CFSTR("1"));
225    CFDictionaryAddValue(defaults, CFSTR(WebKitPDFScaleFactorPreferenceKey), CFSTR("0"));
226
227    RetainPtr<CFStringRef> linkBehaviorStringRef(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%d"), WebKitEditableLinkDefaultBehavior));
228    CFDictionaryAddValue(defaults, CFSTR(WebKitEditableLinkBehaviorPreferenceKey), linkBehaviorStringRef.get());
229
230    CFDictionaryAddValue(defaults, CFSTR(WebKitHistoryItemLimitKey), CFSTR("1000"));
231    CFDictionaryAddValue(defaults, CFSTR(WebKitHistoryAgeInDaysLimitKey), CFSTR("7"));
232    CFDictionaryAddValue(defaults, CFSTR(WebKitIconDatabaseLocationKey), CFSTR(""));
233    CFDictionaryAddValue(defaults, CFSTR(WebKitIconDatabaseEnabledPreferenceKey), kCFBooleanTrue);
234    CFDictionaryAddValue(defaults, CFSTR(WebKitFontSmoothingTypePreferenceKey), CFSTR("2"));
235    CFDictionaryAddValue(defaults, CFSTR(WebKitFontSmoothingContrastPreferenceKey), CFSTR("2"));
236    CFDictionaryAddValue(defaults, CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), CFSTR("2"));
237    CFDictionaryAddValue(defaults, CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), kCFBooleanFalse);
238    CFDictionaryAddValue(defaults, CFSTR(WebGrammarCheckingEnabledPreferenceKey), kCFBooleanFalse);
239    CFDictionaryAddValue(defaults, CFSTR(AllowContinuousSpellCheckingPreferenceKey), kCFBooleanTrue);
240    CFDictionaryAddValue(defaults, CFSTR(WebKitUsesPageCachePreferenceKey), kCFBooleanTrue);
241    CFDictionaryAddValue(defaults, CFSTR(WebKitLocalStorageDatabasePathPreferenceKey), CFSTR(""));
242
243    RetainPtr<CFStringRef> cacheModelRef(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%d"), WebCacheModelDocumentViewer));
244    CFDictionaryAddValue(defaults, CFSTR(WebKitCacheModelPreferenceKey), cacheModelRef.get());
245
246    CFDictionaryAddValue(defaults, CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey), kCFBooleanTrue);
247    CFDictionaryAddValue(defaults, CFSTR(WebKitApplicationChromeModePreferenceKey), kCFBooleanFalse);
248
249    CFDictionaryAddValue(defaults, CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey), kCFBooleanFalse);
250
251    CFDictionaryAddValue(defaults, CFSTR(WebKitPaintNativeControlsPreferenceKey), kCFBooleanTrue);
252
253    CFDictionaryAddValue(defaults, CFSTR(WebKitUseHighResolutionTimersPreferenceKey), kCFBooleanTrue);
254
255    RetainPtr<CFStringRef> pluginAllowedRunTime(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%u"), numeric_limits<unsigned>::max()));
256    CFDictionaryAddValue(defaults, CFSTR(WebKitPluginAllowedRunTimePreferenceKey), pluginAllowedRunTime.get());
257
258    CFDictionaryAddValue(defaults, CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey), kCFBooleanTrue);
259
260    defaultSettings = defaults;
261}
262
263RetainPtr<CFPropertyListRef> WebPreferences::valueForKey(CFStringRef key)
264{
265    RetainPtr<CFPropertyListRef> value = CFDictionaryGetValue(m_privatePrefs.get(), key);
266    if (value)
267        return value;
268
269    value.adoptCF(CFPreferencesCopyAppValue(key, kCFPreferencesCurrentApplication));
270    if (value)
271        return value;
272
273    return CFDictionaryGetValue(defaultSettings, key);
274}
275
276void WebPreferences::setValueForKey(CFStringRef key, CFPropertyListRef value)
277{
278    CFDictionarySetValue(m_privatePrefs.get(), key, value);
279    if (m_autoSaves) {
280        CFPreferencesSetAppValue(key, value, kCFPreferencesCurrentApplication);
281        save();
282    }
283}
284
285BSTR WebPreferences::stringValueForKey(CFStringRef key)
286{
287    RetainPtr<CFPropertyListRef> value = valueForKey(key);
288
289    if (!value || (CFGetTypeID(value.get()) != CFStringGetTypeID()))
290        return 0;
291
292    CFStringRef str = static_cast<CFStringRef>(value.get());
293
294    CFIndex length = CFStringGetLength(str);
295    const UniChar* uniChars = CFStringGetCharactersPtr(str);
296    if (uniChars)
297        return SysAllocStringLen((LPCTSTR)uniChars, length);
298
299    BSTR bstr = SysAllocStringLen(0, length);
300    if (!bstr)
301        return 0;
302
303    if (!CFStringGetCString(str, (char*)bstr, (length+1)*sizeof(WCHAR), kCFStringEncodingUTF16)) {
304        SysFreeString(bstr);
305        return 0;
306    }
307
308    bstr[length] = 0;
309    return bstr;
310}
311
312int WebPreferences::integerValueForKey(CFStringRef key)
313{
314    return numberValueForPreferencesValue<int>(valueForKey(key).get());
315}
316
317BOOL WebPreferences::boolValueForKey(CFStringRef key)
318{
319    return booleanValueForPreferencesValue(valueForKey(key).get());
320}
321
322float WebPreferences::floatValueForKey(CFStringRef key)
323{
324    return numberValueForPreferencesValue<float>(valueForKey(key).get());
325}
326
327LONGLONG WebPreferences::longlongValueForKey(CFStringRef key)
328{
329    return numberValueForPreferencesValue<LONGLONG>(valueForKey(key).get());
330}
331
332void WebPreferences::setStringValue(CFStringRef key, LPCTSTR value)
333{
334    BSTR val = stringValueForKey(key);
335    if (val && !_tcscmp(val, value))
336        return;
337    SysFreeString(val);
338
339    RetainPtr<CFStringRef> valueRef(AdoptCF,
340        CFStringCreateWithCharactersNoCopy(0, (UniChar*)_wcsdup(value), (CFIndex)_tcslen(value), kCFAllocatorMalloc));
341    setValueForKey(key, valueRef.get());
342
343    postPreferencesChangesNotification();
344}
345
346void WebPreferences::setIntegerValue(CFStringRef key, int value)
347{
348    if (integerValueForKey(key) == value)
349        return;
350
351    setValueForKey(key, cfNumber(value).get());
352
353    postPreferencesChangesNotification();
354}
355
356void WebPreferences::setFloatValue(CFStringRef key, float value)
357{
358    if (floatValueForKey(key) == value)
359        return;
360
361    setValueForKey(key, cfNumber(value).get());
362
363    postPreferencesChangesNotification();
364}
365
366void WebPreferences::setBoolValue(CFStringRef key, BOOL value)
367{
368    if (boolValueForKey(key) == value)
369        return;
370
371    setValueForKey(key, value ? kCFBooleanTrue : kCFBooleanFalse);
372
373    postPreferencesChangesNotification();
374}
375
376void WebPreferences::setLongLongValue(CFStringRef key, LONGLONG value)
377{
378    if (longlongValueForKey(key) == value)
379        return;
380
381    setValueForKey(key, cfNumber(value).get());
382
383    postPreferencesChangesNotification();
384}
385
386BSTR WebPreferences::webPreferencesChangedNotification()
387{
388    static BSTR webPreferencesChangedNotification = SysAllocString(WebPreferencesChangedNotification);
389    return webPreferencesChangedNotification;
390}
391
392BSTR WebPreferences::webPreferencesRemovedNotification()
393{
394    static BSTR webPreferencesRemovedNotification = SysAllocString(WebPreferencesRemovedNotification);
395    return webPreferencesRemovedNotification;
396}
397
398void WebPreferences::save()
399{
400    CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
401}
402
403void WebPreferences::load()
404{
405    initializeDefaultSettings();
406
407    m_privatePrefs.adoptCF(CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
408
409    migrateWebKitPreferencesToCFPreferences();
410}
411
412void WebPreferences::migrateWebKitPreferencesToCFPreferences()
413{
414    CFStringRef didMigrateKey = CFSTR(WebKitDidMigrateWebKitPreferencesToCFPreferencesPreferenceKey);
415    if (boolValueForKey(didMigrateKey))
416        return;
417    bool oldValue = m_autoSaves;
418    m_autoSaves = true;
419    setBoolValue(didMigrateKey, TRUE);
420    m_autoSaves = oldValue;
421
422    CString path = oldPreferencesPath().utf8();
423
424    RetainPtr<CFURLRef> urlRef(AdoptCF, CFURLCreateFromFileSystemRepresentation(0, reinterpret_cast<const UInt8*>(path.data()), path.length(), false));
425    if (!urlRef)
426        return;
427
428    RetainPtr<CFReadStreamRef> stream(AdoptCF, CFReadStreamCreateWithFile(0, urlRef.get()));
429    if (!stream)
430        return;
431
432    if (!CFReadStreamOpen(stream.get()))
433        return;
434
435    CFPropertyListFormat format = kCFPropertyListBinaryFormat_v1_0 | kCFPropertyListXMLFormat_v1_0;
436    RetainPtr<CFPropertyListRef> plist(AdoptCF, CFPropertyListCreateFromStream(0, stream.get(), 0, kCFPropertyListMutableContainersAndLeaves, &format, 0));
437    CFReadStreamClose(stream.get());
438
439    if (!plist || CFGetTypeID(plist.get()) != CFDictionaryGetTypeID())
440        return;
441
442    copyWebKitPreferencesToCFPreferences(static_cast<CFDictionaryRef>(plist.get()));
443
444    deleteFile(oldPreferencesPath());
445}
446
447void WebPreferences::copyWebKitPreferencesToCFPreferences(CFDictionaryRef dict)
448{
449    ASSERT_ARG(dict, dict);
450
451    int count = CFDictionaryGetCount(dict);
452    if (count <= 0)
453        return;
454
455    CFStringRef didRemoveDefaultsKey = CFSTR(WebKitDidMigrateDefaultSettingsFromSafari3BetaPreferenceKey);
456    bool omitDefaults = !booleanValueForPreferencesValue(CFDictionaryGetValue(dict, didRemoveDefaultsKey));
457
458    OwnArrayPtr<CFTypeRef> keys(new CFTypeRef[count]);
459    OwnArrayPtr<CFTypeRef> values(new CFTypeRef[count]);
460    CFDictionaryGetKeysAndValues(dict, keys.get(), values.get());
461
462    for (int i = 0; i < count; ++i) {
463        if (!keys[i] || !values[i] || CFGetTypeID(keys[i]) != CFStringGetTypeID())
464            continue;
465
466        if (omitDefaults) {
467            CFTypeRef defaultValue = CFDictionaryGetValue(defaultSettings, keys[i]);
468            if (defaultValue && CFEqual(defaultValue, values[i]))
469                continue;
470        }
471
472        setValueForKey(static_cast<CFStringRef>(keys[i]), values[i]);
473    }
474}
475
476// IUnknown -------------------------------------------------------------------
477
478HRESULT STDMETHODCALLTYPE WebPreferences::QueryInterface(REFIID riid, void** ppvObject)
479{
480    *ppvObject = 0;
481    if (IsEqualGUID(riid, IID_IUnknown))
482        *ppvObject = static_cast<IWebPreferences*>(this);
483    else if (IsEqualGUID(riid, IID_IWebPreferences))
484        *ppvObject = static_cast<IWebPreferences*>(this);
485    else if (IsEqualGUID(riid, IID_IWebPreferencesPrivate))
486        *ppvObject = static_cast<IWebPreferencesPrivate*>(this);
487    else if (IsEqualGUID(riid, CLSID_WebPreferences))
488        *ppvObject = this;
489    else
490        return E_NOINTERFACE;
491
492    AddRef();
493    return S_OK;
494}
495
496ULONG STDMETHODCALLTYPE WebPreferences::AddRef(void)
497{
498    return ++m_refCount;
499}
500
501ULONG STDMETHODCALLTYPE WebPreferences::Release(void)
502{
503    ULONG newRef = --m_refCount;
504    if (!newRef)
505        delete(this);
506
507    return newRef;
508}
509
510// IWebPreferences ------------------------------------------------------------
511
512HRESULT STDMETHODCALLTYPE WebPreferences::standardPreferences(
513    /* [retval][out] */ IWebPreferences** standardPreferences)
514{
515    if (!standardPreferences)
516        return E_POINTER;
517    *standardPreferences = sharedStandardPreferences();
518    (*standardPreferences)->AddRef();
519    return S_OK;
520}
521
522HRESULT STDMETHODCALLTYPE WebPreferences::initWithIdentifier(
523        /* [in] */ BSTR anIdentifier,
524        /* [retval][out] */ IWebPreferences** preferences)
525{
526    WebPreferences *instance = getInstanceForIdentifier(anIdentifier);
527    if (instance) {
528        *preferences = instance;
529        instance->AddRef();
530        return S_OK;
531    }
532
533    load();
534
535    *preferences = this;
536    AddRef();
537
538    if (anIdentifier) {
539        m_identifier = anIdentifier;
540        setInstance(this, m_identifier);
541    }
542
543    this->postPreferencesChangesNotification();
544
545    return S_OK;
546}
547
548HRESULT STDMETHODCALLTYPE WebPreferences::identifier(
549    /* [retval][out] */ BSTR* ident)
550{
551    if (!ident)
552        return E_POINTER;
553    *ident = m_identifier ? SysAllocString(m_identifier) : 0;
554    return S_OK;
555}
556
557HRESULT STDMETHODCALLTYPE WebPreferences::standardFontFamily(
558    /* [retval][out] */ BSTR* family)
559{
560    *family = stringValueForKey(CFSTR(WebKitStandardFontPreferenceKey));
561    return (*family) ? S_OK : E_FAIL;
562}
563
564HRESULT STDMETHODCALLTYPE WebPreferences::setStandardFontFamily(
565    /* [in] */ BSTR family)
566{
567    setStringValue(CFSTR(WebKitStandardFontPreferenceKey), family);
568    return S_OK;
569}
570
571HRESULT STDMETHODCALLTYPE WebPreferences::fixedFontFamily(
572    /* [retval][out] */ BSTR* family)
573{
574    *family = stringValueForKey(CFSTR(WebKitFixedFontPreferenceKey));
575    return (*family) ? S_OK : E_FAIL;
576}
577
578HRESULT STDMETHODCALLTYPE WebPreferences::setFixedFontFamily(
579    /* [in] */ BSTR family)
580{
581    setStringValue(CFSTR(WebKitFixedFontPreferenceKey), family);
582    return S_OK;
583}
584
585HRESULT STDMETHODCALLTYPE WebPreferences::serifFontFamily(
586    /* [retval][out] */ BSTR* fontFamily)
587{
588    *fontFamily = stringValueForKey(CFSTR(WebKitSerifFontPreferenceKey));
589    return (*fontFamily) ? S_OK : E_FAIL;
590}
591
592HRESULT STDMETHODCALLTYPE WebPreferences::setSerifFontFamily(
593    /* [in] */ BSTR family)
594{
595    setStringValue(CFSTR(WebKitSerifFontPreferenceKey), family);
596    return S_OK;
597}
598
599HRESULT STDMETHODCALLTYPE WebPreferences::sansSerifFontFamily(
600    /* [retval][out] */ BSTR* family)
601{
602    *family = stringValueForKey(CFSTR(WebKitSansSerifFontPreferenceKey));
603    return (*family) ? S_OK : E_FAIL;
604}
605
606HRESULT STDMETHODCALLTYPE WebPreferences::setSansSerifFontFamily(
607    /* [in] */ BSTR family)
608{
609    setStringValue(CFSTR(WebKitSansSerifFontPreferenceKey), family);
610    return S_OK;
611}
612
613HRESULT STDMETHODCALLTYPE WebPreferences::cursiveFontFamily(
614    /* [retval][out] */ BSTR* family)
615{
616    *family = stringValueForKey(CFSTR(WebKitCursiveFontPreferenceKey));
617    return (*family) ? S_OK : E_FAIL;
618}
619
620HRESULT STDMETHODCALLTYPE WebPreferences::setCursiveFontFamily(
621    /* [in] */ BSTR family)
622{
623    setStringValue(CFSTR(WebKitCursiveFontPreferenceKey), family);
624    return S_OK;
625}
626
627HRESULT STDMETHODCALLTYPE WebPreferences::fantasyFontFamily(
628    /* [retval][out] */ BSTR* family)
629{
630    *family = stringValueForKey(CFSTR(WebKitFantasyFontPreferenceKey));
631    return (*family) ? S_OK : E_FAIL;
632}
633
634HRESULT STDMETHODCALLTYPE WebPreferences::setFantasyFontFamily(
635    /* [in] */ BSTR family)
636{
637    setStringValue(CFSTR(WebKitFantasyFontPreferenceKey), family);
638    return S_OK;
639}
640
641HRESULT STDMETHODCALLTYPE WebPreferences::defaultFontSize(
642    /* [retval][out] */ int* fontSize)
643{
644    *fontSize = integerValueForKey(CFSTR(WebKitDefaultFontSizePreferenceKey));
645    return S_OK;
646}
647
648HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFontSize(
649    /* [in] */ int fontSize)
650{
651    setIntegerValue(CFSTR(WebKitDefaultFontSizePreferenceKey), fontSize);
652    return S_OK;
653}
654
655HRESULT STDMETHODCALLTYPE WebPreferences::defaultFixedFontSize(
656    /* [retval][out] */ int* fontSize)
657{
658    *fontSize = integerValueForKey(CFSTR(WebKitDefaultFixedFontSizePreferenceKey));
659    return S_OK;
660}
661
662HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFixedFontSize(
663    /* [in] */ int fontSize)
664{
665    setIntegerValue(CFSTR(WebKitDefaultFixedFontSizePreferenceKey), fontSize);
666    return S_OK;
667}
668
669HRESULT STDMETHODCALLTYPE WebPreferences::minimumFontSize(
670    /* [retval][out] */ int* fontSize)
671{
672    *fontSize = integerValueForKey(CFSTR(WebKitMinimumFontSizePreferenceKey));
673    return S_OK;
674}
675
676HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumFontSize(
677    /* [in] */ int fontSize)
678{
679    setIntegerValue(CFSTR(WebKitMinimumFontSizePreferenceKey), fontSize);
680    return S_OK;
681}
682
683HRESULT STDMETHODCALLTYPE WebPreferences::minimumLogicalFontSize(
684    /* [retval][out] */ int* fontSize)
685{
686    *fontSize = integerValueForKey(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey));
687    return S_OK;
688}
689
690HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumLogicalFontSize(
691    /* [in] */ int fontSize)
692{
693    setIntegerValue(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), fontSize);
694    return S_OK;
695}
696
697HRESULT STDMETHODCALLTYPE WebPreferences::defaultTextEncodingName(
698    /* [retval][out] */ BSTR* name)
699{
700    *name = stringValueForKey(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey));
701    return (*name) ? S_OK : E_FAIL;
702}
703
704HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultTextEncodingName(
705    /* [in] */ BSTR name)
706{
707    setStringValue(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), name);
708    return S_OK;
709}
710
711HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetEnabled(
712    /* [retval][out] */ BOOL* enabled)
713{
714    *enabled = boolValueForKey(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey));
715    return S_OK;
716}
717
718HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetEnabled(
719    /* [in] */ BOOL enabled)
720{
721    setBoolValue(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), enabled);
722    return S_OK;
723}
724
725HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetLocation(
726    /* [retval][out] */ BSTR* location)
727{
728    *location = stringValueForKey(CFSTR(WebKitUserStyleSheetLocationPreferenceKey));
729    return (*location) ? S_OK : E_FAIL;
730}
731
732HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetLocation(
733    /* [in] */ BSTR location)
734{
735    setStringValue(CFSTR(WebKitUserStyleSheetLocationPreferenceKey), location);
736    return S_OK;
737}
738
739HRESULT STDMETHODCALLTYPE WebPreferences::isJavaEnabled(
740    /* [retval][out] */ BOOL* enabled)
741{
742    *enabled = boolValueForKey(CFSTR(WebKitJavaEnabledPreferenceKey));
743    return S_OK;
744}
745
746HRESULT STDMETHODCALLTYPE WebPreferences::setJavaEnabled(
747    /* [in] */ BOOL enabled)
748{
749    setBoolValue(CFSTR(WebKitJavaEnabledPreferenceKey), enabled);
750    return S_OK;
751}
752
753HRESULT STDMETHODCALLTYPE WebPreferences::isJavaScriptEnabled(
754    /* [retval][out] */ BOOL* enabled)
755{
756    *enabled = boolValueForKey(CFSTR(WebKitJavaScriptEnabledPreferenceKey));
757    return S_OK;
758}
759
760HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptEnabled(
761    /* [in] */ BOOL enabled)
762{
763    setBoolValue(CFSTR(WebKitJavaScriptEnabledPreferenceKey), enabled);
764    return S_OK;
765}
766
767HRESULT STDMETHODCALLTYPE WebPreferences::isWebSecurityEnabled(
768    /* [retval][out] */ BOOL* enabled)
769{
770    *enabled = boolValueForKey(CFSTR(WebKitWebSecurityEnabledPreferenceKey));
771    return S_OK;
772}
773
774HRESULT STDMETHODCALLTYPE WebPreferences::setWebSecurityEnabled(
775    /* [in] */ BOOL enabled)
776{
777    setBoolValue(CFSTR(WebKitWebSecurityEnabledPreferenceKey), enabled);
778    return S_OK;
779}
780
781HRESULT STDMETHODCALLTYPE WebPreferences::allowUniversalAccessFromFileURLs(
782    /* [retval][out] */ BOOL* allowAccess)
783{
784    *allowAccess = boolValueForKey(CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey));
785    return S_OK;
786}
787
788HRESULT STDMETHODCALLTYPE WebPreferences::setAllowUniversalAccessFromFileURLs(
789    /* [in] */ BOOL allowAccess)
790{
791    setBoolValue(CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey), allowAccess);
792    return S_OK;
793}
794
795HRESULT STDMETHODCALLTYPE WebPreferences::isXSSAuditorEnabled(
796    /* [retval][out] */ BOOL* enabled)
797{
798    *enabled = boolValueForKey(CFSTR(WebKitXSSAuditorEnabledPreferenceKey));
799    return S_OK;
800}
801
802HRESULT STDMETHODCALLTYPE WebPreferences::setXSSAuditorEnabled(
803    /* [in] */ BOOL enabled)
804{
805    setBoolValue(CFSTR(WebKitXSSAuditorEnabledPreferenceKey), enabled);
806    return S_OK;
807}
808
809HRESULT STDMETHODCALLTYPE WebPreferences::isFrameSetFlatteningEnabled(
810    /* [retval][out] */ BOOL* enabled)
811{
812    *enabled = boolValueForKey(CFSTR(WebKitFrameSetFlatteningEnabledPreferenceKey));
813    return S_OK;
814}
815
816HRESULT STDMETHODCALLTYPE WebPreferences::setFrameSetFlatteningEnabled(
817    /* [in] */ BOOL enabled)
818{
819    setBoolValue(CFSTR(WebKitFrameSetFlatteningEnabledPreferenceKey), enabled);
820    return S_OK;
821}
822
823HRESULT STDMETHODCALLTYPE WebPreferences::javaScriptCanOpenWindowsAutomatically(
824    /* [retval][out] */ BOOL* enabled)
825{
826    *enabled = boolValueForKey(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey));
827    return S_OK;
828}
829
830HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptCanOpenWindowsAutomatically(
831    /* [in] */ BOOL enabled)
832{
833    setBoolValue(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), enabled);
834    return S_OK;
835}
836
837HRESULT STDMETHODCALLTYPE WebPreferences::arePlugInsEnabled(
838    /* [retval][out] */ BOOL* enabled)
839{
840    *enabled = boolValueForKey(CFSTR(WebKitPluginsEnabledPreferenceKey));
841    return S_OK;
842}
843
844HRESULT STDMETHODCALLTYPE WebPreferences::setPlugInsEnabled(
845    /* [in] */ BOOL enabled)
846{
847    setBoolValue(CFSTR(WebKitPluginsEnabledPreferenceKey), enabled);
848    return S_OK;
849}
850
851HRESULT STDMETHODCALLTYPE WebPreferences::allowsAnimatedImages(
852    /* [retval][out] */ BOOL* enabled)
853{
854    *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImagesPreferenceKey));
855    return S_OK;
856}
857
858HRESULT STDMETHODCALLTYPE WebPreferences::setAllowsAnimatedImages(
859    /* [in] */ BOOL enabled)
860{
861    setBoolValue(CFSTR(WebKitAllowAnimatedImagesPreferenceKey), enabled);
862    return S_OK;
863}
864
865HRESULT STDMETHODCALLTYPE WebPreferences::allowAnimatedImageLooping(
866    /* [retval][out] */ BOOL* enabled)
867{
868    *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey));
869    return S_OK;
870}
871
872HRESULT STDMETHODCALLTYPE WebPreferences::setAllowAnimatedImageLooping(
873    /* [in] */ BOOL enabled)
874{
875    setBoolValue(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), enabled);
876    return S_OK;
877}
878
879HRESULT STDMETHODCALLTYPE WebPreferences::setLoadsImagesAutomatically(
880    /* [in] */ BOOL enabled)
881{
882    setBoolValue(CFSTR(WebKitDisplayImagesKey), enabled);
883    return S_OK;
884}
885
886HRESULT STDMETHODCALLTYPE WebPreferences::loadsImagesAutomatically(
887    /* [retval][out] */ BOOL* enabled)
888{
889    *enabled = boolValueForKey(CFSTR(WebKitDisplayImagesKey));
890    return S_OK;
891}
892
893HRESULT STDMETHODCALLTYPE WebPreferences::setAutosaves(
894    /* [in] */ BOOL enabled)
895{
896    m_autoSaves = !!enabled;
897    return S_OK;
898}
899
900HRESULT STDMETHODCALLTYPE WebPreferences::autosaves(
901    /* [retval][out] */ BOOL* enabled)
902{
903    *enabled = m_autoSaves ? TRUE : FALSE;
904    return S_OK;
905}
906
907HRESULT STDMETHODCALLTYPE WebPreferences::setShouldPrintBackgrounds(
908    /* [in] */ BOOL enabled)
909{
910    setBoolValue(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), enabled);
911    return S_OK;
912}
913
914HRESULT STDMETHODCALLTYPE WebPreferences::shouldPrintBackgrounds(
915    /* [retval][out] */ BOOL* enabled)
916{
917    *enabled = boolValueForKey(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey));
918    return S_OK;
919}
920
921HRESULT STDMETHODCALLTYPE WebPreferences::setPrivateBrowsingEnabled(
922    /* [in] */ BOOL enabled)
923{
924    setBoolValue(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), enabled);
925    return S_OK;
926}
927
928HRESULT STDMETHODCALLTYPE WebPreferences::privateBrowsingEnabled(
929    /* [retval][out] */ BOOL* enabled)
930{
931    *enabled = boolValueForKey(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey));
932    return S_OK;
933}
934
935HRESULT STDMETHODCALLTYPE WebPreferences::setTabsToLinks(
936    /* [in] */ BOOL enabled)
937{
938    setBoolValue(CFSTR(WebKitTabToLinksPreferenceKey), enabled);
939    return S_OK;
940}
941
942HRESULT STDMETHODCALLTYPE WebPreferences::tabsToLinks(
943    /* [retval][out] */ BOOL* enabled)
944{
945    *enabled = boolValueForKey(CFSTR(WebKitTabToLinksPreferenceKey));
946    return S_OK;
947}
948
949HRESULT STDMETHODCALLTYPE WebPreferences::setUsesPageCache(
950        /* [in] */ BOOL usesPageCache)
951{
952    setBoolValue(CFSTR(WebKitUsesPageCachePreferenceKey), usesPageCache);
953    return S_OK;
954}
955
956HRESULT STDMETHODCALLTYPE WebPreferences::usesPageCache(
957    /* [retval][out] */ BOOL* usesPageCache)
958{
959    *usesPageCache = boolValueForKey(CFSTR(WebKitUsesPageCachePreferenceKey));
960    return S_OK;
961}
962
963HRESULT STDMETHODCALLTYPE WebPreferences::textAreasAreResizable(
964    /* [retval][out] */ BOOL* enabled)
965{
966    *enabled = boolValueForKey(CFSTR(WebKitTextAreasAreResizablePreferenceKey));
967    return S_OK;
968}
969
970HRESULT STDMETHODCALLTYPE WebPreferences::setTextAreasAreResizable(
971    /* [in] */ BOOL enabled)
972{
973    setBoolValue(CFSTR(WebKitTextAreasAreResizablePreferenceKey), enabled);
974    return S_OK;
975}
976
977HRESULT WebPreferences::historyItemLimit(int* limit)
978{
979    *limit = integerValueForKey(CFSTR(WebKitHistoryItemLimitKey));
980    return S_OK;
981}
982
983HRESULT WebPreferences::setHistoryItemLimit(int limit)
984{
985    setIntegerValue(CFSTR(WebKitHistoryItemLimitKey), limit);
986    return S_OK;
987}
988
989HRESULT WebPreferences::historyAgeInDaysLimit(int* limit)
990{
991    *limit = integerValueForKey(CFSTR(WebKitHistoryAgeInDaysLimitKey));
992    return S_OK;
993}
994
995HRESULT WebPreferences::setHistoryAgeInDaysLimit(int limit)
996{
997    setIntegerValue(CFSTR(WebKitHistoryAgeInDaysLimitKey), limit);
998    return S_OK;
999}
1000
1001HRESULT WebPreferences::unused1()
1002{
1003    ASSERT_NOT_REACHED();
1004    return E_FAIL;
1005}
1006
1007HRESULT WebPreferences::unused2()
1008{
1009    ASSERT_NOT_REACHED();
1010    return E_FAIL;
1011}
1012
1013HRESULT WebPreferences::iconDatabaseLocation(
1014    /* [out] */ BSTR* location)
1015{
1016    *location = stringValueForKey(CFSTR(WebKitIconDatabaseLocationKey));
1017    return (*location) ? S_OK : E_FAIL;
1018}
1019
1020HRESULT WebPreferences::setIconDatabaseLocation(
1021    /* [in] */ BSTR location)
1022{
1023    setStringValue(CFSTR(WebKitIconDatabaseLocationKey), location);
1024    return S_OK;
1025}
1026
1027HRESULT WebPreferences::iconDatabaseEnabled(BOOL* enabled)//location)
1028{
1029    *enabled = boolValueForKey(CFSTR(WebKitIconDatabaseEnabledPreferenceKey));
1030    return S_OK;
1031}
1032
1033HRESULT WebPreferences::setIconDatabaseEnabled(BOOL enabled )//location)
1034{
1035    setBoolValue(CFSTR(WebKitIconDatabaseEnabledPreferenceKey), enabled);
1036    return S_OK;
1037}
1038
1039HRESULT STDMETHODCALLTYPE WebPreferences::fontSmoothing(
1040    /* [retval][out] */ FontSmoothingType* smoothingType)
1041{
1042    *smoothingType = (FontSmoothingType) integerValueForKey(CFSTR(WebKitFontSmoothingTypePreferenceKey));
1043    return S_OK;
1044}
1045
1046HRESULT STDMETHODCALLTYPE WebPreferences::setFontSmoothing(
1047    /* [in] */ FontSmoothingType smoothingType)
1048{
1049    setIntegerValue(CFSTR(WebKitFontSmoothingTypePreferenceKey), smoothingType);
1050    if (smoothingType == FontSmoothingTypeWindows)
1051        smoothingType = FontSmoothingTypeMedium;
1052#if PLATFORM(CG)
1053    wkSetFontSmoothingLevel((int)smoothingType);
1054#endif
1055    return S_OK;
1056}
1057
1058HRESULT STDMETHODCALLTYPE WebPreferences::fontSmoothingContrast(
1059    /* [retval][out] */ float* contrast)
1060{
1061    *contrast = floatValueForKey(CFSTR(WebKitFontSmoothingContrastPreferenceKey));
1062    return S_OK;
1063}
1064
1065HRESULT STDMETHODCALLTYPE WebPreferences::setFontSmoothingContrast(
1066    /* [in] */ float contrast)
1067{
1068    setFloatValue(CFSTR(WebKitFontSmoothingContrastPreferenceKey), contrast);
1069#if PLATFORM(CG)
1070    wkSetFontSmoothingContrast(contrast);
1071#endif
1072    return S_OK;
1073}
1074
1075HRESULT STDMETHODCALLTYPE WebPreferences::editableLinkBehavior(
1076    /* [out, retval] */ WebKitEditableLinkBehavior* editableLinkBehavior)
1077{
1078    WebKitEditableLinkBehavior value = (WebKitEditableLinkBehavior) integerValueForKey(CFSTR(WebKitEditableLinkBehaviorPreferenceKey));
1079    switch (value) {
1080        case WebKitEditableLinkDefaultBehavior:
1081        case WebKitEditableLinkAlwaysLive:
1082        case WebKitEditableLinkOnlyLiveWithShiftKey:
1083        case WebKitEditableLinkLiveWhenNotFocused:
1084        case WebKitEditableLinkNeverLive:
1085            *editableLinkBehavior = value;
1086            break;
1087        default: // ensure that a valid result is returned
1088            *editableLinkBehavior = WebKitEditableLinkDefaultBehavior;
1089            break;
1090    }
1091    return S_OK;
1092}
1093
1094HRESULT STDMETHODCALLTYPE WebPreferences::setEditableLinkBehavior(
1095    /* [in] */ WebKitEditableLinkBehavior behavior)
1096{
1097    setIntegerValue(CFSTR(WebKitEditableLinkBehaviorPreferenceKey), behavior);
1098    return S_OK;
1099}
1100
1101HRESULT STDMETHODCALLTYPE WebPreferences::cookieStorageAcceptPolicy(
1102        /* [retval][out] */ WebKitCookieStorageAcceptPolicy *acceptPolicy )
1103{
1104    if (!acceptPolicy)
1105        return E_POINTER;
1106
1107    *acceptPolicy = (WebKitCookieStorageAcceptPolicy)integerValueForKey(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey));
1108    return S_OK;
1109}
1110
1111HRESULT STDMETHODCALLTYPE WebPreferences::setCookieStorageAcceptPolicy(
1112        /* [in] */ WebKitCookieStorageAcceptPolicy acceptPolicy)
1113{
1114    setIntegerValue(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), acceptPolicy);
1115    return S_OK;
1116}
1117
1118
1119HRESULT WebPreferences::continuousSpellCheckingEnabled(BOOL* enabled)
1120{
1121    *enabled = boolValueForKey(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey));
1122    return S_OK;
1123}
1124
1125HRESULT WebPreferences::setContinuousSpellCheckingEnabled(BOOL enabled)
1126{
1127    setBoolValue(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), enabled);
1128    return S_OK;
1129}
1130
1131HRESULT WebPreferences::grammarCheckingEnabled(BOOL* enabled)
1132{
1133    *enabled = boolValueForKey(CFSTR(WebGrammarCheckingEnabledPreferenceKey));
1134    return S_OK;
1135}
1136
1137HRESULT WebPreferences::setGrammarCheckingEnabled(BOOL enabled)
1138{
1139    setBoolValue(CFSTR(WebGrammarCheckingEnabledPreferenceKey), enabled);
1140    return S_OK;
1141}
1142
1143HRESULT WebPreferences::allowContinuousSpellChecking(BOOL* enabled)
1144{
1145    *enabled = boolValueForKey(CFSTR(AllowContinuousSpellCheckingPreferenceKey));
1146    return S_OK;
1147}
1148
1149HRESULT WebPreferences::setAllowContinuousSpellChecking(BOOL enabled)
1150{
1151    setBoolValue(CFSTR(AllowContinuousSpellCheckingPreferenceKey), enabled);
1152    return S_OK;
1153}
1154
1155HRESULT WebPreferences::isDOMPasteAllowed(BOOL* enabled)
1156{
1157    *enabled = boolValueForKey(CFSTR(WebKitDOMPasteAllowedPreferenceKey));
1158    return S_OK;
1159}
1160
1161HRESULT WebPreferences::setDOMPasteAllowed(BOOL enabled)
1162{
1163    setBoolValue(CFSTR(WebKitDOMPasteAllowedPreferenceKey), enabled);
1164    return S_OK;
1165}
1166
1167HRESULT WebPreferences::cacheModel(WebCacheModel* cacheModel)
1168{
1169    if (!cacheModel)
1170        return E_POINTER;
1171
1172    *cacheModel = (WebCacheModel)integerValueForKey(CFSTR(WebKitCacheModelPreferenceKey));
1173    return S_OK;
1174}
1175
1176HRESULT WebPreferences::setCacheModel(WebCacheModel cacheModel)
1177{
1178    setIntegerValue(CFSTR(WebKitCacheModelPreferenceKey), cacheModel);
1179    return S_OK;
1180}
1181
1182HRESULT WebPreferences::setShouldPaintCustomScrollbars(BOOL shouldPaint)
1183{
1184    setBoolValue(CFSTR(WebKitPaintCustomScrollbarsPreferenceKey), shouldPaint);
1185    return S_OK;
1186}
1187
1188HRESULT WebPreferences::shouldPaintCustomScrollbars(BOOL* shouldPaint)
1189{
1190    *shouldPaint = boolValueForKey(CFSTR(WebKitPaintCustomScrollbarsPreferenceKey));
1191    return S_OK;
1192}
1193
1194HRESULT WebPreferences::shouldPaintNativeControls(BOOL* shouldPaint)
1195{
1196    *shouldPaint = boolValueForKey(CFSTR(WebKitPaintNativeControlsPreferenceKey));
1197    return S_OK;
1198}
1199
1200HRESULT WebPreferences::setShouldPaintNativeControls(BOOL shouldPaint)
1201{
1202    setBoolValue(CFSTR(WebKitPaintNativeControlsPreferenceKey), shouldPaint);
1203    return S_OK;
1204}
1205
1206HRESULT WebPreferences::setDeveloperExtrasEnabled(BOOL enabled)
1207{
1208    setBoolValue(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey), enabled);
1209    return S_OK;
1210}
1211
1212HRESULT WebPreferences::developerExtrasEnabled(BOOL* enabled)
1213{
1214    if (!enabled)
1215        return E_POINTER;
1216
1217    *enabled = boolValueForKey(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey));
1218    return S_OK;
1219}
1220
1221bool WebPreferences::developerExtrasDisabledByOverride()
1222{
1223    return !!boolValueForKey(CFSTR(DisableWebKitDeveloperExtrasPreferenceKey));
1224}
1225
1226HRESULT WebPreferences::setAutomaticallyDetectsCacheModel(BOOL automaticallyDetectsCacheModel)
1227{
1228    m_automaticallyDetectsCacheModel = !!automaticallyDetectsCacheModel;
1229    return S_OK;
1230}
1231
1232HRESULT WebPreferences::automaticallyDetectsCacheModel(BOOL* automaticallyDetectsCacheModel)
1233{
1234    if (!automaticallyDetectsCacheModel)
1235        return E_POINTER;
1236
1237    *automaticallyDetectsCacheModel = m_automaticallyDetectsCacheModel;
1238    return S_OK;
1239}
1240
1241HRESULT STDMETHODCALLTYPE WebPreferences::setAuthorAndUserStylesEnabled(BOOL enabled)
1242{
1243    setBoolValue(CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey), enabled);
1244    return S_OK;
1245}
1246
1247HRESULT STDMETHODCALLTYPE WebPreferences::authorAndUserStylesEnabled(BOOL* enabled)
1248{
1249    if (!enabled)
1250        return E_POINTER;
1251
1252    *enabled = boolValueForKey(CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey));
1253    return S_OK;
1254}
1255
1256HRESULT WebPreferences::inApplicationChromeMode(BOOL* enabled)
1257{
1258    *enabled = boolValueForKey(CFSTR(WebKitApplicationChromeModePreferenceKey));
1259    return S_OK;
1260}
1261
1262HRESULT WebPreferences::setApplicationChromeMode(BOOL enabled)
1263{
1264    setBoolValue(CFSTR(WebKitApplicationChromeModePreferenceKey), enabled);
1265    return S_OK;
1266}
1267
1268HRESULT STDMETHODCALLTYPE WebPreferences::setOfflineWebApplicationCacheEnabled(BOOL enabled)
1269{
1270    setBoolValue(CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey), enabled);
1271    return S_OK;
1272}
1273
1274HRESULT STDMETHODCALLTYPE WebPreferences::offlineWebApplicationCacheEnabled(BOOL* enabled)
1275{
1276    *enabled = boolValueForKey(CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey));
1277    return S_OK;
1278}
1279
1280HRESULT STDMETHODCALLTYPE WebPreferences::setDatabasesEnabled(BOOL enabled)
1281{
1282    setBoolValue(CFSTR(WebKitDatabasesEnabledPreferenceKey), enabled);
1283    return S_OK;
1284}
1285
1286HRESULT STDMETHODCALLTYPE WebPreferences::databasesEnabled(BOOL* enabled)
1287{
1288    *enabled = boolValueForKey(CFSTR(WebKitDatabasesEnabledPreferenceKey));
1289    return S_OK;
1290}
1291
1292HRESULT STDMETHODCALLTYPE WebPreferences::setLocalStorageEnabled(BOOL enabled)
1293{
1294    setBoolValue(CFSTR(WebKitLocalStorageEnabledPreferenceKey), enabled);
1295    return S_OK;
1296}
1297
1298HRESULT STDMETHODCALLTYPE WebPreferences::localStorageEnabled(BOOL* enabled)
1299{
1300    *enabled = boolValueForKey(CFSTR(WebKitLocalStorageEnabledPreferenceKey));
1301    return S_OK;
1302}
1303
1304HRESULT STDMETHODCALLTYPE WebPreferences::localStorageDatabasePath(BSTR* location)
1305{
1306    *location = stringValueForKey(CFSTR(WebKitLocalStorageDatabasePathPreferenceKey));
1307    return (*location) ? S_OK : E_FAIL;
1308}
1309
1310HRESULT STDMETHODCALLTYPE WebPreferences::setLocalStorageDatabasePath(BSTR location)
1311{
1312    setStringValue(CFSTR(WebKitLocalStorageDatabasePathPreferenceKey), location);
1313    return S_OK;
1314}
1315
1316HRESULT STDMETHODCALLTYPE WebPreferences::setExperimentalNotificationsEnabled(BOOL enabled)
1317{
1318    setBoolValue(CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey), enabled);
1319    return S_OK;
1320}
1321
1322HRESULT STDMETHODCALLTYPE WebPreferences::experimentalNotificationsEnabled(BOOL* enabled)
1323{
1324    *enabled = boolValueForKey(CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey));
1325    return S_OK;
1326}
1327
1328HRESULT WebPreferences::setZoomsTextOnly(BOOL zoomsTextOnly)
1329{
1330    setBoolValue(CFSTR(WebKitZoomsTextOnlyPreferenceKey), zoomsTextOnly);
1331    return S_OK;
1332}
1333
1334HRESULT WebPreferences::zoomsTextOnly(BOOL* zoomsTextOnly)
1335{
1336    *zoomsTextOnly = boolValueForKey(CFSTR(WebKitZoomsTextOnlyPreferenceKey));
1337    return S_OK;
1338}
1339
1340HRESULT STDMETHODCALLTYPE WebPreferences::setShouldUseHighResolutionTimers(BOOL useHighResolutionTimers)
1341{
1342    setBoolValue(CFSTR(WebKitUseHighResolutionTimersPreferenceKey), useHighResolutionTimers);
1343    return S_OK;
1344}
1345
1346HRESULT STDMETHODCALLTYPE WebPreferences::shouldUseHighResolutionTimers(BOOL* useHighResolutionTimers)
1347{
1348    *useHighResolutionTimers = boolValueForKey(CFSTR(WebKitUseHighResolutionTimersPreferenceKey));
1349    return S_OK;
1350}
1351
1352HRESULT WebPreferences::setPluginAllowedRunTime(UINT allowedRunTime)
1353{
1354    setIntegerValue(CFSTR(WebKitPluginAllowedRunTimePreferenceKey), allowedRunTime);
1355    return S_OK;
1356}
1357
1358HRESULT WebPreferences::pluginAllowedRunTime(UINT* allowedRunTime)
1359{
1360    *allowedRunTime = integerValueForKey(CFSTR(WebKitPluginAllowedRunTimePreferenceKey));
1361    return S_OK;
1362}
1363
1364HRESULT WebPreferences::setPreferenceForTest(BSTR key, BSTR value)
1365{
1366    if (!SysStringLen(key) || !SysStringLen(value))
1367        return E_FAIL;
1368    RetainPtr<CFStringRef> keyString(AdoptCF, CFStringCreateWithCharacters(0, reinterpret_cast<UniChar*>(key), SysStringLen(key)));
1369    RetainPtr<CFStringRef> valueString(AdoptCF, CFStringCreateWithCharacters(0, reinterpret_cast<UniChar*>(value), SysStringLen(value)));
1370    setValueForKey(keyString.get(), valueString.get());
1371    postPreferencesChangesNotification();
1372    return S_OK;
1373}
1374
1375HRESULT WebPreferences::setAcceleratedCompositingEnabled(BOOL enabled)
1376{
1377    setBoolValue(CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey), enabled);
1378    return S_OK;
1379}
1380
1381HRESULT WebPreferences::acceleratedCompositingEnabled(BOOL* enabled)
1382{
1383#if USE(ACCELERATED_COMPOSITING)
1384    *enabled = WKCACFLayerRenderer::acceleratedCompositingAvailable() && boolValueForKey(CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey));
1385#else
1386    *enabled = FALSE;
1387#endif
1388    return S_OK;
1389}
1390
1391HRESULT WebPreferences::setCustomDragCursorsEnabled(BOOL enabled)
1392{
1393    setBoolValue(CFSTR(WebKitCustomDragCursorsEnabledPreferenceKey), enabled);
1394    return S_OK;
1395}
1396
1397HRESULT WebPreferences::customDragCursorsEnabled(BOOL* enabled)
1398{
1399    *enabled = boolValueForKey(CFSTR(WebKitCustomDragCursorsEnabledPreferenceKey));
1400    return S_OK;
1401}
1402
1403void WebPreferences::willAddToWebView()
1404{
1405    ++m_numWebViews;
1406}
1407
1408void WebPreferences::didRemoveFromWebView()
1409{
1410    ASSERT(m_numWebViews);
1411    if (--m_numWebViews == 0) {
1412        IWebNotificationCenter* nc = WebNotificationCenter::defaultCenterInternal();
1413        nc->postNotificationName(webPreferencesRemovedNotification(), static_cast<IWebPreferences*>(this), 0);
1414    }
1415}
1416