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