1/* 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "WebKit.h" 28#include "WebKitDLL.h" 29#include "WebPreferences.h" 30 31#include "COMPtr.h" 32#include "WebNotificationCenter.h" 33#include "WebPreferenceKeysPrivate.h" 34 35#include <WebCore/CString.h> 36#include <WebCore/FileSystem.h> 37#include <WebCore/Font.h> 38#include <WebCore/PlatformString.h> 39#include <WebCore/StringHash.h> 40#include <WebCore/WKCACFLayerRenderer.h> 41#include "WebLocalizableStrings.h" 42 43#include <CoreFoundation/CoreFoundation.h> 44#include <limits> 45#include <shlobj.h> 46#include <tchar.h> 47#include <wtf/HashMap.h> 48#include <wtf/OwnArrayPtr.h> 49 50#if PLATFORM(CG) 51#include <CoreGraphics/CoreGraphics.h> 52#include <WebKitSystemInterface/WebKitSystemInterface.h> 53#endif 54 55using namespace WebCore; 56using std::numeric_limits; 57 58static const String& oldPreferencesPath() 59{ 60 static String path = pathByAppendingComponent(roamingUserSpecificStorageDirectory(), "WebKitPreferences.plist"); 61 return path; 62} 63 64template<typename NumberType> struct CFNumberTraits { static const unsigned Type; }; 65template<> struct CFNumberTraits<int> { static const unsigned Type = kCFNumberSInt32Type; }; 66template<> struct CFNumberTraits<LONGLONG> { static const unsigned Type = kCFNumberLongLongType; }; 67template<> struct CFNumberTraits<float> { static const unsigned Type = kCFNumberFloat32Type; }; 68 69template<typename NumberType> 70static NumberType numberValueForPreferencesValue(CFPropertyListRef value) 71{ 72 if (!value) 73 return 0; 74 75 CFTypeID cfType = CFGetTypeID(value); 76 if (cfType == CFStringGetTypeID()) 77 return static_cast<NumberType>(CFStringGetIntValue(static_cast<CFStringRef>(value))); 78 else if (cfType == CFBooleanGetTypeID()) { 79 Boolean boolVal = CFBooleanGetValue(static_cast<CFBooleanRef>(value)); 80 return boolVal ? 1 : 0; 81 } else if (cfType == CFNumberGetTypeID()) { 82 NumberType val = 0; 83 CFNumberGetValue(static_cast<CFNumberRef>(value), CFNumberTraits<NumberType>::Type, &val); 84 return val; 85 } 86 87 return 0; 88} 89 90template<typename NumberType> 91static RetainPtr<CFNumberRef> cfNumber(NumberType value) 92{ 93 return RetainPtr<CFNumberRef>(AdoptCF, CFNumberCreate(0, CFNumberTraits<NumberType>::Type, &value)); 94} 95 96static bool booleanValueForPreferencesValue(CFPropertyListRef value) 97{ 98 return numberValueForPreferencesValue<int>(value); 99} 100 101// WebPreferences ---------------------------------------------------------------- 102 103static CFDictionaryRef defaultSettings; 104 105static HashMap<WebCore::String, COMPtr<WebPreferences> > webPreferencesInstances; 106 107WebPreferences* WebPreferences::sharedStandardPreferences() 108{ 109 static WebPreferences* standardPreferences; 110 if (!standardPreferences) { 111 standardPreferences = WebPreferences::createInstance(); 112 standardPreferences->setAutosaves(TRUE); 113 standardPreferences->load(); 114 } 115 116 return standardPreferences; 117} 118 119WebPreferences::WebPreferences() 120 : m_refCount(0) 121 , m_autoSaves(0) 122 , m_automaticallyDetectsCacheModel(true) 123 , m_numWebViews(0) 124{ 125 gClassCount++; 126 gClassNameCount.add("WebPreferences"); 127} 128 129WebPreferences::~WebPreferences() 130{ 131 gClassCount--; 132 gClassNameCount.remove("WebPreferences"); 133} 134 135WebPreferences* WebPreferences::createInstance() 136{ 137 WebPreferences* instance = new WebPreferences(); 138 instance->AddRef(); 139 return instance; 140} 141 142HRESULT WebPreferences::postPreferencesChangesNotification() 143{ 144 IWebNotificationCenter* nc = WebNotificationCenter::defaultCenterInternal(); 145 HRESULT hr = nc->postNotificationName(webPreferencesChangedNotification(), static_cast<IWebPreferences*>(this), 0); 146 if (FAILED(hr)) 147 return hr; 148 149 return S_OK; 150} 151 152WebPreferences* WebPreferences::getInstanceForIdentifier(BSTR identifier) 153{ 154 if (!identifier) 155 return sharedStandardPreferences(); 156 157 WebCore::String identifierString(identifier, SysStringLen(identifier)); 158 return webPreferencesInstances.get(identifierString).get(); 159} 160 161void WebPreferences::setInstance(WebPreferences* instance, BSTR identifier) 162{ 163 if (!identifier || !instance) 164 return; 165 WebCore::String identifierString(identifier, SysStringLen(identifier)); 166 webPreferencesInstances.add(identifierString, instance); 167} 168 169void WebPreferences::removeReferenceForIdentifier(BSTR identifier) 170{ 171 if (!identifier || webPreferencesInstances.isEmpty()) 172 return; 173 174 WebCore::String identifierString(identifier, SysStringLen(identifier)); 175 WebPreferences* webPreference = webPreferencesInstances.get(identifierString).get(); 176 if (webPreference && webPreference->m_refCount == 1) 177 webPreferencesInstances.remove(identifierString); 178} 179 180void WebPreferences::initializeDefaultSettings() 181{ 182 if (defaultSettings) 183 return; 184 185 CFMutableDictionaryRef defaults = CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 186 187 CFDictionaryAddValue(defaults, CFSTR(WebKitStandardFontPreferenceKey), CFSTR("Times New Roman")); 188 CFDictionaryAddValue(defaults, CFSTR(WebKitFixedFontPreferenceKey), CFSTR("Courier New")); 189 CFDictionaryAddValue(defaults, CFSTR(WebKitSerifFontPreferenceKey), CFSTR("Times New Roman")); 190 CFDictionaryAddValue(defaults, CFSTR(WebKitSansSerifFontPreferenceKey), CFSTR("Arial")); 191 CFDictionaryAddValue(defaults, CFSTR(WebKitCursiveFontPreferenceKey), CFSTR("Comic Sans MS")); 192 CFDictionaryAddValue(defaults, CFSTR(WebKitFantasyFontPreferenceKey), CFSTR("Comic Sans MS")); 193 CFDictionaryAddValue(defaults, CFSTR(WebKitMinimumFontSizePreferenceKey), CFSTR("1")); 194 CFDictionaryAddValue(defaults, CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), CFSTR("9")); 195 CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultFontSizePreferenceKey), CFSTR("16")); 196 CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultFixedFontSizePreferenceKey), CFSTR("13")); 197 WebCore::String defaultDefaultEncoding(LPCTSTR_UI_STRING("ISO-8859-1", "The default, default character encoding")); 198 CFDictionaryAddValue(defaults, CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), defaultDefaultEncoding.createCFString()); 199 200 CFDictionaryAddValue(defaults, CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), kCFBooleanFalse); 201 CFDictionaryAddValue(defaults, CFSTR(WebKitUserStyleSheetLocationPreferenceKey), CFSTR("")); 202 CFDictionaryAddValue(defaults, CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), kCFBooleanFalse); 203 CFDictionaryAddValue(defaults, CFSTR(WebKitTextAreasAreResizablePreferenceKey), kCFBooleanFalse); 204 CFDictionaryAddValue(defaults, CFSTR(WebKitJavaEnabledPreferenceKey), kCFBooleanTrue); 205 CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptEnabledPreferenceKey), kCFBooleanTrue); 206 CFDictionaryAddValue(defaults, CFSTR(WebKitWebSecurityEnabledPreferenceKey), kCFBooleanTrue); 207 CFDictionaryAddValue(defaults, CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey), kCFBooleanFalse); 208 CFDictionaryAddValue(defaults, CFSTR(WebKitXSSAuditorEnabledPreferenceKey), kCFBooleanTrue); 209 CFDictionaryAddValue(defaults, CFSTR(WebKitFrameSetFlatteningEnabledPreferenceKey), kCFBooleanFalse); 210 CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), kCFBooleanTrue); 211 CFDictionaryAddValue(defaults, CFSTR(WebKitPluginsEnabledPreferenceKey), kCFBooleanTrue); 212 CFDictionaryAddValue(defaults, CFSTR(WebKitDatabasesEnabledPreferenceKey), kCFBooleanTrue); 213 CFDictionaryAddValue(defaults, CFSTR(WebKitLocalStorageEnabledPreferenceKey), kCFBooleanTrue); 214 CFDictionaryAddValue(defaults, CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey), kCFBooleanFalse); 215 CFDictionaryAddValue(defaults, CFSTR(WebKitZoomsTextOnlyPreferenceKey), kCFBooleanTrue); 216 CFDictionaryAddValue(defaults, CFSTR(WebKitAllowAnimatedImagesPreferenceKey), kCFBooleanTrue); 217 CFDictionaryAddValue(defaults, CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), kCFBooleanTrue); 218 CFDictionaryAddValue(defaults, CFSTR(WebKitDisplayImagesKey), kCFBooleanTrue); 219 CFDictionaryAddValue(defaults, CFSTR(WebKitBackForwardCacheExpirationIntervalKey), CFSTR("1800")); 220 CFDictionaryAddValue(defaults, CFSTR(WebKitTabToLinksPreferenceKey), kCFBooleanFalse); 221 CFDictionaryAddValue(defaults, CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), kCFBooleanFalse); 222 CFDictionaryAddValue(defaults, CFSTR(WebKitRespectStandardStyleKeyEquivalentsPreferenceKey), kCFBooleanFalse); 223 CFDictionaryAddValue(defaults, CFSTR(WebKitShowsURLsInToolTipsPreferenceKey), kCFBooleanFalse); 224 CFDictionaryAddValue(defaults, CFSTR(WebKitPDFDisplayModePreferenceKey), CFSTR("1")); 225 CFDictionaryAddValue(defaults, CFSTR(WebKitPDFScaleFactorPreferenceKey), CFSTR("0")); 226 227 RetainPtr<CFStringRef> linkBehaviorStringRef(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%d"), WebKitEditableLinkDefaultBehavior)); 228 CFDictionaryAddValue(defaults, CFSTR(WebKitEditableLinkBehaviorPreferenceKey), linkBehaviorStringRef.get()); 229 230 CFDictionaryAddValue(defaults, CFSTR(WebKitHistoryItemLimitKey), CFSTR("1000")); 231 CFDictionaryAddValue(defaults, CFSTR(WebKitHistoryAgeInDaysLimitKey), CFSTR("7")); 232 CFDictionaryAddValue(defaults, CFSTR(WebKitIconDatabaseLocationKey), CFSTR("")); 233 CFDictionaryAddValue(defaults, CFSTR(WebKitIconDatabaseEnabledPreferenceKey), kCFBooleanTrue); 234 CFDictionaryAddValue(defaults, CFSTR(WebKitFontSmoothingTypePreferenceKey), CFSTR("2")); 235 CFDictionaryAddValue(defaults, CFSTR(WebKitFontSmoothingContrastPreferenceKey), CFSTR("2")); 236 CFDictionaryAddValue(defaults, CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), CFSTR("2")); 237 CFDictionaryAddValue(defaults, CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), kCFBooleanFalse); 238 CFDictionaryAddValue(defaults, CFSTR(WebGrammarCheckingEnabledPreferenceKey), kCFBooleanFalse); 239 CFDictionaryAddValue(defaults, CFSTR(AllowContinuousSpellCheckingPreferenceKey), kCFBooleanTrue); 240 CFDictionaryAddValue(defaults, CFSTR(WebKitUsesPageCachePreferenceKey), kCFBooleanTrue); 241 CFDictionaryAddValue(defaults, CFSTR(WebKitLocalStorageDatabasePathPreferenceKey), CFSTR("")); 242 243 RetainPtr<CFStringRef> cacheModelRef(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%d"), WebCacheModelDocumentViewer)); 244 CFDictionaryAddValue(defaults, CFSTR(WebKitCacheModelPreferenceKey), cacheModelRef.get()); 245 246 CFDictionaryAddValue(defaults, CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey), kCFBooleanTrue); 247 CFDictionaryAddValue(defaults, CFSTR(WebKitApplicationChromeModePreferenceKey), kCFBooleanFalse); 248 249 CFDictionaryAddValue(defaults, CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey), kCFBooleanFalse); 250 251 CFDictionaryAddValue(defaults, CFSTR(WebKitPaintNativeControlsPreferenceKey), kCFBooleanTrue); 252 253 CFDictionaryAddValue(defaults, CFSTR(WebKitUseHighResolutionTimersPreferenceKey), kCFBooleanTrue); 254 255 RetainPtr<CFStringRef> pluginAllowedRunTime(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%u"), numeric_limits<unsigned>::max())); 256 CFDictionaryAddValue(defaults, CFSTR(WebKitPluginAllowedRunTimePreferenceKey), pluginAllowedRunTime.get()); 257 258 CFDictionaryAddValue(defaults, CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey), kCFBooleanTrue); 259 260 defaultSettings = defaults; 261} 262 263RetainPtr<CFPropertyListRef> WebPreferences::valueForKey(CFStringRef key) 264{ 265 RetainPtr<CFPropertyListRef> value = CFDictionaryGetValue(m_privatePrefs.get(), key); 266 if (value) 267 return value; 268 269 value.adoptCF(CFPreferencesCopyAppValue(key, kCFPreferencesCurrentApplication)); 270 if (value) 271 return value; 272 273 return CFDictionaryGetValue(defaultSettings, key); 274} 275 276void WebPreferences::setValueForKey(CFStringRef key, CFPropertyListRef value) 277{ 278 CFDictionarySetValue(m_privatePrefs.get(), key, value); 279 if (m_autoSaves) { 280 CFPreferencesSetAppValue(key, value, kCFPreferencesCurrentApplication); 281 save(); 282 } 283} 284 285BSTR WebPreferences::stringValueForKey(CFStringRef key) 286{ 287 RetainPtr<CFPropertyListRef> value = valueForKey(key); 288 289 if (!value || (CFGetTypeID(value.get()) != CFStringGetTypeID())) 290 return 0; 291 292 CFStringRef str = static_cast<CFStringRef>(value.get()); 293 294 CFIndex length = CFStringGetLength(str); 295 const UniChar* uniChars = CFStringGetCharactersPtr(str); 296 if (uniChars) 297 return SysAllocStringLen((LPCTSTR)uniChars, length); 298 299 BSTR bstr = SysAllocStringLen(0, length); 300 if (!bstr) 301 return 0; 302 303 if (!CFStringGetCString(str, (char*)bstr, (length+1)*sizeof(WCHAR), kCFStringEncodingUTF16)) { 304 SysFreeString(bstr); 305 return 0; 306 } 307 308 bstr[length] = 0; 309 return bstr; 310} 311 312int WebPreferences::integerValueForKey(CFStringRef key) 313{ 314 return numberValueForPreferencesValue<int>(valueForKey(key).get()); 315} 316 317BOOL WebPreferences::boolValueForKey(CFStringRef key) 318{ 319 return booleanValueForPreferencesValue(valueForKey(key).get()); 320} 321 322float WebPreferences::floatValueForKey(CFStringRef key) 323{ 324 return numberValueForPreferencesValue<float>(valueForKey(key).get()); 325} 326 327LONGLONG WebPreferences::longlongValueForKey(CFStringRef key) 328{ 329 return numberValueForPreferencesValue<LONGLONG>(valueForKey(key).get()); 330} 331 332void WebPreferences::setStringValue(CFStringRef key, LPCTSTR value) 333{ 334 BSTR val = stringValueForKey(key); 335 if (val && !_tcscmp(val, value)) 336 return; 337 SysFreeString(val); 338 339 RetainPtr<CFStringRef> valueRef(AdoptCF, 340 CFStringCreateWithCharactersNoCopy(0, (UniChar*)_wcsdup(value), (CFIndex)_tcslen(value), kCFAllocatorMalloc)); 341 setValueForKey(key, valueRef.get()); 342 343 postPreferencesChangesNotification(); 344} 345 346void WebPreferences::setIntegerValue(CFStringRef key, int value) 347{ 348 if (integerValueForKey(key) == value) 349 return; 350 351 setValueForKey(key, cfNumber(value).get()); 352 353 postPreferencesChangesNotification(); 354} 355 356void WebPreferences::setFloatValue(CFStringRef key, float value) 357{ 358 if (floatValueForKey(key) == value) 359 return; 360 361 setValueForKey(key, cfNumber(value).get()); 362 363 postPreferencesChangesNotification(); 364} 365 366void WebPreferences::setBoolValue(CFStringRef key, BOOL value) 367{ 368 if (boolValueForKey(key) == value) 369 return; 370 371 setValueForKey(key, value ? kCFBooleanTrue : kCFBooleanFalse); 372 373 postPreferencesChangesNotification(); 374} 375 376void WebPreferences::setLongLongValue(CFStringRef key, LONGLONG value) 377{ 378 if (longlongValueForKey(key) == value) 379 return; 380 381 setValueForKey(key, cfNumber(value).get()); 382 383 postPreferencesChangesNotification(); 384} 385 386BSTR WebPreferences::webPreferencesChangedNotification() 387{ 388 static BSTR webPreferencesChangedNotification = SysAllocString(WebPreferencesChangedNotification); 389 return webPreferencesChangedNotification; 390} 391 392BSTR WebPreferences::webPreferencesRemovedNotification() 393{ 394 static BSTR webPreferencesRemovedNotification = SysAllocString(WebPreferencesRemovedNotification); 395 return webPreferencesRemovedNotification; 396} 397 398void WebPreferences::save() 399{ 400 CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); 401} 402 403void WebPreferences::load() 404{ 405 initializeDefaultSettings(); 406 407 m_privatePrefs.adoptCF(CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); 408 409 migrateWebKitPreferencesToCFPreferences(); 410} 411 412void WebPreferences::migrateWebKitPreferencesToCFPreferences() 413{ 414 CFStringRef didMigrateKey = CFSTR(WebKitDidMigrateWebKitPreferencesToCFPreferencesPreferenceKey); 415 if (boolValueForKey(didMigrateKey)) 416 return; 417 bool oldValue = m_autoSaves; 418 m_autoSaves = true; 419 setBoolValue(didMigrateKey, TRUE); 420 m_autoSaves = oldValue; 421 422 CString path = oldPreferencesPath().utf8(); 423 424 RetainPtr<CFURLRef> urlRef(AdoptCF, CFURLCreateFromFileSystemRepresentation(0, reinterpret_cast<const UInt8*>(path.data()), path.length(), false)); 425 if (!urlRef) 426 return; 427 428 RetainPtr<CFReadStreamRef> stream(AdoptCF, CFReadStreamCreateWithFile(0, urlRef.get())); 429 if (!stream) 430 return; 431 432 if (!CFReadStreamOpen(stream.get())) 433 return; 434 435 CFPropertyListFormat format = kCFPropertyListBinaryFormat_v1_0 | kCFPropertyListXMLFormat_v1_0; 436 RetainPtr<CFPropertyListRef> plist(AdoptCF, CFPropertyListCreateFromStream(0, stream.get(), 0, kCFPropertyListMutableContainersAndLeaves, &format, 0)); 437 CFReadStreamClose(stream.get()); 438 439 if (!plist || CFGetTypeID(plist.get()) != CFDictionaryGetTypeID()) 440 return; 441 442 copyWebKitPreferencesToCFPreferences(static_cast<CFDictionaryRef>(plist.get())); 443 444 deleteFile(oldPreferencesPath()); 445} 446 447void WebPreferences::copyWebKitPreferencesToCFPreferences(CFDictionaryRef dict) 448{ 449 ASSERT_ARG(dict, dict); 450 451 int count = CFDictionaryGetCount(dict); 452 if (count <= 0) 453 return; 454 455 CFStringRef didRemoveDefaultsKey = CFSTR(WebKitDidMigrateDefaultSettingsFromSafari3BetaPreferenceKey); 456 bool omitDefaults = !booleanValueForPreferencesValue(CFDictionaryGetValue(dict, didRemoveDefaultsKey)); 457 458 OwnArrayPtr<CFTypeRef> keys(new CFTypeRef[count]); 459 OwnArrayPtr<CFTypeRef> values(new CFTypeRef[count]); 460 CFDictionaryGetKeysAndValues(dict, keys.get(), values.get()); 461 462 for (int i = 0; i < count; ++i) { 463 if (!keys[i] || !values[i] || CFGetTypeID(keys[i]) != CFStringGetTypeID()) 464 continue; 465 466 if (omitDefaults) { 467 CFTypeRef defaultValue = CFDictionaryGetValue(defaultSettings, keys[i]); 468 if (defaultValue && CFEqual(defaultValue, values[i])) 469 continue; 470 } 471 472 setValueForKey(static_cast<CFStringRef>(keys[i]), values[i]); 473 } 474} 475 476// IUnknown ------------------------------------------------------------------- 477 478HRESULT STDMETHODCALLTYPE WebPreferences::QueryInterface(REFIID riid, void** ppvObject) 479{ 480 *ppvObject = 0; 481 if (IsEqualGUID(riid, IID_IUnknown)) 482 *ppvObject = static_cast<IWebPreferences*>(this); 483 else if (IsEqualGUID(riid, IID_IWebPreferences)) 484 *ppvObject = static_cast<IWebPreferences*>(this); 485 else if (IsEqualGUID(riid, IID_IWebPreferencesPrivate)) 486 *ppvObject = static_cast<IWebPreferencesPrivate*>(this); 487 else if (IsEqualGUID(riid, CLSID_WebPreferences)) 488 *ppvObject = this; 489 else 490 return E_NOINTERFACE; 491 492 AddRef(); 493 return S_OK; 494} 495 496ULONG STDMETHODCALLTYPE WebPreferences::AddRef(void) 497{ 498 return ++m_refCount; 499} 500 501ULONG STDMETHODCALLTYPE WebPreferences::Release(void) 502{ 503 ULONG newRef = --m_refCount; 504 if (!newRef) 505 delete(this); 506 507 return newRef; 508} 509 510// IWebPreferences ------------------------------------------------------------ 511 512HRESULT STDMETHODCALLTYPE WebPreferences::standardPreferences( 513 /* [retval][out] */ IWebPreferences** standardPreferences) 514{ 515 if (!standardPreferences) 516 return E_POINTER; 517 *standardPreferences = sharedStandardPreferences(); 518 (*standardPreferences)->AddRef(); 519 return S_OK; 520} 521 522HRESULT STDMETHODCALLTYPE WebPreferences::initWithIdentifier( 523 /* [in] */ BSTR anIdentifier, 524 /* [retval][out] */ IWebPreferences** preferences) 525{ 526 WebPreferences *instance = getInstanceForIdentifier(anIdentifier); 527 if (instance) { 528 *preferences = instance; 529 instance->AddRef(); 530 return S_OK; 531 } 532 533 load(); 534 535 *preferences = this; 536 AddRef(); 537 538 if (anIdentifier) { 539 m_identifier = anIdentifier; 540 setInstance(this, m_identifier); 541 } 542 543 this->postPreferencesChangesNotification(); 544 545 return S_OK; 546} 547 548HRESULT STDMETHODCALLTYPE WebPreferences::identifier( 549 /* [retval][out] */ BSTR* ident) 550{ 551 if (!ident) 552 return E_POINTER; 553 *ident = m_identifier ? SysAllocString(m_identifier) : 0; 554 return S_OK; 555} 556 557HRESULT STDMETHODCALLTYPE WebPreferences::standardFontFamily( 558 /* [retval][out] */ BSTR* family) 559{ 560 *family = stringValueForKey(CFSTR(WebKitStandardFontPreferenceKey)); 561 return (*family) ? S_OK : E_FAIL; 562} 563 564HRESULT STDMETHODCALLTYPE WebPreferences::setStandardFontFamily( 565 /* [in] */ BSTR family) 566{ 567 setStringValue(CFSTR(WebKitStandardFontPreferenceKey), family); 568 return S_OK; 569} 570 571HRESULT STDMETHODCALLTYPE WebPreferences::fixedFontFamily( 572 /* [retval][out] */ BSTR* family) 573{ 574 *family = stringValueForKey(CFSTR(WebKitFixedFontPreferenceKey)); 575 return (*family) ? S_OK : E_FAIL; 576} 577 578HRESULT STDMETHODCALLTYPE WebPreferences::setFixedFontFamily( 579 /* [in] */ BSTR family) 580{ 581 setStringValue(CFSTR(WebKitFixedFontPreferenceKey), family); 582 return S_OK; 583} 584 585HRESULT STDMETHODCALLTYPE WebPreferences::serifFontFamily( 586 /* [retval][out] */ BSTR* fontFamily) 587{ 588 *fontFamily = stringValueForKey(CFSTR(WebKitSerifFontPreferenceKey)); 589 return (*fontFamily) ? S_OK : E_FAIL; 590} 591 592HRESULT STDMETHODCALLTYPE WebPreferences::setSerifFontFamily( 593 /* [in] */ BSTR family) 594{ 595 setStringValue(CFSTR(WebKitSerifFontPreferenceKey), family); 596 return S_OK; 597} 598 599HRESULT STDMETHODCALLTYPE WebPreferences::sansSerifFontFamily( 600 /* [retval][out] */ BSTR* family) 601{ 602 *family = stringValueForKey(CFSTR(WebKitSansSerifFontPreferenceKey)); 603 return (*family) ? S_OK : E_FAIL; 604} 605 606HRESULT STDMETHODCALLTYPE WebPreferences::setSansSerifFontFamily( 607 /* [in] */ BSTR family) 608{ 609 setStringValue(CFSTR(WebKitSansSerifFontPreferenceKey), family); 610 return S_OK; 611} 612 613HRESULT STDMETHODCALLTYPE WebPreferences::cursiveFontFamily( 614 /* [retval][out] */ BSTR* family) 615{ 616 *family = stringValueForKey(CFSTR(WebKitCursiveFontPreferenceKey)); 617 return (*family) ? S_OK : E_FAIL; 618} 619 620HRESULT STDMETHODCALLTYPE WebPreferences::setCursiveFontFamily( 621 /* [in] */ BSTR family) 622{ 623 setStringValue(CFSTR(WebKitCursiveFontPreferenceKey), family); 624 return S_OK; 625} 626 627HRESULT STDMETHODCALLTYPE WebPreferences::fantasyFontFamily( 628 /* [retval][out] */ BSTR* family) 629{ 630 *family = stringValueForKey(CFSTR(WebKitFantasyFontPreferenceKey)); 631 return (*family) ? S_OK : E_FAIL; 632} 633 634HRESULT STDMETHODCALLTYPE WebPreferences::setFantasyFontFamily( 635 /* [in] */ BSTR family) 636{ 637 setStringValue(CFSTR(WebKitFantasyFontPreferenceKey), family); 638 return S_OK; 639} 640 641HRESULT STDMETHODCALLTYPE WebPreferences::defaultFontSize( 642 /* [retval][out] */ int* fontSize) 643{ 644 *fontSize = integerValueForKey(CFSTR(WebKitDefaultFontSizePreferenceKey)); 645 return S_OK; 646} 647 648HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFontSize( 649 /* [in] */ int fontSize) 650{ 651 setIntegerValue(CFSTR(WebKitDefaultFontSizePreferenceKey), fontSize); 652 return S_OK; 653} 654 655HRESULT STDMETHODCALLTYPE WebPreferences::defaultFixedFontSize( 656 /* [retval][out] */ int* fontSize) 657{ 658 *fontSize = integerValueForKey(CFSTR(WebKitDefaultFixedFontSizePreferenceKey)); 659 return S_OK; 660} 661 662HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultFixedFontSize( 663 /* [in] */ int fontSize) 664{ 665 setIntegerValue(CFSTR(WebKitDefaultFixedFontSizePreferenceKey), fontSize); 666 return S_OK; 667} 668 669HRESULT STDMETHODCALLTYPE WebPreferences::minimumFontSize( 670 /* [retval][out] */ int* fontSize) 671{ 672 *fontSize = integerValueForKey(CFSTR(WebKitMinimumFontSizePreferenceKey)); 673 return S_OK; 674} 675 676HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumFontSize( 677 /* [in] */ int fontSize) 678{ 679 setIntegerValue(CFSTR(WebKitMinimumFontSizePreferenceKey), fontSize); 680 return S_OK; 681} 682 683HRESULT STDMETHODCALLTYPE WebPreferences::minimumLogicalFontSize( 684 /* [retval][out] */ int* fontSize) 685{ 686 *fontSize = integerValueForKey(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey)); 687 return S_OK; 688} 689 690HRESULT STDMETHODCALLTYPE WebPreferences::setMinimumLogicalFontSize( 691 /* [in] */ int fontSize) 692{ 693 setIntegerValue(CFSTR(WebKitMinimumLogicalFontSizePreferenceKey), fontSize); 694 return S_OK; 695} 696 697HRESULT STDMETHODCALLTYPE WebPreferences::defaultTextEncodingName( 698 /* [retval][out] */ BSTR* name) 699{ 700 *name = stringValueForKey(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey)); 701 return (*name) ? S_OK : E_FAIL; 702} 703 704HRESULT STDMETHODCALLTYPE WebPreferences::setDefaultTextEncodingName( 705 /* [in] */ BSTR name) 706{ 707 setStringValue(CFSTR(WebKitDefaultTextEncodingNamePreferenceKey), name); 708 return S_OK; 709} 710 711HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetEnabled( 712 /* [retval][out] */ BOOL* enabled) 713{ 714 *enabled = boolValueForKey(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey)); 715 return S_OK; 716} 717 718HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetEnabled( 719 /* [in] */ BOOL enabled) 720{ 721 setBoolValue(CFSTR(WebKitUserStyleSheetEnabledPreferenceKey), enabled); 722 return S_OK; 723} 724 725HRESULT STDMETHODCALLTYPE WebPreferences::userStyleSheetLocation( 726 /* [retval][out] */ BSTR* location) 727{ 728 *location = stringValueForKey(CFSTR(WebKitUserStyleSheetLocationPreferenceKey)); 729 return (*location) ? S_OK : E_FAIL; 730} 731 732HRESULT STDMETHODCALLTYPE WebPreferences::setUserStyleSheetLocation( 733 /* [in] */ BSTR location) 734{ 735 setStringValue(CFSTR(WebKitUserStyleSheetLocationPreferenceKey), location); 736 return S_OK; 737} 738 739HRESULT STDMETHODCALLTYPE WebPreferences::isJavaEnabled( 740 /* [retval][out] */ BOOL* enabled) 741{ 742 *enabled = boolValueForKey(CFSTR(WebKitJavaEnabledPreferenceKey)); 743 return S_OK; 744} 745 746HRESULT STDMETHODCALLTYPE WebPreferences::setJavaEnabled( 747 /* [in] */ BOOL enabled) 748{ 749 setBoolValue(CFSTR(WebKitJavaEnabledPreferenceKey), enabled); 750 return S_OK; 751} 752 753HRESULT STDMETHODCALLTYPE WebPreferences::isJavaScriptEnabled( 754 /* [retval][out] */ BOOL* enabled) 755{ 756 *enabled = boolValueForKey(CFSTR(WebKitJavaScriptEnabledPreferenceKey)); 757 return S_OK; 758} 759 760HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptEnabled( 761 /* [in] */ BOOL enabled) 762{ 763 setBoolValue(CFSTR(WebKitJavaScriptEnabledPreferenceKey), enabled); 764 return S_OK; 765} 766 767HRESULT STDMETHODCALLTYPE WebPreferences::isWebSecurityEnabled( 768 /* [retval][out] */ BOOL* enabled) 769{ 770 *enabled = boolValueForKey(CFSTR(WebKitWebSecurityEnabledPreferenceKey)); 771 return S_OK; 772} 773 774HRESULT STDMETHODCALLTYPE WebPreferences::setWebSecurityEnabled( 775 /* [in] */ BOOL enabled) 776{ 777 setBoolValue(CFSTR(WebKitWebSecurityEnabledPreferenceKey), enabled); 778 return S_OK; 779} 780 781HRESULT STDMETHODCALLTYPE WebPreferences::allowUniversalAccessFromFileURLs( 782 /* [retval][out] */ BOOL* allowAccess) 783{ 784 *allowAccess = boolValueForKey(CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey)); 785 return S_OK; 786} 787 788HRESULT STDMETHODCALLTYPE WebPreferences::setAllowUniversalAccessFromFileURLs( 789 /* [in] */ BOOL allowAccess) 790{ 791 setBoolValue(CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey), allowAccess); 792 return S_OK; 793} 794 795HRESULT STDMETHODCALLTYPE WebPreferences::isXSSAuditorEnabled( 796 /* [retval][out] */ BOOL* enabled) 797{ 798 *enabled = boolValueForKey(CFSTR(WebKitXSSAuditorEnabledPreferenceKey)); 799 return S_OK; 800} 801 802HRESULT STDMETHODCALLTYPE WebPreferences::setXSSAuditorEnabled( 803 /* [in] */ BOOL enabled) 804{ 805 setBoolValue(CFSTR(WebKitXSSAuditorEnabledPreferenceKey), enabled); 806 return S_OK; 807} 808 809HRESULT STDMETHODCALLTYPE WebPreferences::isFrameSetFlatteningEnabled( 810 /* [retval][out] */ BOOL* enabled) 811{ 812 *enabled = boolValueForKey(CFSTR(WebKitFrameSetFlatteningEnabledPreferenceKey)); 813 return S_OK; 814} 815 816HRESULT STDMETHODCALLTYPE WebPreferences::setFrameSetFlatteningEnabled( 817 /* [in] */ BOOL enabled) 818{ 819 setBoolValue(CFSTR(WebKitFrameSetFlatteningEnabledPreferenceKey), enabled); 820 return S_OK; 821} 822 823HRESULT STDMETHODCALLTYPE WebPreferences::javaScriptCanOpenWindowsAutomatically( 824 /* [retval][out] */ BOOL* enabled) 825{ 826 *enabled = boolValueForKey(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey)); 827 return S_OK; 828} 829 830HRESULT STDMETHODCALLTYPE WebPreferences::setJavaScriptCanOpenWindowsAutomatically( 831 /* [in] */ BOOL enabled) 832{ 833 setBoolValue(CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), enabled); 834 return S_OK; 835} 836 837HRESULT STDMETHODCALLTYPE WebPreferences::arePlugInsEnabled( 838 /* [retval][out] */ BOOL* enabled) 839{ 840 *enabled = boolValueForKey(CFSTR(WebKitPluginsEnabledPreferenceKey)); 841 return S_OK; 842} 843 844HRESULT STDMETHODCALLTYPE WebPreferences::setPlugInsEnabled( 845 /* [in] */ BOOL enabled) 846{ 847 setBoolValue(CFSTR(WebKitPluginsEnabledPreferenceKey), enabled); 848 return S_OK; 849} 850 851HRESULT STDMETHODCALLTYPE WebPreferences::allowsAnimatedImages( 852 /* [retval][out] */ BOOL* enabled) 853{ 854 *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImagesPreferenceKey)); 855 return S_OK; 856} 857 858HRESULT STDMETHODCALLTYPE WebPreferences::setAllowsAnimatedImages( 859 /* [in] */ BOOL enabled) 860{ 861 setBoolValue(CFSTR(WebKitAllowAnimatedImagesPreferenceKey), enabled); 862 return S_OK; 863} 864 865HRESULT STDMETHODCALLTYPE WebPreferences::allowAnimatedImageLooping( 866 /* [retval][out] */ BOOL* enabled) 867{ 868 *enabled = boolValueForKey(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey)); 869 return S_OK; 870} 871 872HRESULT STDMETHODCALLTYPE WebPreferences::setAllowAnimatedImageLooping( 873 /* [in] */ BOOL enabled) 874{ 875 setBoolValue(CFSTR(WebKitAllowAnimatedImageLoopingPreferenceKey), enabled); 876 return S_OK; 877} 878 879HRESULT STDMETHODCALLTYPE WebPreferences::setLoadsImagesAutomatically( 880 /* [in] */ BOOL enabled) 881{ 882 setBoolValue(CFSTR(WebKitDisplayImagesKey), enabled); 883 return S_OK; 884} 885 886HRESULT STDMETHODCALLTYPE WebPreferences::loadsImagesAutomatically( 887 /* [retval][out] */ BOOL* enabled) 888{ 889 *enabled = boolValueForKey(CFSTR(WebKitDisplayImagesKey)); 890 return S_OK; 891} 892 893HRESULT STDMETHODCALLTYPE WebPreferences::setAutosaves( 894 /* [in] */ BOOL enabled) 895{ 896 m_autoSaves = !!enabled; 897 return S_OK; 898} 899 900HRESULT STDMETHODCALLTYPE WebPreferences::autosaves( 901 /* [retval][out] */ BOOL* enabled) 902{ 903 *enabled = m_autoSaves ? TRUE : FALSE; 904 return S_OK; 905} 906 907HRESULT STDMETHODCALLTYPE WebPreferences::setShouldPrintBackgrounds( 908 /* [in] */ BOOL enabled) 909{ 910 setBoolValue(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey), enabled); 911 return S_OK; 912} 913 914HRESULT STDMETHODCALLTYPE WebPreferences::shouldPrintBackgrounds( 915 /* [retval][out] */ BOOL* enabled) 916{ 917 *enabled = boolValueForKey(CFSTR(WebKitShouldPrintBackgroundsPreferenceKey)); 918 return S_OK; 919} 920 921HRESULT STDMETHODCALLTYPE WebPreferences::setPrivateBrowsingEnabled( 922 /* [in] */ BOOL enabled) 923{ 924 setBoolValue(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey), enabled); 925 return S_OK; 926} 927 928HRESULT STDMETHODCALLTYPE WebPreferences::privateBrowsingEnabled( 929 /* [retval][out] */ BOOL* enabled) 930{ 931 *enabled = boolValueForKey(CFSTR(WebKitPrivateBrowsingEnabledPreferenceKey)); 932 return S_OK; 933} 934 935HRESULT STDMETHODCALLTYPE WebPreferences::setTabsToLinks( 936 /* [in] */ BOOL enabled) 937{ 938 setBoolValue(CFSTR(WebKitTabToLinksPreferenceKey), enabled); 939 return S_OK; 940} 941 942HRESULT STDMETHODCALLTYPE WebPreferences::tabsToLinks( 943 /* [retval][out] */ BOOL* enabled) 944{ 945 *enabled = boolValueForKey(CFSTR(WebKitTabToLinksPreferenceKey)); 946 return S_OK; 947} 948 949HRESULT STDMETHODCALLTYPE WebPreferences::setUsesPageCache( 950 /* [in] */ BOOL usesPageCache) 951{ 952 setBoolValue(CFSTR(WebKitUsesPageCachePreferenceKey), usesPageCache); 953 return S_OK; 954} 955 956HRESULT STDMETHODCALLTYPE WebPreferences::usesPageCache( 957 /* [retval][out] */ BOOL* usesPageCache) 958{ 959 *usesPageCache = boolValueForKey(CFSTR(WebKitUsesPageCachePreferenceKey)); 960 return S_OK; 961} 962 963HRESULT STDMETHODCALLTYPE WebPreferences::textAreasAreResizable( 964 /* [retval][out] */ BOOL* enabled) 965{ 966 *enabled = boolValueForKey(CFSTR(WebKitTextAreasAreResizablePreferenceKey)); 967 return S_OK; 968} 969 970HRESULT STDMETHODCALLTYPE WebPreferences::setTextAreasAreResizable( 971 /* [in] */ BOOL enabled) 972{ 973 setBoolValue(CFSTR(WebKitTextAreasAreResizablePreferenceKey), enabled); 974 return S_OK; 975} 976 977HRESULT WebPreferences::historyItemLimit(int* limit) 978{ 979 *limit = integerValueForKey(CFSTR(WebKitHistoryItemLimitKey)); 980 return S_OK; 981} 982 983HRESULT WebPreferences::setHistoryItemLimit(int limit) 984{ 985 setIntegerValue(CFSTR(WebKitHistoryItemLimitKey), limit); 986 return S_OK; 987} 988 989HRESULT WebPreferences::historyAgeInDaysLimit(int* limit) 990{ 991 *limit = integerValueForKey(CFSTR(WebKitHistoryAgeInDaysLimitKey)); 992 return S_OK; 993} 994 995HRESULT WebPreferences::setHistoryAgeInDaysLimit(int limit) 996{ 997 setIntegerValue(CFSTR(WebKitHistoryAgeInDaysLimitKey), limit); 998 return S_OK; 999} 1000 1001HRESULT WebPreferences::unused1() 1002{ 1003 ASSERT_NOT_REACHED(); 1004 return E_FAIL; 1005} 1006 1007HRESULT WebPreferences::unused2() 1008{ 1009 ASSERT_NOT_REACHED(); 1010 return E_FAIL; 1011} 1012 1013HRESULT WebPreferences::iconDatabaseLocation( 1014 /* [out] */ BSTR* location) 1015{ 1016 *location = stringValueForKey(CFSTR(WebKitIconDatabaseLocationKey)); 1017 return (*location) ? S_OK : E_FAIL; 1018} 1019 1020HRESULT WebPreferences::setIconDatabaseLocation( 1021 /* [in] */ BSTR location) 1022{ 1023 setStringValue(CFSTR(WebKitIconDatabaseLocationKey), location); 1024 return S_OK; 1025} 1026 1027HRESULT WebPreferences::iconDatabaseEnabled(BOOL* enabled)//location) 1028{ 1029 *enabled = boolValueForKey(CFSTR(WebKitIconDatabaseEnabledPreferenceKey)); 1030 return S_OK; 1031} 1032 1033HRESULT WebPreferences::setIconDatabaseEnabled(BOOL enabled )//location) 1034{ 1035 setBoolValue(CFSTR(WebKitIconDatabaseEnabledPreferenceKey), enabled); 1036 return S_OK; 1037} 1038 1039HRESULT STDMETHODCALLTYPE WebPreferences::fontSmoothing( 1040 /* [retval][out] */ FontSmoothingType* smoothingType) 1041{ 1042 *smoothingType = (FontSmoothingType) integerValueForKey(CFSTR(WebKitFontSmoothingTypePreferenceKey)); 1043 return S_OK; 1044} 1045 1046HRESULT STDMETHODCALLTYPE WebPreferences::setFontSmoothing( 1047 /* [in] */ FontSmoothingType smoothingType) 1048{ 1049 setIntegerValue(CFSTR(WebKitFontSmoothingTypePreferenceKey), smoothingType); 1050 if (smoothingType == FontSmoothingTypeWindows) 1051 smoothingType = FontSmoothingTypeMedium; 1052#if PLATFORM(CG) 1053 wkSetFontSmoothingLevel((int)smoothingType); 1054#endif 1055 return S_OK; 1056} 1057 1058HRESULT STDMETHODCALLTYPE WebPreferences::fontSmoothingContrast( 1059 /* [retval][out] */ float* contrast) 1060{ 1061 *contrast = floatValueForKey(CFSTR(WebKitFontSmoothingContrastPreferenceKey)); 1062 return S_OK; 1063} 1064 1065HRESULT STDMETHODCALLTYPE WebPreferences::setFontSmoothingContrast( 1066 /* [in] */ float contrast) 1067{ 1068 setFloatValue(CFSTR(WebKitFontSmoothingContrastPreferenceKey), contrast); 1069#if PLATFORM(CG) 1070 wkSetFontSmoothingContrast(contrast); 1071#endif 1072 return S_OK; 1073} 1074 1075HRESULT STDMETHODCALLTYPE WebPreferences::editableLinkBehavior( 1076 /* [out, retval] */ WebKitEditableLinkBehavior* editableLinkBehavior) 1077{ 1078 WebKitEditableLinkBehavior value = (WebKitEditableLinkBehavior) integerValueForKey(CFSTR(WebKitEditableLinkBehaviorPreferenceKey)); 1079 switch (value) { 1080 case WebKitEditableLinkDefaultBehavior: 1081 case WebKitEditableLinkAlwaysLive: 1082 case WebKitEditableLinkOnlyLiveWithShiftKey: 1083 case WebKitEditableLinkLiveWhenNotFocused: 1084 case WebKitEditableLinkNeverLive: 1085 *editableLinkBehavior = value; 1086 break; 1087 default: // ensure that a valid result is returned 1088 *editableLinkBehavior = WebKitEditableLinkDefaultBehavior; 1089 break; 1090 } 1091 return S_OK; 1092} 1093 1094HRESULT STDMETHODCALLTYPE WebPreferences::setEditableLinkBehavior( 1095 /* [in] */ WebKitEditableLinkBehavior behavior) 1096{ 1097 setIntegerValue(CFSTR(WebKitEditableLinkBehaviorPreferenceKey), behavior); 1098 return S_OK; 1099} 1100 1101HRESULT STDMETHODCALLTYPE WebPreferences::cookieStorageAcceptPolicy( 1102 /* [retval][out] */ WebKitCookieStorageAcceptPolicy *acceptPolicy ) 1103{ 1104 if (!acceptPolicy) 1105 return E_POINTER; 1106 1107 *acceptPolicy = (WebKitCookieStorageAcceptPolicy)integerValueForKey(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey)); 1108 return S_OK; 1109} 1110 1111HRESULT STDMETHODCALLTYPE WebPreferences::setCookieStorageAcceptPolicy( 1112 /* [in] */ WebKitCookieStorageAcceptPolicy acceptPolicy) 1113{ 1114 setIntegerValue(CFSTR(WebKitCookieStorageAcceptPolicyPreferenceKey), acceptPolicy); 1115 return S_OK; 1116} 1117 1118 1119HRESULT WebPreferences::continuousSpellCheckingEnabled(BOOL* enabled) 1120{ 1121 *enabled = boolValueForKey(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey)); 1122 return S_OK; 1123} 1124 1125HRESULT WebPreferences::setContinuousSpellCheckingEnabled(BOOL enabled) 1126{ 1127 setBoolValue(CFSTR(WebContinuousSpellCheckingEnabledPreferenceKey), enabled); 1128 return S_OK; 1129} 1130 1131HRESULT WebPreferences::grammarCheckingEnabled(BOOL* enabled) 1132{ 1133 *enabled = boolValueForKey(CFSTR(WebGrammarCheckingEnabledPreferenceKey)); 1134 return S_OK; 1135} 1136 1137HRESULT WebPreferences::setGrammarCheckingEnabled(BOOL enabled) 1138{ 1139 setBoolValue(CFSTR(WebGrammarCheckingEnabledPreferenceKey), enabled); 1140 return S_OK; 1141} 1142 1143HRESULT WebPreferences::allowContinuousSpellChecking(BOOL* enabled) 1144{ 1145 *enabled = boolValueForKey(CFSTR(AllowContinuousSpellCheckingPreferenceKey)); 1146 return S_OK; 1147} 1148 1149HRESULT WebPreferences::setAllowContinuousSpellChecking(BOOL enabled) 1150{ 1151 setBoolValue(CFSTR(AllowContinuousSpellCheckingPreferenceKey), enabled); 1152 return S_OK; 1153} 1154 1155HRESULT WebPreferences::isDOMPasteAllowed(BOOL* enabled) 1156{ 1157 *enabled = boolValueForKey(CFSTR(WebKitDOMPasteAllowedPreferenceKey)); 1158 return S_OK; 1159} 1160 1161HRESULT WebPreferences::setDOMPasteAllowed(BOOL enabled) 1162{ 1163 setBoolValue(CFSTR(WebKitDOMPasteAllowedPreferenceKey), enabled); 1164 return S_OK; 1165} 1166 1167HRESULT WebPreferences::cacheModel(WebCacheModel* cacheModel) 1168{ 1169 if (!cacheModel) 1170 return E_POINTER; 1171 1172 *cacheModel = (WebCacheModel)integerValueForKey(CFSTR(WebKitCacheModelPreferenceKey)); 1173 return S_OK; 1174} 1175 1176HRESULT WebPreferences::setCacheModel(WebCacheModel cacheModel) 1177{ 1178 setIntegerValue(CFSTR(WebKitCacheModelPreferenceKey), cacheModel); 1179 return S_OK; 1180} 1181 1182HRESULT WebPreferences::setShouldPaintCustomScrollbars(BOOL shouldPaint) 1183{ 1184 setBoolValue(CFSTR(WebKitPaintCustomScrollbarsPreferenceKey), shouldPaint); 1185 return S_OK; 1186} 1187 1188HRESULT WebPreferences::shouldPaintCustomScrollbars(BOOL* shouldPaint) 1189{ 1190 *shouldPaint = boolValueForKey(CFSTR(WebKitPaintCustomScrollbarsPreferenceKey)); 1191 return S_OK; 1192} 1193 1194HRESULT WebPreferences::shouldPaintNativeControls(BOOL* shouldPaint) 1195{ 1196 *shouldPaint = boolValueForKey(CFSTR(WebKitPaintNativeControlsPreferenceKey)); 1197 return S_OK; 1198} 1199 1200HRESULT WebPreferences::setShouldPaintNativeControls(BOOL shouldPaint) 1201{ 1202 setBoolValue(CFSTR(WebKitPaintNativeControlsPreferenceKey), shouldPaint); 1203 return S_OK; 1204} 1205 1206HRESULT WebPreferences::setDeveloperExtrasEnabled(BOOL enabled) 1207{ 1208 setBoolValue(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey), enabled); 1209 return S_OK; 1210} 1211 1212HRESULT WebPreferences::developerExtrasEnabled(BOOL* enabled) 1213{ 1214 if (!enabled) 1215 return E_POINTER; 1216 1217 *enabled = boolValueForKey(CFSTR(WebKitDeveloperExtrasEnabledPreferenceKey)); 1218 return S_OK; 1219} 1220 1221bool WebPreferences::developerExtrasDisabledByOverride() 1222{ 1223 return !!boolValueForKey(CFSTR(DisableWebKitDeveloperExtrasPreferenceKey)); 1224} 1225 1226HRESULT WebPreferences::setAutomaticallyDetectsCacheModel(BOOL automaticallyDetectsCacheModel) 1227{ 1228 m_automaticallyDetectsCacheModel = !!automaticallyDetectsCacheModel; 1229 return S_OK; 1230} 1231 1232HRESULT WebPreferences::automaticallyDetectsCacheModel(BOOL* automaticallyDetectsCacheModel) 1233{ 1234 if (!automaticallyDetectsCacheModel) 1235 return E_POINTER; 1236 1237 *automaticallyDetectsCacheModel = m_automaticallyDetectsCacheModel; 1238 return S_OK; 1239} 1240 1241HRESULT STDMETHODCALLTYPE WebPreferences::setAuthorAndUserStylesEnabled(BOOL enabled) 1242{ 1243 setBoolValue(CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey), enabled); 1244 return S_OK; 1245} 1246 1247HRESULT STDMETHODCALLTYPE WebPreferences::authorAndUserStylesEnabled(BOOL* enabled) 1248{ 1249 if (!enabled) 1250 return E_POINTER; 1251 1252 *enabled = boolValueForKey(CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey)); 1253 return S_OK; 1254} 1255 1256HRESULT WebPreferences::inApplicationChromeMode(BOOL* enabled) 1257{ 1258 *enabled = boolValueForKey(CFSTR(WebKitApplicationChromeModePreferenceKey)); 1259 return S_OK; 1260} 1261 1262HRESULT WebPreferences::setApplicationChromeMode(BOOL enabled) 1263{ 1264 setBoolValue(CFSTR(WebKitApplicationChromeModePreferenceKey), enabled); 1265 return S_OK; 1266} 1267 1268HRESULT STDMETHODCALLTYPE WebPreferences::setOfflineWebApplicationCacheEnabled(BOOL enabled) 1269{ 1270 setBoolValue(CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey), enabled); 1271 return S_OK; 1272} 1273 1274HRESULT STDMETHODCALLTYPE WebPreferences::offlineWebApplicationCacheEnabled(BOOL* enabled) 1275{ 1276 *enabled = boolValueForKey(CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey)); 1277 return S_OK; 1278} 1279 1280HRESULT STDMETHODCALLTYPE WebPreferences::setDatabasesEnabled(BOOL enabled) 1281{ 1282 setBoolValue(CFSTR(WebKitDatabasesEnabledPreferenceKey), enabled); 1283 return S_OK; 1284} 1285 1286HRESULT STDMETHODCALLTYPE WebPreferences::databasesEnabled(BOOL* enabled) 1287{ 1288 *enabled = boolValueForKey(CFSTR(WebKitDatabasesEnabledPreferenceKey)); 1289 return S_OK; 1290} 1291 1292HRESULT STDMETHODCALLTYPE WebPreferences::setLocalStorageEnabled(BOOL enabled) 1293{ 1294 setBoolValue(CFSTR(WebKitLocalStorageEnabledPreferenceKey), enabled); 1295 return S_OK; 1296} 1297 1298HRESULT STDMETHODCALLTYPE WebPreferences::localStorageEnabled(BOOL* enabled) 1299{ 1300 *enabled = boolValueForKey(CFSTR(WebKitLocalStorageEnabledPreferenceKey)); 1301 return S_OK; 1302} 1303 1304HRESULT STDMETHODCALLTYPE WebPreferences::localStorageDatabasePath(BSTR* location) 1305{ 1306 *location = stringValueForKey(CFSTR(WebKitLocalStorageDatabasePathPreferenceKey)); 1307 return (*location) ? S_OK : E_FAIL; 1308} 1309 1310HRESULT STDMETHODCALLTYPE WebPreferences::setLocalStorageDatabasePath(BSTR location) 1311{ 1312 setStringValue(CFSTR(WebKitLocalStorageDatabasePathPreferenceKey), location); 1313 return S_OK; 1314} 1315 1316HRESULT STDMETHODCALLTYPE WebPreferences::setExperimentalNotificationsEnabled(BOOL enabled) 1317{ 1318 setBoolValue(CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey), enabled); 1319 return S_OK; 1320} 1321 1322HRESULT STDMETHODCALLTYPE WebPreferences::experimentalNotificationsEnabled(BOOL* enabled) 1323{ 1324 *enabled = boolValueForKey(CFSTR(WebKitExperimentalNotificationsEnabledPreferenceKey)); 1325 return S_OK; 1326} 1327 1328HRESULT WebPreferences::setZoomsTextOnly(BOOL zoomsTextOnly) 1329{ 1330 setBoolValue(CFSTR(WebKitZoomsTextOnlyPreferenceKey), zoomsTextOnly); 1331 return S_OK; 1332} 1333 1334HRESULT WebPreferences::zoomsTextOnly(BOOL* zoomsTextOnly) 1335{ 1336 *zoomsTextOnly = boolValueForKey(CFSTR(WebKitZoomsTextOnlyPreferenceKey)); 1337 return S_OK; 1338} 1339 1340HRESULT STDMETHODCALLTYPE WebPreferences::setShouldUseHighResolutionTimers(BOOL useHighResolutionTimers) 1341{ 1342 setBoolValue(CFSTR(WebKitUseHighResolutionTimersPreferenceKey), useHighResolutionTimers); 1343 return S_OK; 1344} 1345 1346HRESULT STDMETHODCALLTYPE WebPreferences::shouldUseHighResolutionTimers(BOOL* useHighResolutionTimers) 1347{ 1348 *useHighResolutionTimers = boolValueForKey(CFSTR(WebKitUseHighResolutionTimersPreferenceKey)); 1349 return S_OK; 1350} 1351 1352HRESULT WebPreferences::setPluginAllowedRunTime(UINT allowedRunTime) 1353{ 1354 setIntegerValue(CFSTR(WebKitPluginAllowedRunTimePreferenceKey), allowedRunTime); 1355 return S_OK; 1356} 1357 1358HRESULT WebPreferences::pluginAllowedRunTime(UINT* allowedRunTime) 1359{ 1360 *allowedRunTime = integerValueForKey(CFSTR(WebKitPluginAllowedRunTimePreferenceKey)); 1361 return S_OK; 1362} 1363 1364HRESULT WebPreferences::setPreferenceForTest(BSTR key, BSTR value) 1365{ 1366 if (!SysStringLen(key) || !SysStringLen(value)) 1367 return E_FAIL; 1368 RetainPtr<CFStringRef> keyString(AdoptCF, CFStringCreateWithCharacters(0, reinterpret_cast<UniChar*>(key), SysStringLen(key))); 1369 RetainPtr<CFStringRef> valueString(AdoptCF, CFStringCreateWithCharacters(0, reinterpret_cast<UniChar*>(value), SysStringLen(value))); 1370 setValueForKey(keyString.get(), valueString.get()); 1371 postPreferencesChangesNotification(); 1372 return S_OK; 1373} 1374 1375HRESULT WebPreferences::setAcceleratedCompositingEnabled(BOOL enabled) 1376{ 1377 setBoolValue(CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey), enabled); 1378 return S_OK; 1379} 1380 1381HRESULT WebPreferences::acceleratedCompositingEnabled(BOOL* enabled) 1382{ 1383#if USE(ACCELERATED_COMPOSITING) 1384 *enabled = WKCACFLayerRenderer::acceleratedCompositingAvailable() && boolValueForKey(CFSTR(WebKitAcceleratedCompositingEnabledPreferenceKey)); 1385#else 1386 *enabled = FALSE; 1387#endif 1388 return S_OK; 1389} 1390 1391HRESULT WebPreferences::setCustomDragCursorsEnabled(BOOL enabled) 1392{ 1393 setBoolValue(CFSTR(WebKitCustomDragCursorsEnabledPreferenceKey), enabled); 1394 return S_OK; 1395} 1396 1397HRESULT WebPreferences::customDragCursorsEnabled(BOOL* enabled) 1398{ 1399 *enabled = boolValueForKey(CFSTR(WebKitCustomDragCursorsEnabledPreferenceKey)); 1400 return S_OK; 1401} 1402 1403void WebPreferences::willAddToWebView() 1404{ 1405 ++m_numWebViews; 1406} 1407 1408void WebPreferences::didRemoveFromWebView() 1409{ 1410 ASSERT(m_numWebViews); 1411 if (--m_numWebViews == 0) { 1412 IWebNotificationCenter* nc = WebNotificationCenter::defaultCenterInternal(); 1413 nc->postNotificationName(webPreferencesRemovedNotification(), static_cast<IWebPreferences*>(this), 0); 1414 } 1415} 1416