Move Windows safe file creation code into WebCore from WebPreferences
[WebKit-https.git] / WebKit / win / WebPreferences.cpp
1 /*
2  * Copyright (C) 2006, 2007 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 #pragma warning( push, 0 )
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 "WebLocalizableStrings.h"
41 #pragma warning( pop )
42
43 #include <CoreFoundation/CoreFoundation.h>
44 #include <CoreGraphics/CoreGraphics.h>
45 #include <shlobj.h>
46 #include <shfolder.h>
47 #include <tchar.h>
48 #include <WebKitSystemInterface/WebKitSystemInterface.h>
49 #include <wtf/HashMap.h>
50 #include <wtf/OwnPtr.h>
51 #include <wtf/Vector.h>
52
53 using namespace WebCore;
54
55 static unsigned long long WebSystemMainMemory()
56 {
57     MEMORYSTATUSEX statex;
58     
59     statex.dwLength = sizeof(statex);
60     GlobalMemoryStatusEx(&statex);
61     return statex.ullTotalPhys;
62 }
63
64 static String preferencesPath()
65 {
66     static String path = pathByAppendingComponent(roamingUserSpecificStorageDirectory(), "WebKitPreferences.plist");
67     return path;
68 }
69
70 // WebPreferences ----------------------------------------------------------------
71
72 CFDictionaryRef WebPreferences::s_defaultSettings = 0;
73
74 static HashMap<WebCore::String, WebPreferences*> webPreferencesInstances;
75
76 WebPreferences* WebPreferences::sharedStandardPreferences()
77 {
78     static WebPreferences* standardPreferences;
79     if (!standardPreferences) {
80         standardPreferences = WebPreferences::createInstance();
81         standardPreferences->load();
82         standardPreferences->setAutosaves(TRUE);
83         standardPreferences->postPreferencesChangesNotification();
84     }
85
86     return standardPreferences;
87 }
88
89 WebPreferences::WebPreferences()
90 : m_refCount(0)
91 , m_autoSaves(0)
92 {
93     gClassCount++;
94 }
95
96 WebPreferences::~WebPreferences()
97 {
98     gClassCount--;
99 }
100
101 WebPreferences* WebPreferences::createInstance()
102 {
103     WebPreferences* instance = new WebPreferences();
104     instance->AddRef();
105     return instance;
106 }
107
108 HRESULT WebPreferences::postPreferencesChangesNotification()
109 {
110     IWebNotificationCenter* nc = WebNotificationCenter::defaultCenterInternal();
111     HRESULT hr = nc->postNotificationName(webPreferencesChangedNotification(), static_cast<IWebPreferences*>(this), 0);
112     if (FAILED(hr))
113         return hr;
114
115     return S_OK;
116 }
117
118 WebPreferences* WebPreferences::getInstanceForIdentifier(BSTR identifier)
119 {
120     if (!identifier)
121         return sharedStandardPreferences();
122
123     WebCore::String identifierString(identifier, SysStringLen(identifier));
124     return webPreferencesInstances.get(identifierString);
125 }
126
127 void WebPreferences::setInstance(WebPreferences* instance, BSTR identifier)
128 {
129     if (!identifier || !instance)
130         return;
131     WebCore::String identifierString(identifier, SysStringLen(identifier));
132     webPreferencesInstances.add(identifierString, instance);
133 }
134
135 void WebPreferences::removeReferenceForIdentifier(BSTR identifier)
136 {
137     if (!identifier || webPreferencesInstances.isEmpty())
138         return;
139
140     WebCore::String identifierString(identifier, SysStringLen(identifier));
141     WebPreferences* webPreference = webPreferencesInstances.get(identifierString);
142     if (webPreference && webPreference->m_refCount == 1)
143         webPreferencesInstances.remove(identifierString);
144 }
145
146 void WebPreferences::initializeDefaultSettings()
147 {
148     if (s_defaultSettings)
149         return;
150
151     CFMutableDictionaryRef defaults = CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
152
153     // As a fudge factor, use 1000 instead of 1024, in case the reported memory doesn't align exactly to a megabyte boundary.
154     unsigned long long memSize = WebSystemMainMemory() / 1024 / 1000;
155
156     // Page cache size (in pages)
157     int pageCacheSize;
158     if (memSize >= 1024)
159         pageCacheSize = 10;
160     else if (memSize >= 512)
161         pageCacheSize = 5;
162     else if (memSize >= 384)
163         pageCacheSize = 4;
164     else if (memSize >= 256)
165         pageCacheSize = 3;
166     else if (memSize >= 128)
167         pageCacheSize = 2;
168     else if (memSize >= 64)
169         pageCacheSize = 1;
170     else
171         pageCacheSize = 0;
172
173     // Object cache size (in bytes)
174     int objectCacheSize;
175     if (memSize >= 2048)
176         objectCacheSize = 128 * 1024 * 1024;
177     else if (memSize >= 1024)
178         objectCacheSize = 64 * 1024 * 1024;
179     else if (memSize >= 512)
180         objectCacheSize = 32 * 1024 * 1024;
181     else
182         objectCacheSize = 24 * 1024 * 1024; 
183
184     CFDictionaryAddValue(defaults, CFSTR(WebKitStandardFontPreferenceKey), CFSTR("Times New Roman"));
185     CFDictionaryAddValue(defaults, CFSTR(WebKitFixedFontPreferenceKey), CFSTR("Courier New"));
186     CFDictionaryAddValue(defaults, CFSTR(WebKitSerifFontPreferenceKey), CFSTR("Times New Roman"));
187     CFDictionaryAddValue(defaults, CFSTR(WebKitSansSerifFontPreferenceKey), CFSTR("Arial"));
188     CFDictionaryAddValue(defaults, CFSTR(WebKitCursiveFontPreferenceKey), CFSTR("Comic Sans MS"));
189     CFDictionaryAddValue(defaults, CFSTR(WebKitFantasyFontPreferenceKey), CFSTR("Comic Sans MS"));
190     CFDictionaryAddValue(defaults, CFSTR(WebKitMinimumFontSizePreferenceKey), CFSTR("1"));
191     CFDictionaryAddValue(defaults, CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), CFSTR("9"));
192     CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultFontSizePreferenceKey), CFSTR("16"));
193     CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultFixedFontSizePreferenceKey), CFSTR("13"));
194     WebCore::String defaultDefaultEncoding(LPCTSTR_UI_STRING("ISO-8859-1", "The default, default character encoding"));
195     CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), defaultDefaultEncoding.createCFString());
196
197     RetainPtr<CFStringRef> pageCacheSizeString(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%d"), pageCacheSize));
198     CFDictionaryAddValue(defaults, CFSTR(WebKitPageCacheSizePreferenceKey), pageCacheSizeString.get());
199
200     RetainPtr<CFStringRef> objectCacheSizeString(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%d"), objectCacheSize));
201     CFDictionaryAddValue(defaults, CFSTR(WebKitObjectCacheSizePreferenceKey), objectCacheSizeString.get());
202
203     CFDictionaryAddValue(defaults, CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), kCFBooleanFalse);
204     CFDictionaryAddValue(defaults, CFSTR(WebKitUserStyleSheetLocationPreferenceKey), CFSTR(""));
205     CFDictionaryAddValue(defaults, CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), kCFBooleanFalse);
206     CFDictionaryAddValue(defaults, CFSTR(WebKitTextAreasAreResizablePreferenceKey), kCFBooleanFalse);
207     CFDictionaryAddValue(defaults, CFSTR(WebKitJavaEnabledPreferenceKey), kCFBooleanTrue);
208     CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptEnabledPreferenceKey), kCFBooleanTrue);
209     CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), kCFBooleanTrue);
210     CFDictionaryAddValue(defaults, CFSTR(WebKitPluginsEnabledPreferenceKey), kCFBooleanTrue);
211     CFDictionaryAddValue(defaults, CFSTR(WebKitAllowAnimatedImagesPreferenceKey), kCFBooleanTrue);
212     CFDictionaryAddValue(defaults, CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), kCFBooleanTrue);
213     CFDictionaryAddValue(defaults, CFSTR(WebKitDisplayImagesKey), kCFBooleanTrue);
214     CFDictionaryAddValue(defaults, CFSTR(WebKitBackForwardCacheExpirationIntervalKey), CFSTR("1800"));
215     CFDictionaryAddValue(defaults, CFSTR(WebKitTabToLinksPreferenceKey), kCFBooleanFalse);
216     CFDictionaryAddValue(defaults, CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), kCFBooleanFalse);
217     CFDictionaryAddValue(defaults, CFSTR(WebKitRespectStandardStyleKeyEquivalentsPreferenceKey), kCFBooleanFalse);
218     CFDictionaryAddValue(defaults, CFSTR(WebKitShowsURLsInToolTipsPreferenceKey), kCFBooleanFalse);
219     CFDictionaryAddValue(defaults, CFSTR(WebKitPDFDisplayModePreferenceKey), CFSTR("1"));
220     CFDictionaryAddValue(defaults, CFSTR(WebKitPDFScaleFactorPreferenceKey), CFSTR("0"));
221
222     RetainPtr<CFStringRef> linkBehaviorStringRef(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%d"), WebKitEditableLinkDefaultBehavior));
223     CFDictionaryAddValue(defaults, CFSTR(WebKitEditableLinkBehaviorPreferenceKey), linkBehaviorStringRef.get());
224
225     CFDictionaryAddValue(defaults, CFSTR(WebKitHistoryItemLimitKey), CFSTR("1000"));
226     CFDictionaryAddValue(defaults, CFSTR(WebKitHistoryAgeInDaysLimitKey), CFSTR("7"));
227     CFDictionaryAddValue(defaults, CFSTR(WebKitIconDatabaseLocationKey), CFSTR(""));
228     CFDictionaryAddValue(defaults, CFSTR(WebKitIconDatabaseEnabledPreferenceKey), kCFBooleanTrue);
229     CFDictionaryAddValue(defaults, CFSTR(WebKitFontSmothingTypePreferenceKey), CFSTR("2"));
230     CFDictionaryAddValue(defaults, CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), CFSTR("2"));
231     CFDictionaryAddValue(defaults, CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), kCFBooleanFalse);
232     CFDictionaryAddValue(defaults, CFSTR(WebGrammarCheckingEnabledPreferenceKey), kCFBooleanFalse);
233     CFDictionaryAddValue(defaults, CFSTR(AllowContinuousSpellCheckingPreferenceKey), kCFBooleanTrue);
234     CFDictionaryAddValue(defaults, CFSTR(WebKitUsesPageCachePreferenceKey), kCFBooleanTrue);
235
236     s_defaultSettings = defaults;
237 }
238
239 const void* WebPreferences::valueForKey(CFStringRef key)
240 {
241     const void* value = CFDictionaryGetValue(m_privatePrefs.get(), key);
242     if (!value)
243         value = CFDictionaryGetValue(s_defaultSettings, key);
244
245     return value;
246 }
247
248 BSTR WebPreferences::stringValueForKey(CFStringRef key)
249 {
250     CFStringRef str = (CFStringRef)valueForKey(key);
251     
252     if (!str || (CFGetTypeID(str) != CFStringGetTypeID()))
253         return 0;
254
255     CFIndex length = CFStringGetLength(str);
256     const UniChar* uniChars = CFStringGetCharactersPtr(str);
257     if (uniChars)
258         return SysAllocStringLen((LPCTSTR)uniChars, length);
259
260     BSTR bstr = SysAllocStringLen(0, length);
261     if (!bstr)
262         return 0;
263
264     if (!CFStringGetCString(str, (char*)bstr, (length+1)*sizeof(WCHAR), kCFStringEncodingUTF16)) {
265         SysFreeString(bstr);
266         return 0;
267     }
268         
269     bstr[length] = 0;
270     return bstr;
271 }
272
273 int WebPreferences::integerValueForKey(CFStringRef key)
274 {
275     CFTypeRef cfVal = (CFStringRef)valueForKey(key);
276     if (!cfVal)
277         return 0;
278
279     CFTypeID cfType = CFGetTypeID(cfVal);
280     if (cfType == CFStringGetTypeID())
281         return CFStringGetIntValue((CFStringRef)cfVal);
282     else if (cfType == CFBooleanGetTypeID()) {
283         Boolean boolVal = CFBooleanGetValue((CFBooleanRef)cfVal);
284         return (boolVal) ? 1 : 0;
285     }
286     else if (cfType == CFNumberGetTypeID()) {
287         int val = 0;
288         CFNumberGetValue((CFNumberRef)cfVal, kCFNumberSInt32Type, &val);
289         return val;
290     }
291
292     return 0;
293 }
294
295 BOOL WebPreferences::boolValueForKey(CFStringRef key)
296 {
297     return (integerValueForKey(key) != 0);
298 }
299
300 float WebPreferences::floatValueForKey(CFStringRef key)
301 {
302     CFTypeRef cfVal = (CFStringRef)valueForKey(key);
303     if (!cfVal)
304         return 0.0;
305
306     CFTypeID cfType = CFGetTypeID(cfVal);
307     if (cfType == CFStringGetTypeID())
308         return (float)CFStringGetDoubleValue((CFStringRef)cfVal);
309     else if (cfType == CFBooleanGetTypeID()) {
310         Boolean boolVal = CFBooleanGetValue((CFBooleanRef)cfVal);
311         return (boolVal) ? 1.0f : 0.0f;
312     }
313     else if (cfType == CFNumberGetTypeID()) {
314         float val = 0.0;
315         CFNumberGetValue((CFNumberRef)cfVal, kCFNumberFloatType, &val);
316         return val;
317     }
318
319     return 0.0;
320 }
321
322 void WebPreferences::setStringValue(CFStringRef key, LPCTSTR value)
323 {
324     BSTR val = stringValueForKey(key);
325     if (val && !_tcscmp(val, value))
326         return;
327     SysFreeString(val);
328     
329     RetainPtr<CFStringRef> valueRef(AdoptCF,
330         CFStringCreateWithCharactersNoCopy(0, (UniChar*)_wcsdup(value), (CFIndex)_tcslen(value), kCFAllocatorMalloc));
331     CFDictionarySetValue(m_privatePrefs.get(), key, valueRef.get());
332     if (m_autoSaves)
333         save();
334
335     postPreferencesChangesNotification();
336 }
337
338 BSTR WebPreferences::webPreferencesChangedNotification()
339 {
340     static BSTR webPreferencesChangedNotification = SysAllocString(WebPreferencesChangedNotification);
341     return webPreferencesChangedNotification;
342 }
343
344 void WebPreferences::setIntegerValue(CFStringRef key, int value)
345 {
346     if (integerValueForKey(key) == value)
347         return;
348
349     RetainPtr<CFNumberRef> valueRef(AdoptCF, CFNumberCreate(0, kCFNumberSInt32Type, &value));
350     CFDictionarySetValue(m_privatePrefs.get(), key, valueRef.get());
351     if (m_autoSaves)
352         save();
353
354     postPreferencesChangesNotification();
355 }
356
357 void WebPreferences::setBoolValue(CFStringRef key, BOOL value)
358 {
359     if (boolValueForKey(key) == value)
360         return;
361
362     CFDictionarySetValue(m_privatePrefs.get(), key, value ? kCFBooleanTrue : kCFBooleanFalse);
363     if (m_autoSaves)
364         save();
365
366     postPreferencesChangesNotification();
367 }
368
369 void WebPreferences::save()
370 {
371     RetainPtr<CFWriteStreamRef> stream(AdoptCF,
372         CFWriteStreamCreateWithAllocatedBuffers(kCFAllocatorDefault, kCFAllocatorDefault)); 
373     if (!stream)
374         return;
375
376     if (!CFWriteStreamOpen(stream.get()))
377         return;
378
379     if (!CFPropertyListWriteToStream(m_privatePrefs.get(), stream.get(), kCFPropertyListXMLFormat_v1_0, 0)) {
380         CFWriteStreamClose(stream.get());
381         return;
382     }
383     CFWriteStreamClose(stream.get());
384
385     RetainPtr<CFDataRef> dataRef(AdoptCF,
386         (CFDataRef)CFWriteStreamCopyProperty(stream.get(), kCFStreamPropertyDataWritten));
387     if (!dataRef)
388         return;
389
390     safeCreateFile(preferencesPath(), dataRef.get());
391 }
392
393 void WebPreferences::load()
394 {
395     initializeDefaultSettings();
396
397     CString path = preferencesPath().utf8();
398
399     RetainPtr<CFURLRef> urlRef(AdoptCF, CFURLCreateFromFileSystemRepresentation(0, reinterpret_cast<const UInt8*>(path.data()), path.length(), false));
400     if (!urlRef)
401         return;
402
403     RetainPtr<CFReadStreamRef> stream(AdoptCF, CFReadStreamCreateWithFile(0, urlRef.get()));
404     if (!stream) 
405         return;
406
407     if (CFReadStreamOpen(stream.get())) {
408         CFPropertyListFormat format = kCFPropertyListBinaryFormat_v1_0 | kCFPropertyListXMLFormat_v1_0;
409         RetainPtr<CFPropertyListRef> plist(AdoptCF, CFPropertyListCreateFromStream(0, stream.get(), 0, kCFPropertyListMutableContainersAndLeaves, &format, 0));
410         CFReadStreamClose(stream.get());
411
412         if (CFGetTypeID(plist.get()) == CFDictionaryGetTypeID())
413             m_privatePrefs.adoptCF(const_cast<CFMutableDictionaryRef>(reinterpret_cast<CFDictionaryRef>(plist.releaseRef())));
414     }
415
416     if (!m_privatePrefs)
417         m_privatePrefs.adoptCF(CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
418
419     migrateDefaultSettingsFromSafari3Beta();
420 }
421
422 void WebPreferences::migrateDefaultSettingsFromSafari3Beta()
423 {
424     // The "migration" happening here is a one-time removal of any default values
425     // that were stored in the user's preferences due to <rdar://problem/5214504>.
426
427     ASSERT(s_defaultSettings);
428     if (!m_privatePrefs)
429         return;
430
431     CFStringRef didMigrateKey = CFSTR(WebKitDidMigrateDefaultSettingsFromSafari3BetaPreferenceKey);
432     if (boolValueForKey(didMigrateKey))
433         return;
434
435     removeValuesMatchingDefaultSettings();
436
437     bool oldValue = m_autoSaves;
438     m_autoSaves = true;
439     setBoolValue(didMigrateKey, TRUE);
440     m_autoSaves = oldValue;
441 }
442
443 void WebPreferences::removeValuesMatchingDefaultSettings()
444 {
445     ASSERT(m_privatePrefs);
446
447     int count = CFDictionaryGetCount(m_privatePrefs.get());
448     if (count <= 0)
449         return;
450
451     Vector<CFTypeRef> keys(count);
452     Vector<CFTypeRef> values(count);
453     CFDictionaryGetKeysAndValues(m_privatePrefs.get(), keys.data(), values.data());
454
455     for (int i = 0; i < count; ++i) {
456         if (!values[i])
457             continue;
458
459         CFTypeRef defaultValue = CFDictionaryGetValue(s_defaultSettings, keys[i]);
460         if (!defaultValue)
461             continue;
462
463         if (CFEqual(values[i], defaultValue))
464             CFDictionaryRemoveValue(m_privatePrefs.get(), keys[i]);
465     }
466 }
467
468 // IUnknown -------------------------------------------------------------------
469
470 HRESULT STDMETHODCALLTYPE WebPreferences::QueryInterface(REFIID riid, void** ppvObject)
471 {
472     *ppvObject = 0;
473     if (IsEqualGUID(riid, IID_IUnknown))
474         *ppvObject = static_cast<IWebPreferences*>(this);
475     else if (IsEqualGUID(riid, IID_IWebPreferences))
476         *ppvObject = static_cast<IWebPreferences*>(this);
477     else if (IsEqualGUID(riid, IID_IWebPreferencesPrivate))
478         *ppvObject = static_cast<IWebPreferencesPrivate*>(this);
479     else if (IsEqualGUID(riid, CLSID_WebPreferences))
480         *ppvObject = this;
481     else
482         return E_NOINTERFACE;
483
484     AddRef();
485     return S_OK;
486 }
487
488 ULONG STDMETHODCALLTYPE WebPreferences::AddRef(void)
489 {
490     return ++m_refCount;
491 }
492
493 ULONG STDMETHODCALLTYPE WebPreferences::Release(void)
494 {
495     ULONG newRef = --m_refCount;
496     if (!newRef)
497         delete(this);
498
499     return newRef;
500 }
501
502 // IWebPreferences ------------------------------------------------------------
503
504 HRESULT STDMETHODCALLTYPE WebPreferences::standardPreferences( 
505     /* [retval][out] */ IWebPreferences** standardPreferences)
506 {
507     if (!standardPreferences)
508         return E_POINTER;
509     *standardPreferences = sharedStandardPreferences();
510     (*standardPreferences)->AddRef();
511     return S_OK;
512 }
513
514 HRESULT STDMETHODCALLTYPE WebPreferences::initWithIdentifier( 
515         /* [in] */ BSTR anIdentifier,
516         /* [retval][out] */ IWebPreferences** preferences)
517 {
518     WebPreferences *instance = getInstanceForIdentifier(anIdentifier);
519     if (instance) {
520         *preferences = instance;
521         instance->AddRef();
522         return S_OK;
523     }
524
525     load();
526
527     *preferences = this;
528     AddRef();
529
530     if (anIdentifier) {
531         m_identifier = anIdentifier;
532         setInstance(this, m_identifier);
533     }
534
535     return S_OK;
536 }
537
538 HRESULT STDMETHODCALLTYPE WebPreferences::identifier( 
539     /* [retval][out] */ BSTR* ident)
540 {
541     if (!ident)
542         return E_POINTER;
543     *ident = m_identifier ? SysAllocString(m_identifier) : 0;
544     return S_OK;
545 }
546
547 HRESULT STDMETHODCALLTYPE WebPreferences::standardFontFamily( 
548     /* [retval][out] */ BSTR* family)
549 {
550     *family = stringValueForKey(CFSTR(WebKitStandardFontPreferenceKey));
551     return (*family) ? S_OK : E_FAIL;
552 }
553
554 HRESULT STDMETHODCALLTYPE WebPreferences::setStandardFontFamily( 
555     /* [in] */ BSTR family)
556 {
557     setStringValue(CFSTR(WebKitStandardFontPreferenceKey), family);
558     return S_OK;
559 }
560
561 HRESULT STDMETHODCALLTYPE WebPreferences::fixedFontFamily( 
562     /* [retval][out] */ BSTR* family)
563 {
564     *family = stringValueForKey(CFSTR(WebKitFixedFontPreferenceKey));
565     return (*family) ? S_OK : E_FAIL;
566 }
567
568 HRESULT STDMETHODCALLTYPE WebPreferences::setFixedFontFamily( 
569     /* [in] */ BSTR family)
570 {
571     setStringValue(CFSTR(WebKitFixedFontPreferenceKey), family);
572     return S_OK;
573 }
574
575 HRESULT STDMETHODCALLTYPE WebPreferences::serifFontFamily( 
576     /* [retval][out] */ BSTR* fontFamily)
577 {
578     *fontFamily = stringValueForKey(CFSTR(WebKitSerifFontPreferenceKey));
579     return (*fontFamily) ? S_OK : E_FAIL;
580 }
581
582 HRESULT STDMETHODCALLTYPE WebPreferences::setSerifFontFamily( 
583     /* [in] */ BSTR family)
584 {
585     setStringValue(CFSTR(WebKitSerifFontPreferenceKey), family);
586     return S_OK;
587 }
588
589 HRESULT STDMETHODCALLTYPE WebPreferences::sansSerifFontFamily( 
590     /* [retval][out] */ BSTR* family)
591 {
592     *family = stringValueForKey(CFSTR(WebKitSansSerifFontPreferenceKey));
593     return (*family) ? S_OK : E_FAIL;
594 }
595
596 HRESULT STDMETHODCALLTYPE WebPreferences::setSansSerifFontFamily( 
597     /* [in] */ BSTR family)
598 {
599     setStringValue(CFSTR(WebKitSansSerifFontPreferenceKey), family);
600     return S_OK;
601 }
602
603 HRESULT STDMETHODCALLTYPE WebPreferences::cursiveFontFamily( 
604     /* [retval][out] */ BSTR* family)
605 {
606     *family = stringValueForKey(CFSTR(WebKitCursiveFontPreferenceKey));
607     return (*family) ? S_OK : E_FAIL;
608 }
609
610 HRESULT STDMETHODCALLTYPE WebPreferences::setCursiveFontFamily( 
611     /* [in] */ BSTR family)
612 {
613     setStringValue(CFSTR(WebKitCursiveFontPreferenceKey), family);
614     return S_OK;
615 }
616
617 HRESULT STDMETHODCALLTYPE WebPreferences::fantasyFontFamily( 
618     /* [retval][out] */ BSTR* family)
619 {
620     *family = stringValueForKey(CFSTR(WebKitFantasyFontPreferenceKey));
621     return (*family) ? S_OK : E_FAIL;
622 }
623
624 HRESULT STDMETHODCALLTYPE WebPreferences::setFantasyFontFamily( 
625     /* [in] */ BSTR family)
626 {
627     setStringValue(CFSTR(WebKitFantasyFontPreferenceKey), family);
628     return S_OK;
629 }
630
631 HRESULT STDMETHODCALLTYPE WebPreferences::defaultFontSize( 
632     /* [retval][out] */ int* fontSize)
633 {
634     *fontSize = integerValueForKey(CFSTR(WebKitDefaultFontSizePreferenceKey));
635     return S_OK;
636 }
637
638 HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFontSize( 
639     /* [in] */ int fontSize)
640 {
641     setIntegerValue(CFSTR(WebKitDefaultFontSizePreferenceKey), fontSize);
642     return S_OK;
643 }
644
645 HRESULT STDMETHODCALLTYPE WebPreferences::defaultFixedFontSize( 
646     /* [retval][out] */ int* fontSize)
647 {
648     *fontSize = integerValueForKey(CFSTR(WebKitDefaultFixedFontSizePreferenceKey));
649     return S_OK;
650 }
651
652 HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFixedFontSize( 
653     /* [in] */ int fontSize)
654 {
655     setIntegerValue(CFSTR(WebKitDefaultFixedFontSizePreferenceKey), fontSize);
656     return S_OK;
657 }
658
659 HRESULT STDMETHODCALLTYPE WebPreferences::minimumFontSize( 
660     /* [retval][out] */ int* fontSize)
661 {
662     *fontSize = integerValueForKey(CFSTR(WebKitMinimumFontSizePreferenceKey));
663     return S_OK;
664 }
665
666 HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumFontSize( 
667     /* [in] */ int fontSize)
668 {
669     setIntegerValue(CFSTR(WebKitMinimumFontSizePreferenceKey), fontSize);
670     return S_OK;
671 }
672
673 HRESULT STDMETHODCALLTYPE WebPreferences::minimumLogicalFontSize( 
674     /* [retval][out] */ int* fontSize)
675 {
676     *fontSize = integerValueForKey(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey));
677     return S_OK;
678 }
679
680 HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumLogicalFontSize( 
681     /* [in] */ int fontSize)
682 {
683     setIntegerValue(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), fontSize);
684     return S_OK;
685 }
686
687 HRESULT STDMETHODCALLTYPE WebPreferences::defaultTextEncodingName( 
688     /* [retval][out] */ BSTR* name)
689 {
690     *name = stringValueForKey(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey));
691     return (*name) ? S_OK : E_FAIL;
692 }
693
694 HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultTextEncodingName( 
695     /* [in] */ BSTR name)
696 {
697     setStringValue(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), name);
698     return S_OK;
699 }
700
701 HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetEnabled( 
702     /* [retval][out] */ BOOL* enabled)
703 {
704     *enabled = boolValueForKey(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey));
705     return S_OK;
706 }
707
708 HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetEnabled( 
709     /* [in] */ BOOL enabled)
710 {
711     setBoolValue(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), enabled);
712     return S_OK;
713 }
714
715 HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetLocation( 
716     /* [retval][out] */ BSTR* location)
717 {
718     *location = stringValueForKey(CFSTR(WebKitUserStyleSheetLocationPreferenceKey));
719     return (*location) ? S_OK : E_FAIL;
720 }
721
722 HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetLocation( 
723     /* [in] */ BSTR location)
724 {
725     setStringValue(CFSTR(WebKitUserStyleSheetLocationPreferenceKey), location);
726     return S_OK;
727 }
728
729 HRESULT STDMETHODCALLTYPE WebPreferences::isJavaEnabled( 
730     /* [retval][out] */ BOOL* enabled)
731 {
732     *enabled = boolValueForKey(CFSTR(WebKitJavaEnabledPreferenceKey));
733     return S_OK;
734 }
735
736 HRESULT STDMETHODCALLTYPE WebPreferences::setJavaEnabled( 
737     /* [in] */ BOOL enabled)
738 {
739     setBoolValue(CFSTR(WebKitJavaEnabledPreferenceKey), enabled);
740     return S_OK;
741 }
742
743 HRESULT STDMETHODCALLTYPE WebPreferences::isJavaScriptEnabled( 
744     /* [retval][out] */ BOOL* enabled)
745 {
746     *enabled = boolValueForKey(CFSTR(WebKitJavaScriptEnabledPreferenceKey));
747     return S_OK;
748 }
749
750 HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptEnabled( 
751     /* [in] */ BOOL enabled)
752 {
753     setBoolValue(CFSTR(WebKitJavaScriptEnabledPreferenceKey), enabled);
754     return S_OK;
755 }
756
757 HRESULT STDMETHODCALLTYPE WebPreferences::javaScriptCanOpenWindowsAutomatically( 
758     /* [retval][out] */ BOOL* enabled)
759 {
760     *enabled = boolValueForKey(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey));
761     return S_OK;
762 }
763
764 HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptCanOpenWindowsAutomatically( 
765     /* [in] */ BOOL enabled)
766 {
767     setBoolValue(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), enabled);
768     return S_OK;
769 }
770
771 HRESULT STDMETHODCALLTYPE WebPreferences::arePlugInsEnabled( 
772     /* [retval][out] */ BOOL* enabled)
773 {
774     *enabled = boolValueForKey(CFSTR(WebKitPluginsEnabledPreferenceKey));
775     return S_OK;
776 }
777
778 HRESULT STDMETHODCALLTYPE WebPreferences::setPlugInsEnabled( 
779     /* [in] */ BOOL enabled)
780 {
781     setBoolValue(CFSTR(WebKitPluginsEnabledPreferenceKey), enabled);
782     return S_OK;
783 }
784
785 HRESULT STDMETHODCALLTYPE WebPreferences::allowsAnimatedImages( 
786     /* [retval][out] */ BOOL* enabled)
787 {
788     *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImagesPreferenceKey));
789     return S_OK;
790 }
791
792 HRESULT STDMETHODCALLTYPE WebPreferences::setAllowsAnimatedImages( 
793     /* [in] */ BOOL enabled)
794 {
795     setBoolValue(CFSTR(WebKitAllowAnimatedImagesPreferenceKey), enabled);
796     return S_OK;
797 }
798
799 HRESULT STDMETHODCALLTYPE WebPreferences::allowAnimatedImageLooping( 
800     /* [retval][out] */ BOOL* enabled)
801 {
802     *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey));
803     return S_OK;
804 }
805
806 HRESULT STDMETHODCALLTYPE WebPreferences::setAllowAnimatedImageLooping( 
807     /* [in] */ BOOL enabled)
808 {
809     setBoolValue(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), enabled);
810     return S_OK;
811 }
812
813 HRESULT STDMETHODCALLTYPE WebPreferences::setLoadsImagesAutomatically( 
814     /* [in] */ BOOL enabled)
815 {
816     setBoolValue(CFSTR(WebKitDisplayImagesKey), enabled);
817     return S_OK;
818 }
819
820 HRESULT STDMETHODCALLTYPE WebPreferences::loadsImagesAutomatically( 
821     /* [retval][out] */ BOOL* enabled)
822 {
823     *enabled = boolValueForKey(CFSTR(WebKitDisplayImagesKey));
824     return S_OK;
825 }
826
827 HRESULT STDMETHODCALLTYPE WebPreferences::setAutosaves( 
828     /* [in] */ BOOL enabled)
829 {
830     m_autoSaves = !!enabled;
831     return S_OK;
832 }
833
834 HRESULT STDMETHODCALLTYPE WebPreferences::autosaves( 
835     /* [retval][out] */ BOOL* enabled)
836 {
837     *enabled = m_autoSaves ? TRUE : FALSE;
838     return S_OK;
839 }
840
841 HRESULT STDMETHODCALLTYPE WebPreferences::setShouldPrintBackgrounds( 
842     /* [in] */ BOOL enabled)
843 {
844     setBoolValue(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), enabled);
845     return S_OK;
846 }
847
848 HRESULT STDMETHODCALLTYPE WebPreferences::shouldPrintBackgrounds( 
849     /* [retval][out] */ BOOL* enabled)
850 {
851     *enabled = boolValueForKey(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey));
852     return S_OK;
853 }
854
855 HRESULT STDMETHODCALLTYPE WebPreferences::setPrivateBrowsingEnabled( 
856     /* [in] */ BOOL enabled)
857 {
858     setBoolValue(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), enabled);
859     return S_OK;
860 }
861
862 HRESULT STDMETHODCALLTYPE WebPreferences::privateBrowsingEnabled( 
863     /* [retval][out] */ BOOL* enabled)
864 {
865     *enabled = boolValueForKey(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey));
866     return S_OK;
867 }
868
869 HRESULT STDMETHODCALLTYPE WebPreferences::setTabsToLinks( 
870     /* [in] */ BOOL enabled)
871 {
872     setBoolValue(CFSTR(WebKitTabToLinksPreferenceKey), enabled);
873     return S_OK;
874 }
875
876 HRESULT STDMETHODCALLTYPE WebPreferences::tabsToLinks( 
877     /* [retval][out] */ BOOL* enabled)
878 {
879     *enabled = boolValueForKey(CFSTR(WebKitTabToLinksPreferenceKey));
880     return S_OK;
881 }
882
883 HRESULT STDMETHODCALLTYPE WebPreferences::setUsesPageCache( 
884         /* [in] */ BOOL usesPageCache)
885 {
886     setBoolValue(CFSTR(WebKitUsesPageCachePreferenceKey), usesPageCache);
887     return S_OK;
888 }
889
890 HRESULT STDMETHODCALLTYPE WebPreferences::usesPageCache( 
891     /* [retval][out] */ BOOL* usesPageCache)
892 {
893     *usesPageCache = boolValueForKey(CFSTR(WebKitUsesPageCachePreferenceKey));
894     return S_OK;
895 }
896
897 HRESULT STDMETHODCALLTYPE WebPreferences::textAreasAreResizable( 
898     /* [retval][out] */ BOOL* enabled)
899 {
900     *enabled = boolValueForKey(CFSTR(WebKitTextAreasAreResizablePreferenceKey));
901     return S_OK;
902 }
903
904 HRESULT STDMETHODCALLTYPE WebPreferences::setTextAreasAreResizable( 
905     /* [in] */ BOOL enabled)
906 {
907     setBoolValue(CFSTR(WebKitTextAreasAreResizablePreferenceKey), enabled);
908     return S_OK;
909 }
910
911 HRESULT WebPreferences::historyItemLimit(int* limit)
912 {
913     *limit = integerValueForKey(CFSTR(WebKitHistoryItemLimitKey));
914     return S_OK;
915 }
916
917 HRESULT WebPreferences::setHistoryItemLimit(int limit)
918 {
919     setIntegerValue(CFSTR(WebKitHistoryItemLimitKey), limit);
920     return S_OK;
921 }
922
923 HRESULT WebPreferences::historyAgeInDaysLimit(int* limit)
924 {
925     *limit = integerValueForKey(CFSTR(WebKitHistoryAgeInDaysLimitKey));
926     return S_OK;
927 }
928
929 HRESULT WebPreferences::setHistoryAgeInDaysLimit(int limit)
930 {
931     setIntegerValue(CFSTR(WebKitHistoryAgeInDaysLimitKey), limit);
932     return S_OK;
933 }
934
935 HRESULT WebPreferences::pageCacheSize(unsigned int* limit)
936 {
937     *limit = integerValueForKey(CFSTR(WebKitPageCacheSizePreferenceKey));
938     return S_OK;
939 }
940
941 HRESULT WebPreferences::objectCacheSize(unsigned int* limit)
942 {
943     *limit = integerValueForKey(CFSTR(WebKitObjectCacheSizePreferenceKey));
944     return S_OK;
945 }
946
947 HRESULT WebPreferences::iconDatabaseLocation(
948     /* [out] */ BSTR* location)
949 {
950     *location = stringValueForKey(CFSTR(WebKitIconDatabaseLocationKey));
951     return (*location) ? S_OK : E_FAIL;
952 }
953
954 HRESULT WebPreferences::setIconDatabaseLocation(
955     /* [in] */ BSTR location)
956 {
957     setStringValue(CFSTR(WebKitIconDatabaseLocationKey), location);
958     return S_OK;
959 }
960
961 HRESULT WebPreferences::iconDatabaseEnabled(BOOL* enabled)//location)
962 {
963     *enabled = boolValueForKey(CFSTR(WebKitIconDatabaseEnabledPreferenceKey));
964     return S_OK;
965 }
966
967 HRESULT WebPreferences::setIconDatabaseEnabled(BOOL enabled )//location)
968 {
969     setBoolValue(CFSTR(WebKitIconDatabaseEnabledPreferenceKey), enabled);
970     return S_OK;
971 }
972
973 HRESULT STDMETHODCALLTYPE WebPreferences::fontSmoothing( 
974     /* [retval][out] */ FontSmoothingType* smoothingType)
975 {
976     *smoothingType = (FontSmoothingType) integerValueForKey(CFSTR(WebKitFontSmothingTypePreferenceKey));
977     return S_OK;
978 }
979
980 HRESULT STDMETHODCALLTYPE WebPreferences::setFontSmoothing( 
981     /* [in] */ FontSmoothingType smoothingType)
982 {
983     setIntegerValue(CFSTR(WebKitFontSmothingTypePreferenceKey), smoothingType);
984     wkSetFontSmoothingLevel((int)smoothingType);
985     return S_OK;
986 }
987
988 HRESULT STDMETHODCALLTYPE WebPreferences::editableLinkBehavior(
989     /* [out, retval] */ WebKitEditableLinkBehavior* editableLinkBehavior)
990 {
991     WebKitEditableLinkBehavior value = (WebKitEditableLinkBehavior) integerValueForKey(CFSTR(WebKitEditableLinkBehaviorPreferenceKey));
992     switch (value) {
993         case WebKitEditableLinkDefaultBehavior:
994         case WebKitEditableLinkAlwaysLive:
995         case WebKitEditableLinkOnlyLiveWithShiftKey:
996         case WebKitEditableLinkLiveWhenNotFocused:
997         case WebKitEditableLinkNeverLive:
998             *editableLinkBehavior = value;
999             break;
1000         default: // ensure that a valid result is returned
1001             *editableLinkBehavior = WebKitEditableLinkDefaultBehavior;
1002             break;
1003     }
1004     return S_OK;
1005 }
1006
1007 HRESULT STDMETHODCALLTYPE WebPreferences::setEditableLinkBehavior(
1008     /* [in] */ WebKitEditableLinkBehavior behavior)
1009 {
1010     setIntegerValue(CFSTR(WebKitEditableLinkBehaviorPreferenceKey), behavior);
1011     return S_OK;
1012 }
1013
1014 HRESULT STDMETHODCALLTYPE WebPreferences::cookieStorageAcceptPolicy( 
1015         /* [retval][out] */ WebKitCookieStorageAcceptPolicy *acceptPolicy )
1016 {
1017     if (!acceptPolicy)
1018         return E_POINTER;
1019
1020     *acceptPolicy = (WebKitCookieStorageAcceptPolicy)integerValueForKey(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey));
1021     return S_OK;
1022 }
1023
1024 HRESULT STDMETHODCALLTYPE WebPreferences::setCookieStorageAcceptPolicy( 
1025         /* [in] */ WebKitCookieStorageAcceptPolicy acceptPolicy)
1026 {
1027     setIntegerValue(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), acceptPolicy);
1028     return S_OK;
1029 }
1030
1031
1032 HRESULT WebPreferences::continuousSpellCheckingEnabled(BOOL* enabled)
1033 {
1034     *enabled = boolValueForKey(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey));
1035     return S_OK;
1036 }
1037
1038 HRESULT WebPreferences::setContinuousSpellCheckingEnabled(BOOL enabled)
1039 {
1040     setBoolValue(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), enabled);
1041     return S_OK;
1042 }
1043
1044 HRESULT WebPreferences::grammarCheckingEnabled(BOOL* enabled)
1045 {
1046     *enabled = boolValueForKey(CFSTR(WebGrammarCheckingEnabledPreferenceKey));
1047     return S_OK;
1048 }
1049
1050 HRESULT WebPreferences::setGrammarCheckingEnabled(BOOL enabled)
1051 {
1052     setBoolValue(CFSTR(WebGrammarCheckingEnabledPreferenceKey), enabled);
1053     return S_OK;
1054 }
1055
1056 HRESULT WebPreferences::allowContinuousSpellChecking(BOOL* enabled)
1057 {
1058     *enabled = boolValueForKey(CFSTR(AllowContinuousSpellCheckingPreferenceKey));
1059     return S_OK;
1060 }
1061
1062 HRESULT WebPreferences::setAllowContinuousSpellChecking(BOOL enabled)
1063 {
1064     setBoolValue(CFSTR(AllowContinuousSpellCheckingPreferenceKey), enabled);
1065     return S_OK;
1066 }
1067
1068 HRESULT WebPreferences::isDOMPasteAllowed(BOOL* enabled)
1069 {
1070     *enabled = boolValueForKey(CFSTR(WebKitDOMPasteAllowedPreferenceKey));
1071     return S_OK;
1072 }
1073     
1074 HRESULT WebPreferences::setDOMPasteAllowed(BOOL enabled)
1075 {
1076     setBoolValue(CFSTR(WebKitDOMPasteAllowedPreferenceKey), enabled);
1077     return S_OK;
1078 }
1079
1080 HRESULT WebPreferences::setDeveloperExtrasEnabled(BOOL enabled)
1081 {
1082     setBoolValue(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey), enabled);
1083     return S_OK;
1084 }
1085
1086 HRESULT WebPreferences::developerExtrasEnabled(BOOL* enabled)
1087 {
1088     if (!enabled)
1089         return E_POINTER;
1090
1091     *enabled = boolValueForKey(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey));
1092     return S_OK;
1093 }
1094
1095 bool WebPreferences::developerExtrasDisabledByOverride()
1096 {
1097     return !!boolValueForKey(CFSTR(DisableWebKitDeveloperExtrasPreferenceKey));
1098 }