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