• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
55 using namespace WebCore;
56 using std::numeric_limits;
57 
oldPreferencesPath()58 static const String& oldPreferencesPath()
59 {
60     static String path = pathByAppendingComponent(roamingUserSpecificStorageDirectory(), "WebKitPreferences.plist");
61     return path;
62 }
63 
64 template<typename NumberType> struct CFNumberTraits { static const unsigned Type; };
65 template<> struct CFNumberTraits<int> { static const unsigned Type = kCFNumberSInt32Type; };
66 template<> struct CFNumberTraits<LONGLONG> { static const unsigned Type = kCFNumberLongLongType; };
67 template<> struct CFNumberTraits<float> { static const unsigned Type = kCFNumberFloat32Type; };
68 
69 template<typename NumberType>
numberValueForPreferencesValue(CFPropertyListRef value)70 static 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 
90 template<typename NumberType>
cfNumber(NumberType value)91 static RetainPtr<CFNumberRef> cfNumber(NumberType value)
92 {
93     return RetainPtr<CFNumberRef>(AdoptCF, CFNumberCreate(0, CFNumberTraits<NumberType>::Type, &value));
94 }
95 
booleanValueForPreferencesValue(CFPropertyListRef value)96 static bool booleanValueForPreferencesValue(CFPropertyListRef value)
97 {
98     return numberValueForPreferencesValue<int>(value);
99 }
100 
101 // WebPreferences ----------------------------------------------------------------
102 
103 static CFDictionaryRef defaultSettings;
104 
105 static HashMap<WebCore::String, COMPtr<WebPreferences> > webPreferencesInstances;
106 
sharedStandardPreferences()107 WebPreferences* 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 
WebPreferences()119 WebPreferences::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 
~WebPreferences()129 WebPreferences::~WebPreferences()
130 {
131     gClassCount--;
132     gClassNameCount.remove("WebPreferences");
133 }
134 
createInstance()135 WebPreferences* WebPreferences::createInstance()
136 {
137     WebPreferences* instance = new WebPreferences();
138     instance->AddRef();
139     return instance;
140 }
141 
postPreferencesChangesNotification()142 HRESULT 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 
getInstanceForIdentifier(BSTR identifier)152 WebPreferences* 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 
setInstance(WebPreferences * instance,BSTR identifier)161 void 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 
removeReferenceForIdentifier(BSTR identifier)169 void 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 
initializeDefaultSettings()180 void 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 
valueForKey(CFStringRef key)263 RetainPtr<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 
setValueForKey(CFStringRef key,CFPropertyListRef value)276 void 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 
stringValueForKey(CFStringRef key)285 BSTR 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 
integerValueForKey(CFStringRef key)312 int WebPreferences::integerValueForKey(CFStringRef key)
313 {
314     return numberValueForPreferencesValue<int>(valueForKey(key).get());
315 }
316 
boolValueForKey(CFStringRef key)317 BOOL WebPreferences::boolValueForKey(CFStringRef key)
318 {
319     return booleanValueForPreferencesValue(valueForKey(key).get());
320 }
321 
floatValueForKey(CFStringRef key)322 float WebPreferences::floatValueForKey(CFStringRef key)
323 {
324     return numberValueForPreferencesValue<float>(valueForKey(key).get());
325 }
326 
longlongValueForKey(CFStringRef key)327 LONGLONG WebPreferences::longlongValueForKey(CFStringRef key)
328 {
329     return numberValueForPreferencesValue<LONGLONG>(valueForKey(key).get());
330 }
331 
setStringValue(CFStringRef key,LPCTSTR value)332 void 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 
setIntegerValue(CFStringRef key,int value)346 void 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 
setFloatValue(CFStringRef key,float value)356 void 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 
setBoolValue(CFStringRef key,BOOL value)366 void 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 
setLongLongValue(CFStringRef key,LONGLONG value)376 void 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 
webPreferencesChangedNotification()386 BSTR WebPreferences::webPreferencesChangedNotification()
387 {
388     static BSTR webPreferencesChangedNotification = SysAllocString(WebPreferencesChangedNotification);
389     return webPreferencesChangedNotification;
390 }
391 
webPreferencesRemovedNotification()392 BSTR WebPreferences::webPreferencesRemovedNotification()
393 {
394     static BSTR webPreferencesRemovedNotification = SysAllocString(WebPreferencesRemovedNotification);
395     return webPreferencesRemovedNotification;
396 }
397 
save()398 void WebPreferences::save()
399 {
400     CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
401 }
402 
load()403 void WebPreferences::load()
404 {
405     initializeDefaultSettings();
406 
407     m_privatePrefs.adoptCF(CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
408 
409     migrateWebKitPreferencesToCFPreferences();
410 }
411 
migrateWebKitPreferencesToCFPreferences()412 void 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 
copyWebKitPreferencesToCFPreferences(CFDictionaryRef dict)447 void 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 
QueryInterface(REFIID riid,void ** ppvObject)478 HRESULT 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 
AddRef(void)496 ULONG STDMETHODCALLTYPE WebPreferences::AddRef(void)
497 {
498     return ++m_refCount;
499 }
500 
Release(void)501 ULONG 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 
standardPreferences(IWebPreferences ** standardPreferences)512 HRESULT 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 
initWithIdentifier(BSTR anIdentifier,IWebPreferences ** preferences)522 HRESULT 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 
identifier(BSTR * ident)548 HRESULT 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 
standardFontFamily(BSTR * family)557 HRESULT STDMETHODCALLTYPE WebPreferences::standardFontFamily(
558     /* [retval][out] */ BSTR* family)
559 {
560     *family = stringValueForKey(CFSTR(WebKitStandardFontPreferenceKey));
561     return (*family) ? S_OK : E_FAIL;
562 }
563 
setStandardFontFamily(BSTR family)564 HRESULT STDMETHODCALLTYPE WebPreferences::setStandardFontFamily(
565     /* [in] */ BSTR family)
566 {
567     setStringValue(CFSTR(WebKitStandardFontPreferenceKey), family);
568     return S_OK;
569 }
570 
fixedFontFamily(BSTR * family)571 HRESULT STDMETHODCALLTYPE WebPreferences::fixedFontFamily(
572     /* [retval][out] */ BSTR* family)
573 {
574     *family = stringValueForKey(CFSTR(WebKitFixedFontPreferenceKey));
575     return (*family) ? S_OK : E_FAIL;
576 }
577 
setFixedFontFamily(BSTR family)578 HRESULT STDMETHODCALLTYPE WebPreferences::setFixedFontFamily(
579     /* [in] */ BSTR family)
580 {
581     setStringValue(CFSTR(WebKitFixedFontPreferenceKey), family);
582     return S_OK;
583 }
584 
serifFontFamily(BSTR * fontFamily)585 HRESULT STDMETHODCALLTYPE WebPreferences::serifFontFamily(
586     /* [retval][out] */ BSTR* fontFamily)
587 {
588     *fontFamily = stringValueForKey(CFSTR(WebKitSerifFontPreferenceKey));
589     return (*fontFamily) ? S_OK : E_FAIL;
590 }
591 
setSerifFontFamily(BSTR family)592 HRESULT STDMETHODCALLTYPE WebPreferences::setSerifFontFamily(
593     /* [in] */ BSTR family)
594 {
595     setStringValue(CFSTR(WebKitSerifFontPreferenceKey), family);
596     return S_OK;
597 }
598 
sansSerifFontFamily(BSTR * family)599 HRESULT STDMETHODCALLTYPE WebPreferences::sansSerifFontFamily(
600     /* [retval][out] */ BSTR* family)
601 {
602     *family = stringValueForKey(CFSTR(WebKitSansSerifFontPreferenceKey));
603     return (*family) ? S_OK : E_FAIL;
604 }
605 
setSansSerifFontFamily(BSTR family)606 HRESULT STDMETHODCALLTYPE WebPreferences::setSansSerifFontFamily(
607     /* [in] */ BSTR family)
608 {
609     setStringValue(CFSTR(WebKitSansSerifFontPreferenceKey), family);
610     return S_OK;
611 }
612 
cursiveFontFamily(BSTR * family)613 HRESULT STDMETHODCALLTYPE WebPreferences::cursiveFontFamily(
614     /* [retval][out] */ BSTR* family)
615 {
616     *family = stringValueForKey(CFSTR(WebKitCursiveFontPreferenceKey));
617     return (*family) ? S_OK : E_FAIL;
618 }
619 
setCursiveFontFamily(BSTR family)620 HRESULT STDMETHODCALLTYPE WebPreferences::setCursiveFontFamily(
621     /* [in] */ BSTR family)
622 {
623     setStringValue(CFSTR(WebKitCursiveFontPreferenceKey), family);
624     return S_OK;
625 }
626 
fantasyFontFamily(BSTR * family)627 HRESULT STDMETHODCALLTYPE WebPreferences::fantasyFontFamily(
628     /* [retval][out] */ BSTR* family)
629 {
630     *family = stringValueForKey(CFSTR(WebKitFantasyFontPreferenceKey));
631     return (*family) ? S_OK : E_FAIL;
632 }
633 
setFantasyFontFamily(BSTR family)634 HRESULT STDMETHODCALLTYPE WebPreferences::setFantasyFontFamily(
635     /* [in] */ BSTR family)
636 {
637     setStringValue(CFSTR(WebKitFantasyFontPreferenceKey), family);
638     return S_OK;
639 }
640 
defaultFontSize(int * fontSize)641 HRESULT STDMETHODCALLTYPE WebPreferences::defaultFontSize(
642     /* [retval][out] */ int* fontSize)
643 {
644     *fontSize = integerValueForKey(CFSTR(WebKitDefaultFontSizePreferenceKey));
645     return S_OK;
646 }
647 
setDefaultFontSize(int fontSize)648 HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFontSize(
649     /* [in] */ int fontSize)
650 {
651     setIntegerValue(CFSTR(WebKitDefaultFontSizePreferenceKey), fontSize);
652     return S_OK;
653 }
654 
defaultFixedFontSize(int * fontSize)655 HRESULT STDMETHODCALLTYPE WebPreferences::defaultFixedFontSize(
656     /* [retval][out] */ int* fontSize)
657 {
658     *fontSize = integerValueForKey(CFSTR(WebKitDefaultFixedFontSizePreferenceKey));
659     return S_OK;
660 }
661 
setDefaultFixedFontSize(int fontSize)662 HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFixedFontSize(
663     /* [in] */ int fontSize)
664 {
665     setIntegerValue(CFSTR(WebKitDefaultFixedFontSizePreferenceKey), fontSize);
666     return S_OK;
667 }
668 
minimumFontSize(int * fontSize)669 HRESULT STDMETHODCALLTYPE WebPreferences::minimumFontSize(
670     /* [retval][out] */ int* fontSize)
671 {
672     *fontSize = integerValueForKey(CFSTR(WebKitMinimumFontSizePreferenceKey));
673     return S_OK;
674 }
675 
setMinimumFontSize(int fontSize)676 HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumFontSize(
677     /* [in] */ int fontSize)
678 {
679     setIntegerValue(CFSTR(WebKitMinimumFontSizePreferenceKey), fontSize);
680     return S_OK;
681 }
682 
minimumLogicalFontSize(int * fontSize)683 HRESULT STDMETHODCALLTYPE WebPreferences::minimumLogicalFontSize(
684     /* [retval][out] */ int* fontSize)
685 {
686     *fontSize = integerValueForKey(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey));
687     return S_OK;
688 }
689 
setMinimumLogicalFontSize(int fontSize)690 HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumLogicalFontSize(
691     /* [in] */ int fontSize)
692 {
693     setIntegerValue(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), fontSize);
694     return S_OK;
695 }
696 
defaultTextEncodingName(BSTR * name)697 HRESULT STDMETHODCALLTYPE WebPreferences::defaultTextEncodingName(
698     /* [retval][out] */ BSTR* name)
699 {
700     *name = stringValueForKey(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey));
701     return (*name) ? S_OK : E_FAIL;
702 }
703 
setDefaultTextEncodingName(BSTR name)704 HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultTextEncodingName(
705     /* [in] */ BSTR name)
706 {
707     setStringValue(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), name);
708     return S_OK;
709 }
710 
userStyleSheetEnabled(BOOL * enabled)711 HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetEnabled(
712     /* [retval][out] */ BOOL* enabled)
713 {
714     *enabled = boolValueForKey(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey));
715     return S_OK;
716 }
717 
setUserStyleSheetEnabled(BOOL enabled)718 HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetEnabled(
719     /* [in] */ BOOL enabled)
720 {
721     setBoolValue(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), enabled);
722     return S_OK;
723 }
724 
userStyleSheetLocation(BSTR * location)725 HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetLocation(
726     /* [retval][out] */ BSTR* location)
727 {
728     *location = stringValueForKey(CFSTR(WebKitUserStyleSheetLocationPreferenceKey));
729     return (*location) ? S_OK : E_FAIL;
730 }
731 
setUserStyleSheetLocation(BSTR location)732 HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetLocation(
733     /* [in] */ BSTR location)
734 {
735     setStringValue(CFSTR(WebKitUserStyleSheetLocationPreferenceKey), location);
736     return S_OK;
737 }
738 
isJavaEnabled(BOOL * enabled)739 HRESULT STDMETHODCALLTYPE WebPreferences::isJavaEnabled(
740     /* [retval][out] */ BOOL* enabled)
741 {
742     *enabled = boolValueForKey(CFSTR(WebKitJavaEnabledPreferenceKey));
743     return S_OK;
744 }
745 
setJavaEnabled(BOOL enabled)746 HRESULT STDMETHODCALLTYPE WebPreferences::setJavaEnabled(
747     /* [in] */ BOOL enabled)
748 {
749     setBoolValue(CFSTR(WebKitJavaEnabledPreferenceKey), enabled);
750     return S_OK;
751 }
752 
isJavaScriptEnabled(BOOL * enabled)753 HRESULT STDMETHODCALLTYPE WebPreferences::isJavaScriptEnabled(
754     /* [retval][out] */ BOOL* enabled)
755 {
756     *enabled = boolValueForKey(CFSTR(WebKitJavaScriptEnabledPreferenceKey));
757     return S_OK;
758 }
759 
setJavaScriptEnabled(BOOL enabled)760 HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptEnabled(
761     /* [in] */ BOOL enabled)
762 {
763     setBoolValue(CFSTR(WebKitJavaScriptEnabledPreferenceKey), enabled);
764     return S_OK;
765 }
766 
isWebSecurityEnabled(BOOL * enabled)767 HRESULT STDMETHODCALLTYPE WebPreferences::isWebSecurityEnabled(
768     /* [retval][out] */ BOOL* enabled)
769 {
770     *enabled = boolValueForKey(CFSTR(WebKitWebSecurityEnabledPreferenceKey));
771     return S_OK;
772 }
773 
setWebSecurityEnabled(BOOL enabled)774 HRESULT STDMETHODCALLTYPE WebPreferences::setWebSecurityEnabled(
775     /* [in] */ BOOL enabled)
776 {
777     setBoolValue(CFSTR(WebKitWebSecurityEnabledPreferenceKey), enabled);
778     return S_OK;
779 }
780 
allowUniversalAccessFromFileURLs(BOOL * allowAccess)781 HRESULT STDMETHODCALLTYPE WebPreferences::allowUniversalAccessFromFileURLs(
782     /* [retval][out] */ BOOL* allowAccess)
783 {
784     *allowAccess = boolValueForKey(CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey));
785     return S_OK;
786 }
787 
setAllowUniversalAccessFromFileURLs(BOOL allowAccess)788 HRESULT STDMETHODCALLTYPE WebPreferences::setAllowUniversalAccessFromFileURLs(
789     /* [in] */ BOOL allowAccess)
790 {
791     setBoolValue(CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey), allowAccess);
792     return S_OK;
793 }
794 
isXSSAuditorEnabled(BOOL * enabled)795 HRESULT STDMETHODCALLTYPE WebPreferences::isXSSAuditorEnabled(
796     /* [retval][out] */ BOOL* enabled)
797 {
798     *enabled = boolValueForKey(CFSTR(WebKitXSSAuditorEnabledPreferenceKey));
799     return S_OK;
800 }
801 
setXSSAuditorEnabled(BOOL enabled)802 HRESULT STDMETHODCALLTYPE WebPreferences::setXSSAuditorEnabled(
803     /* [in] */ BOOL enabled)
804 {
805     setBoolValue(CFSTR(WebKitXSSAuditorEnabledPreferenceKey), enabled);
806     return S_OK;
807 }
808 
isFrameSetFlatteningEnabled(BOOL * enabled)809 HRESULT STDMETHODCALLTYPE WebPreferences::isFrameSetFlatteningEnabled(
810     /* [retval][out] */ BOOL* enabled)
811 {
812     *enabled = boolValueForKey(CFSTR(WebKitFrameSetFlatteningEnabledPreferenceKey));
813     return S_OK;
814 }
815 
setFrameSetFlatteningEnabled(BOOL enabled)816 HRESULT STDMETHODCALLTYPE WebPreferences::setFrameSetFlatteningEnabled(
817     /* [in] */ BOOL enabled)
818 {
819     setBoolValue(CFSTR(WebKitFrameSetFlatteningEnabledPreferenceKey), enabled);
820     return S_OK;
821 }
822 
javaScriptCanOpenWindowsAutomatically(BOOL * enabled)823 HRESULT STDMETHODCALLTYPE WebPreferences::javaScriptCanOpenWindowsAutomatically(
824     /* [retval][out] */ BOOL* enabled)
825 {
826     *enabled = boolValueForKey(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey));
827     return S_OK;
828 }
829 
setJavaScriptCanOpenWindowsAutomatically(BOOL enabled)830 HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptCanOpenWindowsAutomatically(
831     /* [in] */ BOOL enabled)
832 {
833     setBoolValue(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), enabled);
834     return S_OK;
835 }
836 
arePlugInsEnabled(BOOL * enabled)837 HRESULT STDMETHODCALLTYPE WebPreferences::arePlugInsEnabled(
838     /* [retval][out] */ BOOL* enabled)
839 {
840     *enabled = boolValueForKey(CFSTR(WebKitPluginsEnabledPreferenceKey));
841     return S_OK;
842 }
843 
setPlugInsEnabled(BOOL enabled)844 HRESULT STDMETHODCALLTYPE WebPreferences::setPlugInsEnabled(
845     /* [in] */ BOOL enabled)
846 {
847     setBoolValue(CFSTR(WebKitPluginsEnabledPreferenceKey), enabled);
848     return S_OK;
849 }
850 
allowsAnimatedImages(BOOL * enabled)851 HRESULT STDMETHODCALLTYPE WebPreferences::allowsAnimatedImages(
852     /* [retval][out] */ BOOL* enabled)
853 {
854     *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImagesPreferenceKey));
855     return S_OK;
856 }
857 
setAllowsAnimatedImages(BOOL enabled)858 HRESULT STDMETHODCALLTYPE WebPreferences::setAllowsAnimatedImages(
859     /* [in] */ BOOL enabled)
860 {
861     setBoolValue(CFSTR(WebKitAllowAnimatedImagesPreferenceKey), enabled);
862     return S_OK;
863 }
864 
allowAnimatedImageLooping(BOOL * enabled)865 HRESULT STDMETHODCALLTYPE WebPreferences::allowAnimatedImageLooping(
866     /* [retval][out] */ BOOL* enabled)
867 {
868     *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey));
869     return S_OK;
870 }
871 
setAllowAnimatedImageLooping(BOOL enabled)872 HRESULT STDMETHODCALLTYPE WebPreferences::setAllowAnimatedImageLooping(
873     /* [in] */ BOOL enabled)
874 {
875     setBoolValue(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), enabled);
876     return S_OK;
877 }
878 
setLoadsImagesAutomatically(BOOL enabled)879 HRESULT STDMETHODCALLTYPE WebPreferences::setLoadsImagesAutomatically(
880     /* [in] */ BOOL enabled)
881 {
882     setBoolValue(CFSTR(WebKitDisplayImagesKey), enabled);
883     return S_OK;
884 }
885 
loadsImagesAutomatically(BOOL * enabled)886 HRESULT STDMETHODCALLTYPE WebPreferences::loadsImagesAutomatically(
887     /* [retval][out] */ BOOL* enabled)
888 {
889     *enabled = boolValueForKey(CFSTR(WebKitDisplayImagesKey));
890     return S_OK;
891 }
892 
setAutosaves(BOOL enabled)893 HRESULT STDMETHODCALLTYPE WebPreferences::setAutosaves(
894     /* [in] */ BOOL enabled)
895 {
896     m_autoSaves = !!enabled;
897     return S_OK;
898 }
899 
autosaves(BOOL * enabled)900 HRESULT STDMETHODCALLTYPE WebPreferences::autosaves(
901     /* [retval][out] */ BOOL* enabled)
902 {
903     *enabled = m_autoSaves ? TRUE : FALSE;
904     return S_OK;
905 }
906 
setShouldPrintBackgrounds(BOOL enabled)907 HRESULT STDMETHODCALLTYPE WebPreferences::setShouldPrintBackgrounds(
908     /* [in] */ BOOL enabled)
909 {
910     setBoolValue(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), enabled);
911     return S_OK;
912 }
913 
shouldPrintBackgrounds(BOOL * enabled)914 HRESULT STDMETHODCALLTYPE WebPreferences::shouldPrintBackgrounds(
915     /* [retval][out] */ BOOL* enabled)
916 {
917     *enabled = boolValueForKey(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey));
918     return S_OK;
919 }
920 
setPrivateBrowsingEnabled(BOOL enabled)921 HRESULT STDMETHODCALLTYPE WebPreferences::setPrivateBrowsingEnabled(
922     /* [in] */ BOOL enabled)
923 {
924     setBoolValue(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), enabled);
925     return S_OK;
926 }
927 
privateBrowsingEnabled(BOOL * enabled)928 HRESULT STDMETHODCALLTYPE WebPreferences::privateBrowsingEnabled(
929     /* [retval][out] */ BOOL* enabled)
930 {
931     *enabled = boolValueForKey(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey));
932     return S_OK;
933 }
934 
setTabsToLinks(BOOL enabled)935 HRESULT STDMETHODCALLTYPE WebPreferences::setTabsToLinks(
936     /* [in] */ BOOL enabled)
937 {
938     setBoolValue(CFSTR(WebKitTabToLinksPreferenceKey), enabled);
939     return S_OK;
940 }
941 
tabsToLinks(BOOL * enabled)942 HRESULT STDMETHODCALLTYPE WebPreferences::tabsToLinks(
943     /* [retval][out] */ BOOL* enabled)
944 {
945     *enabled = boolValueForKey(CFSTR(WebKitTabToLinksPreferenceKey));
946     return S_OK;
947 }
948 
setUsesPageCache(BOOL usesPageCache)949 HRESULT STDMETHODCALLTYPE WebPreferences::setUsesPageCache(
950         /* [in] */ BOOL usesPageCache)
951 {
952     setBoolValue(CFSTR(WebKitUsesPageCachePreferenceKey), usesPageCache);
953     return S_OK;
954 }
955 
usesPageCache(BOOL * usesPageCache)956 HRESULT STDMETHODCALLTYPE WebPreferences::usesPageCache(
957     /* [retval][out] */ BOOL* usesPageCache)
958 {
959     *usesPageCache = boolValueForKey(CFSTR(WebKitUsesPageCachePreferenceKey));
960     return S_OK;
961 }
962 
textAreasAreResizable(BOOL * enabled)963 HRESULT STDMETHODCALLTYPE WebPreferences::textAreasAreResizable(
964     /* [retval][out] */ BOOL* enabled)
965 {
966     *enabled = boolValueForKey(CFSTR(WebKitTextAreasAreResizablePreferenceKey));
967     return S_OK;
968 }
969 
setTextAreasAreResizable(BOOL enabled)970 HRESULT STDMETHODCALLTYPE WebPreferences::setTextAreasAreResizable(
971     /* [in] */ BOOL enabled)
972 {
973     setBoolValue(CFSTR(WebKitTextAreasAreResizablePreferenceKey), enabled);
974     return S_OK;
975 }
976 
historyItemLimit(int * limit)977 HRESULT WebPreferences::historyItemLimit(int* limit)
978 {
979     *limit = integerValueForKey(CFSTR(WebKitHistoryItemLimitKey));
980     return S_OK;
981 }
982 
setHistoryItemLimit(int limit)983 HRESULT WebPreferences::setHistoryItemLimit(int limit)
984 {
985     setIntegerValue(CFSTR(WebKitHistoryItemLimitKey), limit);
986     return S_OK;
987 }
988 
historyAgeInDaysLimit(int * limit)989 HRESULT WebPreferences::historyAgeInDaysLimit(int* limit)
990 {
991     *limit = integerValueForKey(CFSTR(WebKitHistoryAgeInDaysLimitKey));
992     return S_OK;
993 }
994 
setHistoryAgeInDaysLimit(int limit)995 HRESULT WebPreferences::setHistoryAgeInDaysLimit(int limit)
996 {
997     setIntegerValue(CFSTR(WebKitHistoryAgeInDaysLimitKey), limit);
998     return S_OK;
999 }
1000 
unused1()1001 HRESULT WebPreferences::unused1()
1002 {
1003     ASSERT_NOT_REACHED();
1004     return E_FAIL;
1005 }
1006 
unused2()1007 HRESULT WebPreferences::unused2()
1008 {
1009     ASSERT_NOT_REACHED();
1010     return E_FAIL;
1011 }
1012 
iconDatabaseLocation(BSTR * location)1013 HRESULT WebPreferences::iconDatabaseLocation(
1014     /* [out] */ BSTR* location)
1015 {
1016     *location = stringValueForKey(CFSTR(WebKitIconDatabaseLocationKey));
1017     return (*location) ? S_OK : E_FAIL;
1018 }
1019 
setIconDatabaseLocation(BSTR location)1020 HRESULT WebPreferences::setIconDatabaseLocation(
1021     /* [in] */ BSTR location)
1022 {
1023     setStringValue(CFSTR(WebKitIconDatabaseLocationKey), location);
1024     return S_OK;
1025 }
1026 
iconDatabaseEnabled(BOOL * enabled)1027 HRESULT WebPreferences::iconDatabaseEnabled(BOOL* enabled)//location)
1028 {
1029     *enabled = boolValueForKey(CFSTR(WebKitIconDatabaseEnabledPreferenceKey));
1030     return S_OK;
1031 }
1032 
setIconDatabaseEnabled(BOOL enabled)1033 HRESULT WebPreferences::setIconDatabaseEnabled(BOOL enabled )//location)
1034 {
1035     setBoolValue(CFSTR(WebKitIconDatabaseEnabledPreferenceKey), enabled);
1036     return S_OK;
1037 }
1038 
fontSmoothing(FontSmoothingType * smoothingType)1039 HRESULT STDMETHODCALLTYPE WebPreferences::fontSmoothing(
1040     /* [retval][out] */ FontSmoothingType* smoothingType)
1041 {
1042     *smoothingType = (FontSmoothingType) integerValueForKey(CFSTR(WebKitFontSmoothingTypePreferenceKey));
1043     return S_OK;
1044 }
1045 
setFontSmoothing(FontSmoothingType smoothingType)1046 HRESULT 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 
fontSmoothingContrast(float * contrast)1058 HRESULT STDMETHODCALLTYPE WebPreferences::fontSmoothingContrast(
1059     /* [retval][out] */ float* contrast)
1060 {
1061     *contrast = floatValueForKey(CFSTR(WebKitFontSmoothingContrastPreferenceKey));
1062     return S_OK;
1063 }
1064 
setFontSmoothingContrast(float contrast)1065 HRESULT 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 
editableLinkBehavior(WebKitEditableLinkBehavior * editableLinkBehavior)1075 HRESULT 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 
setEditableLinkBehavior(WebKitEditableLinkBehavior behavior)1094 HRESULT STDMETHODCALLTYPE WebPreferences::setEditableLinkBehavior(
1095     /* [in] */ WebKitEditableLinkBehavior behavior)
1096 {
1097     setIntegerValue(CFSTR(WebKitEditableLinkBehaviorPreferenceKey), behavior);
1098     return S_OK;
1099 }
1100 
cookieStorageAcceptPolicy(WebKitCookieStorageAcceptPolicy * acceptPolicy)1101 HRESULT 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 
setCookieStorageAcceptPolicy(WebKitCookieStorageAcceptPolicy acceptPolicy)1111 HRESULT STDMETHODCALLTYPE WebPreferences::setCookieStorageAcceptPolicy(
1112         /* [in] */ WebKitCookieStorageAcceptPolicy acceptPolicy)
1113 {
1114     setIntegerValue(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), acceptPolicy);
1115     return S_OK;
1116 }
1117 
1118 
continuousSpellCheckingEnabled(BOOL * enabled)1119 HRESULT WebPreferences::continuousSpellCheckingEnabled(BOOL* enabled)
1120 {
1121     *enabled = boolValueForKey(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey));
1122     return S_OK;
1123 }
1124 
setContinuousSpellCheckingEnabled(BOOL enabled)1125 HRESULT WebPreferences::setContinuousSpellCheckingEnabled(BOOL enabled)
1126 {
1127     setBoolValue(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), enabled);
1128     return S_OK;
1129 }
1130 
grammarCheckingEnabled(BOOL * enabled)1131 HRESULT WebPreferences::grammarCheckingEnabled(BOOL* enabled)
1132 {
1133     *enabled = boolValueForKey(CFSTR(WebGrammarCheckingEnabledPreferenceKey));
1134     return S_OK;
1135 }
1136 
setGrammarCheckingEnabled(BOOL enabled)1137 HRESULT WebPreferences::setGrammarCheckingEnabled(BOOL enabled)
1138 {
1139     setBoolValue(CFSTR(WebGrammarCheckingEnabledPreferenceKey), enabled);
1140     return S_OK;
1141 }
1142 
allowContinuousSpellChecking(BOOL * enabled)1143 HRESULT WebPreferences::allowContinuousSpellChecking(BOOL* enabled)
1144 {
1145     *enabled = boolValueForKey(CFSTR(AllowContinuousSpellCheckingPreferenceKey));
1146     return S_OK;
1147 }
1148 
setAllowContinuousSpellChecking(BOOL enabled)1149 HRESULT WebPreferences::setAllowContinuousSpellChecking(BOOL enabled)
1150 {
1151     setBoolValue(CFSTR(AllowContinuousSpellCheckingPreferenceKey), enabled);
1152     return S_OK;
1153 }
1154 
isDOMPasteAllowed(BOOL * enabled)1155 HRESULT WebPreferences::isDOMPasteAllowed(BOOL* enabled)
1156 {
1157     *enabled = boolValueForKey(CFSTR(WebKitDOMPasteAllowedPreferenceKey));
1158     return S_OK;
1159 }
1160 
setDOMPasteAllowed(BOOL enabled)1161 HRESULT WebPreferences::setDOMPasteAllowed(BOOL enabled)
1162 {
1163     setBoolValue(CFSTR(WebKitDOMPasteAllowedPreferenceKey), enabled);
1164     return S_OK;
1165 }
1166 
cacheModel(WebCacheModel * cacheModel)1167 HRESULT 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 
setCacheModel(WebCacheModel cacheModel)1176 HRESULT WebPreferences::setCacheModel(WebCacheModel cacheModel)
1177 {
1178     setIntegerValue(CFSTR(WebKitCacheModelPreferenceKey), cacheModel);
1179     return S_OK;
1180 }
1181 
setShouldPaintCustomScrollbars(BOOL shouldPaint)1182 HRESULT WebPreferences::setShouldPaintCustomScrollbars(BOOL shouldPaint)
1183 {
1184     setBoolValue(CFSTR(WebKitPaintCustomScrollbarsPreferenceKey), shouldPaint);
1185     return S_OK;
1186 }
1187 
shouldPaintCustomScrollbars(BOOL * shouldPaint)1188 HRESULT WebPreferences::shouldPaintCustomScrollbars(BOOL* shouldPaint)
1189 {
1190     *shouldPaint = boolValueForKey(CFSTR(WebKitPaintCustomScrollbarsPreferenceKey));
1191     return S_OK;
1192 }
1193 
shouldPaintNativeControls(BOOL * shouldPaint)1194 HRESULT WebPreferences::shouldPaintNativeControls(BOOL* shouldPaint)
1195 {
1196     *shouldPaint = boolValueForKey(CFSTR(WebKitPaintNativeControlsPreferenceKey));
1197     return S_OK;
1198 }
1199 
setShouldPaintNativeControls(BOOL shouldPaint)1200 HRESULT WebPreferences::setShouldPaintNativeControls(BOOL shouldPaint)
1201 {
1202     setBoolValue(CFSTR(WebKitPaintNativeControlsPreferenceKey), shouldPaint);
1203     return S_OK;
1204 }
1205 
setDeveloperExtrasEnabled(BOOL enabled)1206 HRESULT WebPreferences::setDeveloperExtrasEnabled(BOOL enabled)
1207 {
1208     setBoolValue(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey), enabled);
1209     return S_OK;
1210 }
1211 
developerExtrasEnabled(BOOL * enabled)1212 HRESULT WebPreferences::developerExtrasEnabled(BOOL* enabled)
1213 {
1214     if (!enabled)
1215         return E_POINTER;
1216 
1217     *enabled = boolValueForKey(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey));
1218     return S_OK;
1219 }
1220 
developerExtrasDisabledByOverride()1221 bool WebPreferences::developerExtrasDisabledByOverride()
1222 {
1223     return !!boolValueForKey(CFSTR(DisableWebKitDeveloperExtrasPreferenceKey));
1224 }
1225 
setAutomaticallyDetectsCacheModel(BOOL automaticallyDetectsCacheModel)1226 HRESULT WebPreferences::setAutomaticallyDetectsCacheModel(BOOL automaticallyDetectsCacheModel)
1227 {
1228     m_automaticallyDetectsCacheModel = !!automaticallyDetectsCacheModel;
1229     return S_OK;
1230 }
1231 
automaticallyDetectsCacheModel(BOOL * automaticallyDetectsCacheModel)1232 HRESULT WebPreferences::automaticallyDetectsCacheModel(BOOL* automaticallyDetectsCacheModel)
1233 {
1234     if (!automaticallyDetectsCacheModel)
1235         return E_POINTER;
1236 
1237     *automaticallyDetectsCacheModel = m_automaticallyDetectsCacheModel;
1238     return S_OK;
1239 }
1240 
setAuthorAndUserStylesEnabled(BOOL enabled)1241 HRESULT STDMETHODCALLTYPE WebPreferences::setAuthorAndUserStylesEnabled(BOOL enabled)
1242 {
1243     setBoolValue(CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey), enabled);
1244     return S_OK;
1245 }
1246 
authorAndUserStylesEnabled(BOOL * enabled)1247 HRESULT 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 
inApplicationChromeMode(BOOL * enabled)1256 HRESULT WebPreferences::inApplicationChromeMode(BOOL* enabled)
1257 {
1258     *enabled = boolValueForKey(CFSTR(WebKitApplicationChromeModePreferenceKey));
1259     return S_OK;
1260 }
1261 
setApplicationChromeMode(BOOL enabled)1262 HRESULT WebPreferences::setApplicationChromeMode(BOOL enabled)
1263 {
1264     setBoolValue(CFSTR(WebKitApplicationChromeModePreferenceKey), enabled);
1265     return S_OK;
1266 }
1267 
setOfflineWebApplicationCacheEnabled(BOOL enabled)1268 HRESULT STDMETHODCALLTYPE WebPreferences::setOfflineWebApplicationCacheEnabled(BOOL enabled)
1269 {
1270     setBoolValue(CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey), enabled);
1271     return S_OK;
1272 }
1273 
offlineWebApplicationCacheEnabled(BOOL * enabled)1274 HRESULT STDMETHODCALLTYPE WebPreferences::offlineWebApplicationCacheEnabled(BOOL* enabled)
1275 {
1276     *enabled = boolValueForKey(CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey));
1277     return S_OK;
1278 }
1279 
setDatabasesEnabled(BOOL enabled)1280 HRESULT STDMETHODCALLTYPE WebPreferences::setDatabasesEnabled(BOOL enabled)
1281 {
1282     setBoolValue(CFSTR(WebKitDatabasesEnabledPreferenceKey), enabled);
1283     return S_OK;
1284 }
1285 
databasesEnabled(BOOL * enabled)1286 HRESULT STDMETHODCALLTYPE WebPreferences::databasesEnabled(BOOL* enabled)
1287 {
1288     *enabled = boolValueForKey(CFSTR(WebKitDatabasesEnabledPreferenceKey));
1289     return S_OK;
1290 }
1291 
setLocalStorageEnabled(BOOL enabled)1292 HRESULT STDMETHODCALLTYPE WebPreferences::setLocalStorageEnabled(BOOL enabled)
1293 {
1294     setBoolValue(CFSTR(WebKitLocalStorageEnabledPreferenceKey), enabled);
1295     return S_OK;
1296 }
1297 
localStorageEnabled(BOOL * enabled)1298 HRESULT STDMETHODCALLTYPE WebPreferences::localStorageEnabled(BOOL* enabled)
1299 {
1300     *enabled = boolValueForKey(CFSTR(WebKitLocalStorageEnabledPreferenceKey));
1301     return S_OK;
1302 }
1303 
localStorageDatabasePath(BSTR * location)1304 HRESULT STDMETHODCALLTYPE WebPreferences::localStorageDatabasePath(BSTR* location)
1305 {
1306     *location = stringValueForKey(CFSTR(WebKitLocalStorageDatabasePathPreferenceKey));
1307     return (*location) ? S_OK : E_FAIL;
1308 }
1309 
setLocalStorageDatabasePath(BSTR location)1310 HRESULT STDMETHODCALLTYPE WebPreferences::setLocalStorageDatabasePath(BSTR location)
1311 {
1312     setStringValue(CFSTR(WebKitLocalStorageDatabasePathPreferenceKey), location);
1313     return S_OK;
1314 }
1315 
setExperimentalNotificationsEnabled(BOOL enabled)1316 HRESULT STDMETHODCALLTYPE WebPreferences::setExperimentalNotificationsEnabled(BOOL enabled)
1317 {
1318     setBoolValue(CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey), enabled);
1319     return S_OK;
1320 }
1321 
experimentalNotificationsEnabled(BOOL * enabled)1322 HRESULT STDMETHODCALLTYPE WebPreferences::experimentalNotificationsEnabled(BOOL* enabled)
1323 {
1324     *enabled = boolValueForKey(CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey));
1325     return S_OK;
1326 }
1327 
setZoomsTextOnly(BOOL zoomsTextOnly)1328 HRESULT WebPreferences::setZoomsTextOnly(BOOL zoomsTextOnly)
1329 {
1330     setBoolValue(CFSTR(WebKitZoomsTextOnlyPreferenceKey), zoomsTextOnly);
1331     return S_OK;
1332 }
1333 
zoomsTextOnly(BOOL * zoomsTextOnly)1334 HRESULT WebPreferences::zoomsTextOnly(BOOL* zoomsTextOnly)
1335 {
1336     *zoomsTextOnly = boolValueForKey(CFSTR(WebKitZoomsTextOnlyPreferenceKey));
1337     return S_OK;
1338 }
1339 
setShouldUseHighResolutionTimers(BOOL useHighResolutionTimers)1340 HRESULT STDMETHODCALLTYPE WebPreferences::setShouldUseHighResolutionTimers(BOOL useHighResolutionTimers)
1341 {
1342     setBoolValue(CFSTR(WebKitUseHighResolutionTimersPreferenceKey), useHighResolutionTimers);
1343     return S_OK;
1344 }
1345 
shouldUseHighResolutionTimers(BOOL * useHighResolutionTimers)1346 HRESULT STDMETHODCALLTYPE WebPreferences::shouldUseHighResolutionTimers(BOOL* useHighResolutionTimers)
1347 {
1348     *useHighResolutionTimers = boolValueForKey(CFSTR(WebKitUseHighResolutionTimersPreferenceKey));
1349     return S_OK;
1350 }
1351 
setPluginAllowedRunTime(UINT allowedRunTime)1352 HRESULT WebPreferences::setPluginAllowedRunTime(UINT allowedRunTime)
1353 {
1354     setIntegerValue(CFSTR(WebKitPluginAllowedRunTimePreferenceKey), allowedRunTime);
1355     return S_OK;
1356 }
1357 
pluginAllowedRunTime(UINT * allowedRunTime)1358 HRESULT WebPreferences::pluginAllowedRunTime(UINT* allowedRunTime)
1359 {
1360     *allowedRunTime = integerValueForKey(CFSTR(WebKitPluginAllowedRunTimePreferenceKey));
1361     return S_OK;
1362 }
1363 
setPreferenceForTest(BSTR key,BSTR value)1364 HRESULT 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 
setAcceleratedCompositingEnabled(BOOL enabled)1375 HRESULT WebPreferences::setAcceleratedCompositingEnabled(BOOL enabled)
1376 {
1377     setBoolValue(CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey), enabled);
1378     return S_OK;
1379 }
1380 
acceleratedCompositingEnabled(BOOL * enabled)1381 HRESULT 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 
setCustomDragCursorsEnabled(BOOL enabled)1391 HRESULT WebPreferences::setCustomDragCursorsEnabled(BOOL enabled)
1392 {
1393     setBoolValue(CFSTR(WebKitCustomDragCursorsEnabledPreferenceKey), enabled);
1394     return S_OK;
1395 }
1396 
customDragCursorsEnabled(BOOL * enabled)1397 HRESULT WebPreferences::customDragCursorsEnabled(BOOL* enabled)
1398 {
1399     *enabled = boolValueForKey(CFSTR(WebKitCustomDragCursorsEnabledPreferenceKey));
1400     return S_OK;
1401 }
1402 
willAddToWebView()1403 void WebPreferences::willAddToWebView()
1404 {
1405     ++m_numWebViews;
1406 }
1407 
didRemoveFromWebView()1408 void 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