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