SettingsMac.mm   [plain text]


/*
 * Copyright (C) 2012 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 "Settings.h"

#include "LocaleToScriptMapping.h"
#include <wtf/text/CString.h>

namespace WebCore {

static NSDictionary *defaultFontFamilyDictionary()
{
    static NSDictionary *fontFamilyDictionary;
    if (fontFamilyDictionary)
        return fontFamilyDictionary;

    NSBundle *bundle = [NSBundle bundleWithIdentifier:@"com.apple.WebCore"];
#ifdef BUILDING_ON_LION
    // Temporary workaround for a Safari Webpage Preview Fetcher crash caused by insufficient sandbox permissions.
    if (!bundle)
        return 0;
#endif
    NSData *fileData = [NSData dataWithContentsOfURL:[bundle URLForResource:@"DefaultFonts" withExtension:@"plist"]];
    if (!fileData)
        FATAL("Could not read font fallback file");
    NSError *error;
    id propertyList = [NSPropertyListSerialization propertyListWithData:fileData options:NSPropertyListImmutable format:0 error:&error];
    if (!propertyList)
        FATAL("Could not parse font fallback property list: %s", [[error description] UTF8String]);
    if (![propertyList isKindOfClass:[NSDictionary class]])
        FATAL("Font fallback file has incorrect format - root object is not a dictionary");

    fontFamilyDictionary = static_cast<NSDictionary *>(propertyList);
    CFRetain(fontFamilyDictionary);
    return fontFamilyDictionary;
}

void Settings::initializeDefaultFontFamilies()
{
    DEFINE_STATIC_LOCAL(AtomicString, standardFamily, ("standard"));
    DEFINE_STATIC_LOCAL(AtomicString, monospaceFamily, ("monospace"));
    DEFINE_STATIC_LOCAL(AtomicString, serifFamily, ("serif"));
    DEFINE_STATIC_LOCAL(AtomicString, sansSerifFamily, ("sans-serif"));
    DEFINE_STATIC_LOCAL(AtomicString, cursiveFamily, ("cursive"));
    DEFINE_STATIC_LOCAL(AtomicString, fantasyFamily, ("fantasy"));
    DEFINE_STATIC_LOCAL(AtomicString, pictographFamily, ("pictograph"));

    NSDictionary *rootDictionary = defaultFontFamilyDictionary();
    for (NSString *scriptName in rootDictionary) {
        NSDictionary *scriptDictionary = static_cast<NSDictionary *>([rootDictionary objectForKey:scriptName]);
        if (![scriptName isKindOfClass:[NSString class]])
            FATAL("Font fallback file has incorrect format - script name is not a string");
        if (![scriptDictionary isKindOfClass:[NSDictionary class]])
            FATAL("Font fallback file has incorrect format - per-script value is not a dictionary");

        UScriptCode script = scriptNameToCode(scriptName);
        if (script == USCRIPT_UNKNOWN)
            FATAL("Font fallback file has incorrect format - unknown language code %s", [scriptName UTF8String]);

        for (NSString *genericFamilyName in scriptDictionary) {
            NSString *familyName = [scriptDictionary objectForKey:genericFamilyName];
            if (![genericFamilyName isKindOfClass:[NSString class]])
                FATAL("Font fallback file has incorrect format - generic family name is not a string");
            if (![familyName isKindOfClass:[NSString class]])
                FATAL("Font fallback file has incorrect format - font family name is not a string");

            AtomicString genericFamily(genericFamilyName);

            if (genericFamily == standardFamily)
                setStandardFontFamily(familyName, script);
            else if (genericFamily == monospaceFamily)
                setFixedFontFamily(familyName, script);
            else if (genericFamily == serifFamily)
                setSerifFontFamily(familyName, script);
            else if (genericFamily == sansSerifFamily)
                setSansSerifFontFamily(familyName, script);
            else if (genericFamily == cursiveFamily)
                setCursiveFontFamily(familyName, script);
            else if (genericFamily == fantasyFamily)
                setFantasyFontFamily(familyName, script);
            else if (genericFamily == pictographFamily)
                setPictographFontFamily(familyName, script);
            else
                FATAL("Font fallback file has incorrect format - unknown font family name %s", [familyName UTF8String]);
        }
    }
}


} // namespace WebCore