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