78b5beb525dc3b6fb414bb445156da25c35f8fba
[WebKit-https.git] / Tools / WebKitTestRunner / InjectedBundle / cocoa / ActivateFontsCocoa.mm
1 /*
2  * Copyright (C) 2010-2015 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 INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "ActivateFonts.h"
28
29 #import <CoreFoundation/CoreFoundation.h>
30 #import <CoreText/CTFontManager.h>
31 #import <wtf/ObjcRuntimeExtras.h>
32 #import <wtf/RetainPtr.h>
33
34 #if USE(APPKIT)
35 #import <AppKit/AppKit.h>
36 #endif
37
38 @interface WKTRFontActivatorDummyClass : NSObject
39 @end
40
41 @implementation WKTRFontActivatorDummyClass
42 @end
43
44 namespace WTR {
45
46 #if USE(APPKIT)
47
48 // Activating system copies of these fonts overrides any others that could be preferred, such as ones
49 // in /Library/Fonts/Microsoft, and which don't always have the same metrics.
50 // FIXME: Switch to a solution from <rdar://problem/19553550> once it's available.
51 static void activateSystemCoreWebFonts()
52 {
53     NSArray *coreWebFontNames = @[
54         @"Andale Mono",
55         @"Arial",
56         @"Arial Black",
57         @"Comic Sans MS",
58         @"Courier New",
59         @"Georgia",
60         @"Impact",
61         @"Times New Roman",
62         @"Trebuchet MS",
63         @"Verdana",
64         @"Webdings"
65     ];
66
67     NSArray *fontFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:[NSURL fileURLWithPath:@"/Library/Fonts" isDirectory:YES]
68         includingPropertiesForKeys:@[NSURLFileResourceTypeKey, NSURLNameKey] options:0 error:0];
69
70     for (NSURL *fontURL in fontFiles) {
71         NSString *resourceType;
72         NSString *fileName;
73         if (![fontURL getResourceValue:&resourceType forKey:NSURLFileResourceTypeKey error:0]
74             || ![fontURL getResourceValue:&fileName forKey:NSURLNameKey error:0])
75             continue;
76         if (![resourceType isEqualToString:NSURLFileResourceTypeRegular])
77             continue;
78
79         // Activate all font variations, such as Arial Bold Italic.ttf. This algorithm is not 100% precise, as it
80         // also activates e.g. Arial Unicode, which is not a variation of Arial.
81         for (NSString *coreWebFontName in coreWebFontNames) {
82             if ([fileName hasPrefix:coreWebFontName]) {
83                 CTFontManagerRegisterFontsForURL((CFURLRef)fontURL, kCTFontManagerScopeProcess, 0);
84                 break;
85             }
86         }
87     }
88 }
89
90 #endif // USE(APPKIT)
91
92 void activateFonts()
93 {
94     static const char* fontFileNames[] = {
95         "AHEM____.TTF",
96         "WebKitWeightWatcher100.ttf",
97         "WebKitWeightWatcher200.ttf",
98         "WebKitWeightWatcher300.ttf",
99         "WebKitWeightWatcher400.ttf",
100         "WebKitWeightWatcher500.ttf",
101         "WebKitWeightWatcher600.ttf",
102         "WebKitWeightWatcher700.ttf",
103         "WebKitWeightWatcher800.ttf",
104         "WebKitWeightWatcher900.ttf",
105         "FontWithFeatures.otf",
106         "FontWithFeatures.ttf",
107         0
108     };
109
110     NSMutableArray *fontURLs = [NSMutableArray array];
111     NSURL *resourcesDirectory = [[NSBundle bundleForClass:[WKTRFontActivatorDummyClass class]] resourceURL];
112     for (unsigned i = 0; fontFileNames[i]; ++i) {
113         NSURL *fontURL = [resourcesDirectory URLByAppendingPathComponent:[NSString stringWithUTF8String:fontFileNames[i]]];
114         [fontURLs addObject:[fontURL absoluteURL]];
115     }
116
117     CFArrayRef errors = 0;
118     if (!CTFontManagerRegisterFontsForURLs((CFArrayRef)fontURLs, kCTFontManagerScopeProcess, &errors)) {
119         NSLog(@"Failed to activate fonts: %@", errors);
120         CFRelease(errors);
121         exit(1);
122     }
123
124 #if USE(APPKIT)
125     activateSystemCoreWebFonts();
126 #endif // USE(APPKIT)
127 }
128
129 }
130