⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webpreferences.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* * 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 + -