📄 webpreferences.cpp
字号:
/* * Copyright (C) 2006, 2007, 2008, 2009 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 "COMPtr.h"#include "WebNotificationCenter.h"#include "WebPreferenceKeysPrivate.h"#pragma warning( push, 0 )#include <WebCore/CString.h>#include <WebCore/FileSystem.h>#include <WebCore/Font.h>#include <WebCore/PlatformString.h>#include <WebCore/StringHash.h>#include "WebLocalizableStrings.h"#pragma warning( pop )#include <CoreFoundation/CoreFoundation.h>#include <shlobj.h>#include <shfolder.h>#include <tchar.h>#include <wtf/HashMap.h>#include <wtf/OwnArrayPtr.h>#if PLATFORM(CG)#include <CoreGraphics/CoreGraphics.h>#include <WebKitSystemInterface/WebKitSystemInterface.h>#endifusing namespace WebCore;static const String& oldPreferencesPath(){ static String path = pathByAppendingComponent(roamingUserSpecificStorageDirectory(), "WebKitPreferences.plist"); return path;}template<typename NumberType> struct CFNumberTraits { static const unsigned Type; };template<> struct CFNumberTraits<int> { static const unsigned Type = kCFNumberSInt32Type; };template<> struct CFNumberTraits<LONGLONG> { static const unsigned Type = kCFNumberLongLongType; };template<> struct CFNumberTraits<float> { static const unsigned Type = kCFNumberFloat32Type; };template<typename NumberType>static NumberType numberValueForPreferencesValue(CFPropertyListRef value){ if (!value) return 0; CFTypeID cfType = CFGetTypeID(value); if (cfType == CFStringGetTypeID()) return static_cast<NumberType>(CFStringGetIntValue(static_cast<CFStringRef>(value))); else if (cfType == CFBooleanGetTypeID()) { Boolean boolVal = CFBooleanGetValue(static_cast<CFBooleanRef>(value)); return boolVal ? 1 : 0; } else if (cfType == CFNumberGetTypeID()) { NumberType val = 0; CFNumberGetValue(static_cast<CFNumberRef>(value), CFNumberTraits<NumberType>::Type, &val); return val; } return 0;}template<typename NumberType>static RetainPtr<CFNumberRef> cfNumber(NumberType value){ return RetainPtr<CFNumberRef>(AdoptCF, CFNumberCreate(0, CFNumberTraits<NumberType>::Type, &value));}static bool booleanValueForPreferencesValue(CFPropertyListRef value){ return numberValueForPreferencesValue<int>(value);}// WebPreferences ----------------------------------------------------------------static CFDictionaryRef defaultSettings;static HashMap<WebCore::String, COMPtr<WebPreferences> > webPreferencesInstances;WebPreferences* WebPreferences::sharedStandardPreferences(){ static WebPreferences* standardPreferences; if (!standardPreferences) { standardPreferences = WebPreferences::createInstance(); standardPreferences->setAutosaves(TRUE); standardPreferences->load(); } return standardPreferences;}WebPreferences::WebPreferences() : m_refCount(0) , m_autoSaves(0) , m_automaticallyDetectsCacheModel(true) , m_numWebViews(0){ gClassCount++; gClassNameCount.add("WebPreferences");}WebPreferences::~WebPreferences(){ gClassCount--; gClassNameCount.remove("WebPreferences");}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<IWebPreferences*>(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).get();}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).get(); if (webPreference && webPreference->m_refCount == 1) webPreferencesInstances.remove(identifierString);}void WebPreferences::initializeDefaultSettings(){ if (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(WebKitWebSecurityEnabledPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitAllowUniversalAccessFromFileURLsPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitJavaScriptCanOpenWindowsAutomaticallyPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitPluginsEnabledPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitDatabasesEnabledPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitLocalStorageEnabledPreferenceKey), 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<CFStringRef> 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(WebKitFontSmoothingTypePreferenceKey), CFSTR("2")); CFDictionaryAddValue(defaults, CFSTR(WebKitFontSmoothingContrastPreferenceKey), 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); CFDictionaryAddValue(defaults, CFSTR(WebKitLocalStorageDatabasePathPreferenceKey), CFSTR("")); RetainPtr<CFStringRef> cacheModelRef(AdoptCF, CFStringCreateWithFormat(0, 0, CFSTR("%d"), WebCacheModelDocumentViewer)); CFDictionaryAddValue(defaults, CFSTR(WebKitCacheModelPreferenceKey), cacheModelRef.get()); CFDictionaryAddValue(defaults, CFSTR(WebKitAuthorAndUserStylesEnabledPreferenceKey), kCFBooleanTrue); CFDictionaryAddValue(defaults, CFSTR(WebKitApplicationChromeModePreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(WebKitOfflineWebApplicationCacheEnabledPreferenceKey), kCFBooleanFalse); CFDictionaryAddValue(defaults, CFSTR(WebKitPaintNativeControlsPreferenceKey), kCFBooleanFalse); defaultSettings = defaults;}RetainPtr<CFPropertyListRef> WebPreferences::valueForKey(CFStringRef key){ RetainPtr<CFPropertyListRef> value = CFDictionaryGetValue(m_privatePrefs.get(), key); if (value) return value; value.adoptCF(CFPreferencesCopyAppValue(key, kCFPreferencesCurrentApplication)); if (value) return value; return CFDictionaryGetValue(defaultSettings, key);}void WebPreferences::setValueForKey(CFStringRef key, CFPropertyListRef value){ CFDictionarySetValue(m_privatePrefs.get(), key, value); if (m_autoSaves) { CFPreferencesSetAppValue(key, value, kCFPreferencesCurrentApplication); save(); }}BSTR WebPreferences::stringValueForKey(CFStringRef key){ RetainPtr<CFPropertyListRef> value = valueForKey(key); if (!value || (CFGetTypeID(value.get()) != CFStringGetTypeID())) return 0; CFStringRef str = static_cast<CFStringRef>(value.get()); 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){ return numberValueForPreferencesValue<int>(valueForKey(key).get());}BOOL WebPreferences::boolValueForKey(CFStringRef key){ return booleanValueForPreferencesValue(valueForKey(key).get());}float WebPreferences::floatValueForKey(CFStringRef key){ return numberValueForPreferencesValue<float>(valueForKey(key).get());}LONGLONG WebPreferences::longlongValueForKey(CFStringRef key){ return numberValueForPreferencesValue<LONGLONG>(valueForKey(key).get());}void WebPreferences::setStringValue(CFStringRef key, LPCTSTR value){ BSTR val = stringValueForKey(key); if (val && !_tcscmp(val, value)) return; SysFreeString(val); RetainPtr<CFStringRef> valueRef(AdoptCF, CFStringCreateWithCharactersNoCopy(0, (UniChar*)_wcsdup(value), (CFIndex)_tcslen(value), kCFAllocatorMalloc)); setValueForKey(key, valueRef.get()); postPreferencesChangesNotification();}void WebPreferences::setIntegerValue(CFStringRef key, int value){ if (integerValueForKey(key) == value) return; setValueForKey(key, cfNumber(value).get()); postPreferencesChangesNotification();}void WebPreferences::setFloatValue(CFStringRef key, float value){ if (floatValueForKey(key) == value) return; setValueForKey(key, cfNumber(value).get()); postPreferencesChangesNotification();}void WebPreferences::setBoolValue(CFStringRef key, BOOL value){ if (boolValueForKey(key) == value) return; setValueForKey(key, value ? kCFBooleanTrue : kCFBooleanFalse); postPreferencesChangesNotification();}void WebPreferences::setLongLongValue(CFStringRef key, LONGLONG value){ if (longlongValueForKey(key) == value) return; setValueForKey(key, cfNumber(value).get()); postPreferencesChangesNotification();}BSTR WebPreferences::webPreferencesChangedNotification(){ static BSTR webPreferencesChangedNotification = SysAllocString(WebPreferencesChangedNotification); return webPreferencesChangedNotification;}BSTR WebPreferences::webPreferencesRemovedNotification(){ static BSTR webPreferencesRemovedNotification = SysAllocString(WebPreferencesRemovedNotification); return webPreferencesRemovedNotification;}void WebPreferences::save(){ CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);}void WebPreferences::load(){ initializeDefaultSettings(); m_privatePrefs.adoptCF(CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); migrateWebKitPreferencesToCFPreferences();}void WebPreferences::migrateWebKitPreferencesToCFPreferences(){ CFStringRef didMigrateKey = CFSTR(WebKitDidMigrateWebKitPreferencesToCFPreferencesPreferenceKey); if (boolValueForKey(didMigrateKey)) return; bool oldValue = m_autoSaves; m_autoSaves = true; setBoolValue(didMigrateKey, TRUE); m_autoSaves = oldValue; CString path = oldPreferencesPath().utf8(); RetainPtr<CFURLRef> urlRef(AdoptCF, CFURLCreateFromFileSystemRepresentation(0, reinterpret_cast<const UInt8*>(path.data()), path.length(), false)); if (!urlRef) return; RetainPtr<CFReadStreamRef> stream(AdoptCF, CFReadStreamCreateWithFile(0, urlRef.get())); if (!stream) return; if (!CFReadStreamOpen(stream.get())) return; CFPropertyListFormat format = kCFPropertyListBinaryFormat_v1_0 | kCFPropertyListXMLFormat_v1_0; RetainPtr<CFPropertyListRef> plist(AdoptCF, CFPropertyListCreateFromStream(0, stream.get(), 0, kCFPropertyListMutableContainersAndLeaves, &format, 0)); CFReadStreamClose(stream.get()); if (!plist || CFGetTypeID(plist.get()) != CFDictionaryGetTypeID()) return; copyWebKitPreferencesToCFPreferences(static_cast<CFDictionaryRef>(plist.get())); deleteFile(oldPreferencesPath());}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -