[OS X] Make checking if a font is the system font more robust
authormmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 23 Apr 2014 21:33:14 +0000 (21:33 +0000)
committermmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 23 Apr 2014 21:33:14 +0000 (21:33 +0000)
https://bugs.webkit.org/show_bug.cgi?id=132030

Reviewed by Dean Jackson.

Instead of inspecting a font's name to determine if it is a system font,
on OS X we can ask the system directly.

This patch also moves a platform-specific check into platform-specific
code, so that other platforms don't check for OS X-specific behavior.

Covered by existing tests.

* platform/graphics/Font.cpp:
(WebCore::Font::hasValidAverageCharWidth):
* platform/graphics/Font.h:
* platform/graphics/mac/FontMac.mm:
(WebCore::Font::primaryFontDataIsSystemFont):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@167724 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/Font.cpp
Source/WebCore/platform/graphics/Font.h
Source/WebCore/platform/graphics/mac/FontMac.mm

index 1d8db6fb463eb59cb22be469136716dbb3b959b3..41b06e6d1d46971b9ebf4409c3937f245f48dafa 100644 (file)
@@ -1,3 +1,24 @@
+2014-04-23  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [OS X] Make checking if a font is the system font more robust
+        https://bugs.webkit.org/show_bug.cgi?id=132030
+
+        Reviewed by Dean Jackson.
+
+        Instead of inspecting a font's name to determine if it is a system font,
+        on OS X we can ask the system directly.
+
+        This patch also moves a platform-specific check into platform-specific
+        code, so that other platforms don't check for OS X-specific behavior.
+
+        Covered by existing tests.
+
+        * platform/graphics/Font.cpp:
+        (WebCore::Font::hasValidAverageCharWidth):
+        * platform/graphics/Font.h:
+        * platform/graphics/mac/FontMac.mm:
+        (WebCore::Font::primaryFontDataIsSystemFont):
+
 2014-04-23  David Hyatt  <hyatt@apple.com>
 
         [New Multicolumn] Assertion failure in huge-column-count.html
index f276f1387c89548da7f42cebafba7c71b02d8a9e..6ce31b2f6cd44396b0903cde015ba1380047a326 100644 (file)
@@ -481,11 +481,11 @@ bool Font::hasValidAverageCharWidth() const
     if (family.isEmpty())
         return false;
 
-    // Internal fonts on OS X also have an invalid entry in the table for avgCharWidth.
-    // They are hidden by having a name that begins with a period, so simply search
-    // for that here rather than try to keep the list up to date.
-    if (family.startsWith('.'))
+#if PLATFORM(MAC) || PLATFORM(IOS)
+    // Internal fonts on OS X and iOS also have an invalid entry in the table for avgCharWidth.
+    if (primaryFontDataIsSystemFont())
         return false;
+#endif
 
     static HashSet<AtomicString>* fontFamiliesWithInvalidCharWidthMap = 0;
 
index a35b9bbad02a404e2e8a71b901790863b1c89c64..40049ab65fe03e74d6e013e35f14e07fae88e172 100644 (file)
@@ -189,6 +189,8 @@ public:
     static CodePath characterRangeCodePath(const LChar*, unsigned) { return Simple; }
     static CodePath characterRangeCodePath(const UChar*, unsigned len);
 
+    bool primaryFontDataIsSystemFont() const;
+
 private:
     enum ForTextEmphasisOrNot { NotForTextEmphasis, ForTextEmphasis };
 
index d9300b57ea4f2f32339abec3676b83819716c795..e1eee2d815ebe60059a7aa459d34a10e6f897173 100644 (file)
 #endif
 #import <wtf/MathExtras.h>
 
+#if __has_include(<CoreText/CTFontDescriptorPriv.h>)
+#import <CoreText/CTFontDescriptorPriv.h>
+#endif
+extern "C" bool CTFontDescriptorIsSystemUIFont(CTFontDescriptorRef);
+
 #if ENABLE(LETTERPRESS)
 #import "SoftLinking.h"
 #if __has_include(<CoreGraphics/CoreGraphicsPrivate.h>)
@@ -535,4 +540,16 @@ DashArray Font::dashesForIntersectionsWithRect(const TextRun& run, const FloatPo
 }
 #endif
 
+bool Font::primaryFontDataIsSystemFont() const
+{
+#if PLATFORM(IOS) || __MAC_OS_X_VERSION_MIN_REQUIRED > 1090
+    RetainPtr<CTFontDescriptorRef> descriptor = CTFontCopyFontDescriptor(primaryFont()->platformData().ctFont());
+    return CTFontDescriptorIsSystemUIFont(descriptor.get());
+#else
+    // System fonts are hidden by having a name that begins with a period, so simply search
+    // for that here rather than try to keep the list up to date.
+    return firstFamily().startsWith('.');
+#endif
+}
+
 }