/* * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "WebKit.h" #include "WebKitDLL.h" #include "WebPreferences.h" #include "WebKit.h" #include "WebNotificationCenter.h" #include "WebPreferenceKeysPrivate.h" #pragma warning( push, 0 ) #include #include #include #include #include #include "WebLocalizableStrings.h" #pragma warning( pop ) #include #include #include #include #include #include #include #include #include using namespace WebCore; static String preferencesPath() { static String path = pathByAppendingComponent(roamingUserSpecificStorageDirectory(), "WebKitPreferences.plist"); return path; } // WebPreferences ---------------------------------------------------------------- CFDictionaryRef WebPreferences::s_defaultSettings = 0; static HashMap webPreferencesInstances; WebPreferences* WebPreferences::sharedStandardPreferences() { static WebPreferences* standardPreferences; if (!standardPreferences) { standardPreferences = WebPreferences::createInstance(); standardPreferences->load(); standardPreferences->setAutosaves(TRUE); } return standardPreferences; } WebPreferences::WebPreferences() : m_refCount(0) , m_autoSaves(0) , m_automaticallyDetectsCacheModel(true) , m_numWebViews(0) { gClassCount++; } WebPreferences::~WebPreferences() { gClassCount--; } WebPreferences* WebPreferences::createInstance() { WebPreferences* instance = new WebPreferences(); instance->AddRef(); return instance; } HRESULT WebPreferences::postPreferencesChangesNotification() { IWebNotificationCenter* nc = WebNotificationCenter::defaultCenterInternal(); HRESULT hr = nc->postNotificationName(webPreferencesChangedNotification(), static_cast(this), 0); if (FAILED(hr)) return hr; return S_OK; } WebPreferences* WebPreferences::getInstanceForIdentifier(BSTR identifier) { if (!identifier) return sharedStandardPreferences(); WebCore::String identifierString(identifier, SysStringLen(identifier)); return webPreferencesInstances.get(identifierString); } void WebPreferences::setInstance(WebPreferences* instance, BSTR identifier) { if (!identifier || !instance) return; WebCore::String identifierString(identifier, SysStringLen(identifier)); webPreferencesInstances.add(identifierString, instance); } void WebPreferences::removeReferenceForIdentifier(BSTR identifier) { if (!identifier || webPreferencesInstances.isEmpty()) return; WebCore::String identifierString(identifier, SysStringLen(identifier)); WebPreferences* webPreference = webPreferencesInstances.get(identifierString); if (webPreference && webPreference->m_refCount == 1) webPreferencesInstances.remove(identifierString); } void WebPreferences::initializeDefaultSettings() { if (s_defaultSettings) return; CFMutableDictionaryRef defaults = CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionaryAddValue(defaults, CFSTR(WebKitStandardFontPreferenceKey), CFSTR("Times New Roman")); CFDictionaryAddValue(defaults, CFSTR(WebKitFixedFontPreferenceKey), CFSTR("Courier New")); CFDictionaryAddValue(defaults, CFSTR(WebKitSerifFontPreferenceKey), CFSTR("Times New Roman")); CFDictionaryAddValue(defaults, CFSTR(WebKitSansSerifFontPreferenceKey), CFSTR("Arial")); CFDictionaryAddValue(defaults, CFSTR(WebKitCursiveFontPreferenceKey), CFSTR("Comic Sans MS")); CFDictionaryAddValue(defaults, CFSTR(WebKitFantasyFontPreferenceKey), CFSTR("Comic Sans MS")); CFDictionaryAddValue(defaults, CFSTR(WebKitMinimumFontSizePreferenceKey), CFSTR("1")); CFDictionaryAddValue(defaults, CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), CFSTR("9")); CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultFontSizePreferenceKey), CFSTR("16")); CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultFixedFontSizePreferenceKey), CFSTR("13")); WebCore::String defaultDefaultEncoding(LPCTSTR_UI_STRING("ISO-8859-1", "The default, default character encoding")); CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), defaultDefaultEncoding.createCFString()); CFDictionaryAddValue(defaults, CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(WebKitUserStyleSheetLocationPreferenceKey), CFSTR("")); CFDictionaryAddValue(defaults, CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(WebKitTextAreasAreResizablePreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(WebKitJavaEnabledPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptEnabledPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitPluginsEnabledPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitAllowAnimatedImagesPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitDisplayImagesKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitBackForwardCacheExpirationIntervalKey), CFSTR("1800")); CFDictionaryAddValue(defaults, CFSTR(WebKitTabToLinksPreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(WebKitRespectStandardStyleKeyEquivalentsPreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(WebKitShowsURLsInToolTipsPreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(WebKitPDFDisplayModePreferenceKey), CFSTR("1")); CFDictionaryAddValue(defaults, CFSTR(WebKitPDFScaleFactorPreferenceKey), CFSTR("0")); RetainPtr linkBehaviorStringRef(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%d"), WebKitEditableLinkDefaultBehavior)); CFDictionaryAddValue(defaults, CFSTR(WebKitEditableLinkBehaviorPreferenceKey), linkBehaviorStringRef.get()); CFDictionaryAddValue(defaults, CFSTR(WebKitHistoryItemLimitKey), CFSTR("1000")); CFDictionaryAddValue(defaults, CFSTR(WebKitHistoryAgeInDaysLimitKey), CFSTR("7")); CFDictionaryAddValue(defaults, CFSTR(WebKitIconDatabaseLocationKey), CFSTR("")); CFDictionaryAddValue(defaults, CFSTR(WebKitIconDatabaseEnabledPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitFontSmothingTypePreferenceKey), CFSTR("2")); CFDictionaryAddValue(defaults, CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), CFSTR("2")); CFDictionaryAddValue(defaults, CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(WebGrammarCheckingEnabledPreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(AllowContinuousSpellCheckingPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitUsesPageCachePreferenceKey), kCFBooleanTrue); RetainPtr cacheModelRef(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%d"), WebCacheModelDocumentViewer)); CFDictionaryAddValue(defaults, CFSTR(WebKitCacheModelPreferenceKey), cacheModelRef.get()); CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultDatabaseQuotaKey), CFSTR("5242880")); // 5 MB CFDictionaryAddValue(defaults, CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey), kCFBooleanTrue); s_defaultSettings = defaults; } const void* WebPreferences::valueForKey(CFStringRef key) { const void* value = CFDictionaryGetValue(m_privatePrefs.get(), key); if (!value) value = CFDictionaryGetValue(s_defaultSettings, key); return value; } BSTR WebPreferences::stringValueForKey(CFStringRef key) { CFStringRef str = (CFStringRef)valueForKey(key); if (!str || (CFGetTypeID(str) != CFStringGetTypeID())) return 0; CFIndex length = CFStringGetLength(str); const UniChar* uniChars = CFStringGetCharactersPtr(str); if (uniChars) return SysAllocStringLen((LPCTSTR)uniChars, length); BSTR bstr = SysAllocStringLen(0, length); if (!bstr) return 0; if (!CFStringGetCString(str, (char*)bstr, (length+1)*sizeof(WCHAR), kCFStringEncodingUTF16)) { SysFreeString(bstr); return 0; } bstr[length] = 0; return bstr; } int WebPreferences::integerValueForKey(CFStringRef key) { CFTypeRef cfVal = (CFStringRef)valueForKey(key); if (!cfVal) return 0; CFTypeID cfType = CFGetTypeID(cfVal); if (cfType == CFStringGetTypeID()) return CFStringGetIntValue((CFStringRef)cfVal); else if (cfType == CFBooleanGetTypeID()) { Boolean boolVal = CFBooleanGetValue((CFBooleanRef)cfVal); return (boolVal) ? 1 : 0; } else if (cfType == CFNumberGetTypeID()) { int val = 0; CFNumberGetValue((CFNumberRef)cfVal, kCFNumberSInt32Type, &val); return val; } return 0; } BOOL WebPreferences::boolValueForKey(CFStringRef key) { return (integerValueForKey(key) != 0); } float WebPreferences::floatValueForKey(CFStringRef key) { CFTypeRef cfVal = (CFStringRef)valueForKey(key); if (!cfVal) return 0.0; CFTypeID cfType = CFGetTypeID(cfVal); if (cfType == CFStringGetTypeID()) return (float)CFStringGetDoubleValue((CFStringRef)cfVal); else if (cfType == CFBooleanGetTypeID()) { Boolean boolVal = CFBooleanGetValue((CFBooleanRef)cfVal); return (boolVal) ? 1.0f : 0.0f; } else if (cfType == CFNumberGetTypeID()) { float val = 0.0; CFNumberGetValue((CFNumberRef)cfVal, kCFNumberFloatType, &val); return val; } return 0.0; } LONGLONG WebPreferences::longlongValueForKey(CFStringRef key) { CFTypeRef cfVal = (CFTypeRef) valueForKey(key); if (!cfVal) return 0; CFTypeID cfType = CFGetTypeID(cfVal); if (cfType == CFStringGetTypeID()) return (LONGLONG) CFStringGetIntValue((CFStringRef)cfVal); else if (cfType == CFBooleanGetTypeID()) { Boolean boolVal = CFBooleanGetValue((CFBooleanRef)cfVal); return (boolVal) ? 1 : 0; } else if (cfType == CFNumberGetTypeID()) { LONGLONG val = 0; CFNumberGetValue((CFNumberRef)cfVal, kCFNumberLongLongType, &val); return val; } return 0; } void WebPreferences::setStringValue(CFStringRef key, LPCTSTR value) { BSTR val = stringValueForKey(key); if (val && !_tcscmp(val, value)) return; SysFreeString(val); RetainPtr valueRef(AdoptCF, CFStringCreateWithCharactersNoCopy(0, (UniChar*)_wcsdup(value), (CFIndex)_tcslen(value), kCFAllocatorMalloc)); CFDictionarySetValue(m_privatePrefs.get(), key, valueRef.get()); if (m_autoSaves) save(); postPreferencesChangesNotification(); } void WebPreferences::setIntegerValue(CFStringRef key, int value) { if (integerValueForKey(key) == value) return; RetainPtr valueRef(AdoptCF, CFNumberCreate(0, kCFNumberSInt32Type, &value)); CFDictionarySetValue(m_privatePrefs.get(), key, valueRef.get()); if (m_autoSaves) save(); postPreferencesChangesNotification(); } void WebPreferences::setBoolValue(CFStringRef key, BOOL value) { if (boolValueForKey(key) == value) return; CFDictionarySetValue(m_privatePrefs.get(), key, value ? kCFBooleanTrue : kCFBooleanFalse); if (m_autoSaves) save(); postPreferencesChangesNotification(); } void WebPreferences::setLongLongValue(CFStringRef key, LONGLONG value) { if (longlongValueForKey(key) == value) return; RetainPtr valueRef(AdoptCF, CFNumberCreate(0, kCFNumberLongLongType, &value)); CFDictionarySetValue(m_privatePrefs.get(), key, valueRef.get()); if (m_autoSaves) save(); postPreferencesChangesNotification(); } BSTR WebPreferences::webPreferencesChangedNotification() { static BSTR webPreferencesChangedNotification = SysAllocString(WebPreferencesChangedNotification); return webPreferencesChangedNotification; } BSTR WebPreferences::webPreferencesRemovedNotification() { static BSTR webPreferencesRemovedNotification = SysAllocString(WebPreferencesRemovedNotification); return webPreferencesRemovedNotification; } void WebPreferences::save() { RetainPtr stream(AdoptCF, CFWriteStreamCreateWithAllocatedBuffers(kCFAllocatorDefault, kCFAllocatorDefault)); if (!stream) return; if (!CFWriteStreamOpen(stream.get())) return; if (!CFPropertyListWriteToStream(m_privatePrefs.get(), stream.get(), kCFPropertyListXMLFormat_v1_0, 0)) { CFWriteStreamClose(stream.get()); return; } CFWriteStreamClose(stream.get()); RetainPtr dataRef(AdoptCF, (CFDataRef)CFWriteStreamCopyProperty(stream.get(), kCFStreamPropertyDataWritten)); if (!dataRef) return; safeCreateFile(preferencesPath(), dataRef.get()); } void WebPreferences::load() { initializeDefaultSettings(); CString path = preferencesPath().utf8(); RetainPtr urlRef(AdoptCF, CFURLCreateFromFileSystemRepresentation(0, reinterpret_cast(path.data()), path.length(), false)); if (!urlRef) return; RetainPtr stream(AdoptCF, CFReadStreamCreateWithFile(0, urlRef.get())); if (!stream) return; if (CFReadStreamOpen(stream.get())) { CFPropertyListFormat format = kCFPropertyListBinaryFormat_v1_0 | kCFPropertyListXMLFormat_v1_0; RetainPtr plist(AdoptCF, CFPropertyListCreateFromStream(0, stream.get(), 0, kCFPropertyListMutableContainersAndLeaves, &format, 0)); CFReadStreamClose(stream.get()); if (CFGetTypeID(plist.get()) == CFDictionaryGetTypeID()) m_privatePrefs.adoptCF(const_cast(reinterpret_cast(plist.releaseRef()))); } if (!m_privatePrefs) m_privatePrefs.adoptCF(CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); migrateDefaultSettingsFromSafari3Beta(); } void WebPreferences::migrateDefaultSettingsFromSafari3Beta() { // The "migration" happening here is a one-time removal of any default values // that were stored in the user's preferences due to . ASSERT(s_defaultSettings); if (!m_privatePrefs) return; CFStringRef didMigrateKey = CFSTR(WebKitDidMigrateDefaultSettingsFromSafari3BetaPreferenceKey); if (boolValueForKey(didMigrateKey)) return; removeValuesMatchingDefaultSettings(); bool oldValue = m_autoSaves; m_autoSaves = true; setBoolValue(didMigrateKey, TRUE); m_autoSaves = oldValue; } void WebPreferences::removeValuesMatchingDefaultSettings() { ASSERT(m_privatePrefs); int count = CFDictionaryGetCount(m_privatePrefs.get()); if (count <= 0) return; Vector keys(count); Vector values(count); CFDictionaryGetKeysAndValues(m_privatePrefs.get(), keys.data(), values.data()); for (int i = 0; i < count; ++i) { if (!values[i]) continue; CFTypeRef defaultValue = CFDictionaryGetValue(s_defaultSettings, keys[i]); if (!defaultValue) continue; if (CFEqual(values[i], defaultValue)) CFDictionaryRemoveValue(m_privatePrefs.get(), keys[i]); } } // IUnknown ------------------------------------------------------------------- HRESULT STDMETHODCALLTYPE WebPreferences::QueryInterface(REFIID riid, void** ppvObject) { *ppvObject = 0; if (IsEqualGUID(riid, IID_IUnknown)) *ppvObject = static_cast(this); else if (IsEqualGUID(riid, IID_IWebPreferences)) *ppvObject = static_cast(this); else if (IsEqualGUID(riid, IID_IWebPreferencesPrivate)) *ppvObject = static_cast(this); else if (IsEqualGUID(riid, CLSID_WebPreferences)) *ppvObject = this; else return E_NOINTERFACE; AddRef(); return S_OK; } ULONG STDMETHODCALLTYPE WebPreferences::AddRef(void) { return ++m_refCount; } ULONG STDMETHODCALLTYPE WebPreferences::Release(void) { ULONG newRef = --m_refCount; if (!newRef) delete(this); return newRef; } // IWebPreferences ------------------------------------------------------------ HRESULT STDMETHODCALLTYPE WebPreferences::standardPreferences( /* [retval][out] */ IWebPreferences** standardPreferences) { if (!standardPreferences) return E_POINTER; *standardPreferences = sharedStandardPreferences(); (*standardPreferences)->AddRef(); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::initWithIdentifier( /* [in] */ BSTR anIdentifier, /* [retval][out] */ IWebPreferences** preferences) { WebPreferences *instance = getInstanceForIdentifier(anIdentifier); if (instance) { *preferences = instance; instance->AddRef(); return S_OK; } load(); *preferences = this; AddRef(); if (anIdentifier) { m_identifier = anIdentifier; setInstance(this, m_identifier); } this->postPreferencesChangesNotification(); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::identifier( /* [retval][out] */ BSTR* ident) { if (!ident) return E_POINTER; *ident = m_identifier ? SysAllocString(m_identifier) : 0; return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::standardFontFamily( /* [retval][out] */ BSTR* family) { *family = stringValueForKey(CFSTR(WebKitStandardFontPreferenceKey)); return (*family) ? S_OK : E_FAIL; } HRESULT STDMETHODCALLTYPE WebPreferences::setStandardFontFamily( /* [in] */ BSTR family) { setStringValue(CFSTR(WebKitStandardFontPreferenceKey), family); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::fixedFontFamily( /* [retval][out] */ BSTR* family) { *family = stringValueForKey(CFSTR(WebKitFixedFontPreferenceKey)); return (*family) ? S_OK : E_FAIL; } HRESULT STDMETHODCALLTYPE WebPreferences::setFixedFontFamily( /* [in] */ BSTR family) { setStringValue(CFSTR(WebKitFixedFontPreferenceKey), family); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::serifFontFamily( /* [retval][out] */ BSTR* fontFamily) { *fontFamily = stringValueForKey(CFSTR(WebKitSerifFontPreferenceKey)); return (*fontFamily) ? S_OK : E_FAIL; } HRESULT STDMETHODCALLTYPE WebPreferences::setSerifFontFamily( /* [in] */ BSTR family) { setStringValue(CFSTR(WebKitSerifFontPreferenceKey), family); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::sansSerifFontFamily( /* [retval][out] */ BSTR* family) { *family = stringValueForKey(CFSTR(WebKitSansSerifFontPreferenceKey)); return (*family) ? S_OK : E_FAIL; } HRESULT STDMETHODCALLTYPE WebPreferences::setSansSerifFontFamily( /* [in] */ BSTR family) { setStringValue(CFSTR(WebKitSansSerifFontPreferenceKey), family); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::cursiveFontFamily( /* [retval][out] */ BSTR* family) { *family = stringValueForKey(CFSTR(WebKitCursiveFontPreferenceKey)); return (*family) ? S_OK : E_FAIL; } HRESULT STDMETHODCALLTYPE WebPreferences::setCursiveFontFamily( /* [in] */ BSTR family) { setStringValue(CFSTR(WebKitCursiveFontPreferenceKey), family); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::fantasyFontFamily( /* [retval][out] */ BSTR* family) { *family = stringValueForKey(CFSTR(WebKitFantasyFontPreferenceKey)); return (*family) ? S_OK : E_FAIL; } HRESULT STDMETHODCALLTYPE WebPreferences::setFantasyFontFamily( /* [in] */ BSTR family) { setStringValue(CFSTR(WebKitFantasyFontPreferenceKey), family); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::defaultFontSize( /* [retval][out] */ int* fontSize) { *fontSize = integerValueForKey(CFSTR(WebKitDefaultFontSizePreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFontSize( /* [in] */ int fontSize) { setIntegerValue(CFSTR(WebKitDefaultFontSizePreferenceKey), fontSize); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::defaultFixedFontSize( /* [retval][out] */ int* fontSize) { *fontSize = integerValueForKey(CFSTR(WebKitDefaultFixedFontSizePreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFixedFontSize( /* [in] */ int fontSize) { setIntegerValue(CFSTR(WebKitDefaultFixedFontSizePreferenceKey), fontSize); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::minimumFontSize( /* [retval][out] */ int* fontSize) { *fontSize = integerValueForKey(CFSTR(WebKitMinimumFontSizePreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumFontSize( /* [in] */ int fontSize) { setIntegerValue(CFSTR(WebKitMinimumFontSizePreferenceKey), fontSize); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::minimumLogicalFontSize( /* [retval][out] */ int* fontSize) { *fontSize = integerValueForKey(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumLogicalFontSize( /* [in] */ int fontSize) { setIntegerValue(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), fontSize); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::defaultTextEncodingName( /* [retval][out] */ BSTR* name) { *name = stringValueForKey(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey)); return (*name) ? S_OK : E_FAIL; } HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultTextEncodingName( /* [in] */ BSTR name) { setStringValue(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), name); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetEnabled( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetEnabled( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetLocation( /* [retval][out] */ BSTR* location) { *location = stringValueForKey(CFSTR(WebKitUserStyleSheetLocationPreferenceKey)); return (*location) ? S_OK : E_FAIL; } HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetLocation( /* [in] */ BSTR location) { setStringValue(CFSTR(WebKitUserStyleSheetLocationPreferenceKey), location); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::isJavaEnabled( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitJavaEnabledPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setJavaEnabled( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitJavaEnabledPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::isJavaScriptEnabled( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitJavaScriptEnabledPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptEnabled( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitJavaScriptEnabledPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::javaScriptCanOpenWindowsAutomatically( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptCanOpenWindowsAutomatically( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::arePlugInsEnabled( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitPluginsEnabledPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setPlugInsEnabled( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitPluginsEnabledPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::allowsAnimatedImages( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImagesPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setAllowsAnimatedImages( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitAllowAnimatedImagesPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::allowAnimatedImageLooping( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setAllowAnimatedImageLooping( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setLoadsImagesAutomatically( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitDisplayImagesKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::loadsImagesAutomatically( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitDisplayImagesKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setAutosaves( /* [in] */ BOOL enabled) { m_autoSaves = !!enabled; return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::autosaves( /* [retval][out] */ BOOL* enabled) { *enabled = m_autoSaves ? TRUE : FALSE; return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setShouldPrintBackgrounds( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::shouldPrintBackgrounds( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setPrivateBrowsingEnabled( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::privateBrowsingEnabled( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setTabsToLinks( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitTabToLinksPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::tabsToLinks( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitTabToLinksPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setUsesPageCache( /* [in] */ BOOL usesPageCache) { setBoolValue(CFSTR(WebKitUsesPageCachePreferenceKey), usesPageCache); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::usesPageCache( /* [retval][out] */ BOOL* usesPageCache) { *usesPageCache = boolValueForKey(CFSTR(WebKitUsesPageCachePreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::textAreasAreResizable( /* [retval][out] */ BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitTextAreasAreResizablePreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setTextAreasAreResizable( /* [in] */ BOOL enabled) { setBoolValue(CFSTR(WebKitTextAreasAreResizablePreferenceKey), enabled); return S_OK; } HRESULT WebPreferences::historyItemLimit(int* limit) { *limit = integerValueForKey(CFSTR(WebKitHistoryItemLimitKey)); return S_OK; } HRESULT WebPreferences::setHistoryItemLimit(int limit) { setIntegerValue(CFSTR(WebKitHistoryItemLimitKey), limit); return S_OK; } HRESULT WebPreferences::historyAgeInDaysLimit(int* limit) { *limit = integerValueForKey(CFSTR(WebKitHistoryAgeInDaysLimitKey)); return S_OK; } HRESULT WebPreferences::setHistoryAgeInDaysLimit(int limit) { setIntegerValue(CFSTR(WebKitHistoryAgeInDaysLimitKey), limit); return S_OK; } HRESULT WebPreferences::unused1() { ASSERT_NOT_REACHED(); return E_FAIL; } HRESULT WebPreferences::unused2() { ASSERT_NOT_REACHED(); return E_FAIL; } HRESULT WebPreferences::iconDatabaseLocation( /* [out] */ BSTR* location) { *location = stringValueForKey(CFSTR(WebKitIconDatabaseLocationKey)); return (*location) ? S_OK : E_FAIL; } HRESULT WebPreferences::setIconDatabaseLocation( /* [in] */ BSTR location) { setStringValue(CFSTR(WebKitIconDatabaseLocationKey), location); return S_OK; } HRESULT WebPreferences::iconDatabaseEnabled(BOOL* enabled)//location) { *enabled = boolValueForKey(CFSTR(WebKitIconDatabaseEnabledPreferenceKey)); return S_OK; } HRESULT WebPreferences::setIconDatabaseEnabled(BOOL enabled )//location) { setBoolValue(CFSTR(WebKitIconDatabaseEnabledPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::fontSmoothing( /* [retval][out] */ FontSmoothingType* smoothingType) { *smoothingType = (FontSmoothingType) integerValueForKey(CFSTR(WebKitFontSmothingTypePreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setFontSmoothing( /* [in] */ FontSmoothingType smoothingType) { setIntegerValue(CFSTR(WebKitFontSmothingTypePreferenceKey), smoothingType); wkSetFontSmoothingLevel((int)smoothingType); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::editableLinkBehavior( /* [out, retval] */ WebKitEditableLinkBehavior* editableLinkBehavior) { WebKitEditableLinkBehavior value = (WebKitEditableLinkBehavior) integerValueForKey(CFSTR(WebKitEditableLinkBehaviorPreferenceKey)); switch (value) { case WebKitEditableLinkDefaultBehavior: case WebKitEditableLinkAlwaysLive: case WebKitEditableLinkOnlyLiveWithShiftKey: case WebKitEditableLinkLiveWhenNotFocused: case WebKitEditableLinkNeverLive: *editableLinkBehavior = value; break; default: // ensure that a valid result is returned *editableLinkBehavior = WebKitEditableLinkDefaultBehavior; break; } return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setEditableLinkBehavior( /* [in] */ WebKitEditableLinkBehavior behavior) { setIntegerValue(CFSTR(WebKitEditableLinkBehaviorPreferenceKey), behavior); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::cookieStorageAcceptPolicy( /* [retval][out] */ WebKitCookieStorageAcceptPolicy *acceptPolicy ) { if (!acceptPolicy) return E_POINTER; *acceptPolicy = (WebKitCookieStorageAcceptPolicy)integerValueForKey(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey)); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setCookieStorageAcceptPolicy( /* [in] */ WebKitCookieStorageAcceptPolicy acceptPolicy) { setIntegerValue(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), acceptPolicy); return S_OK; } HRESULT WebPreferences::continuousSpellCheckingEnabled(BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey)); return S_OK; } HRESULT WebPreferences::setContinuousSpellCheckingEnabled(BOOL enabled) { setBoolValue(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), enabled); return S_OK; } HRESULT WebPreferences::grammarCheckingEnabled(BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebGrammarCheckingEnabledPreferenceKey)); return S_OK; } HRESULT WebPreferences::setGrammarCheckingEnabled(BOOL enabled) { setBoolValue(CFSTR(WebGrammarCheckingEnabledPreferenceKey), enabled); return S_OK; } HRESULT WebPreferences::allowContinuousSpellChecking(BOOL* enabled) { *enabled = boolValueForKey(CFSTR(AllowContinuousSpellCheckingPreferenceKey)); return S_OK; } HRESULT WebPreferences::setAllowContinuousSpellChecking(BOOL enabled) { setBoolValue(CFSTR(AllowContinuousSpellCheckingPreferenceKey), enabled); return S_OK; } HRESULT WebPreferences::isDOMPasteAllowed(BOOL* enabled) { *enabled = boolValueForKey(CFSTR(WebKitDOMPasteAllowedPreferenceKey)); return S_OK; } HRESULT WebPreferences::setDOMPasteAllowed(BOOL enabled) { setBoolValue(CFSTR(WebKitDOMPasteAllowedPreferenceKey), enabled); return S_OK; } HRESULT WebPreferences::cacheModel(WebCacheModel* cacheModel) { if (!cacheModel) return E_POINTER; *cacheModel = (WebCacheModel)integerValueForKey(CFSTR(WebKitCacheModelPreferenceKey)); return S_OK; } HRESULT WebPreferences::setCacheModel(WebCacheModel cacheModel) { setIntegerValue(CFSTR(WebKitCacheModelPreferenceKey), cacheModel); return S_OK; } HRESULT WebPreferences::setDeveloperExtrasEnabled(BOOL enabled) { setBoolValue(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey), enabled); return S_OK; } HRESULT WebPreferences::developerExtrasEnabled(BOOL* enabled) { if (!enabled) return E_POINTER; *enabled = boolValueForKey(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey)); return S_OK; } bool WebPreferences::developerExtrasDisabledByOverride() { return !!boolValueForKey(CFSTR(DisableWebKitDeveloperExtrasPreferenceKey)); } HRESULT WebPreferences::setAutomaticallyDetectsCacheModel(BOOL automaticallyDetectsCacheModel) { m_automaticallyDetectsCacheModel = !!automaticallyDetectsCacheModel; return S_OK; } HRESULT WebPreferences::automaticallyDetectsCacheModel(BOOL* automaticallyDetectsCacheModel) { if (!automaticallyDetectsCacheModel) return E_POINTER; *automaticallyDetectsCacheModel = m_automaticallyDetectsCacheModel; return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::defaultDatabaseQuota(unsigned long long* quota) { if (!quota) return E_POINTER; long long value = longlongValueForKey(CFSTR(WebKitDefaultDatabaseQuotaKey)); if (value < 0 || value > LLONG_MAX) { value = 0; setDefaultDatabaseQuota(0); } *quota = value; return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultDatabaseQuota(unsigned long long quota) { if (quota > LLONG_MAX) quota = 0; setLongLongValue(CFSTR(WebKitDefaultDatabaseQuotaKey), quota); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::setAuthorAndUserStylesEnabled(BOOL enabled) { setBoolValue(CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey), enabled); return S_OK; } HRESULT STDMETHODCALLTYPE WebPreferences::authorAndUserStylesEnabled(BOOL* enabled) { if (!enabled) return E_POINTER; *enabled = boolValueForKey(CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey)); return S_OK; } void WebPreferences::willAddToWebView() { ++m_numWebViews; } void WebPreferences::didRemoveFromWebView() { ASSERT(m_numWebViews); if (--m_numWebViews == 0) { IWebNotificationCenter* nc = WebNotificationCenter::defaultCenterInternal(); nc->postNotificationName(webPreferencesRemovedNotification(), static_cast(this), 0); } }