[Chromium] Change OOP Font loading code to use CGFont*() APIs.
authorjeremy@chromium.org <jeremy@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 12 Sep 2011 03:14:42 +0000 (03:14 +0000)
committerjeremy@chromium.org <jeremy@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 12 Sep 2011 03:14:42 +0000 (03:14 +0000)
https://bugs.webkit.org/show_bug.cgi?id=66935

This change is necessary due a bug in ATSFontDeactivate() on 10.7.
See crbug.com/93191 for details.

Reviewed by Eric Seidel.

Source/WebCore:

No new tests - covered by existing tests.

* platform/chromium/PlatformBridge.h:
* platform/graphics/chromium/CrossProcessFontLoading.h:
* platform/graphics/chromium/CrossProcessFontLoading.mm:
(WebCore::MemoryActivatedFont::create):
(WebCore::MemoryActivatedFont::MemoryActivatedFont):
(WebCore::MemoryActivatedFont::~MemoryActivatedFont):

Source/WebKit/chromium:

* public/mac/WebSandboxSupport.h:
* src/PlatformBridge.cpp:
(WebCore::PlatformBridge::loadFont):

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

Source/WebCore/ChangeLog
Source/WebCore/platform/chromium/PlatformSupport.h
Source/WebCore/platform/graphics/chromium/CrossProcessFontLoading.h
Source/WebCore/platform/graphics/chromium/CrossProcessFontLoading.mm
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/public/mac/WebSandboxSupport.h
Source/WebKit/chromium/src/PlatformSupport.cpp

index 780b5af..07087e9 100755 (executable)
@@ -1,3 +1,22 @@
+2011-09-11  Jeremy Moskovich  <jeremy@chromium.org>
+
+        [Chromium] Change OOP Font loading code to use CGFont*() APIs.
+        https://bugs.webkit.org/show_bug.cgi?id=66935
+
+        This change is necessary due a bug in ATSFontDeactivate() on 10.7.
+        See crbug.com/93191 for details.
+
+        Reviewed by Eric Seidel.
+
+        No new tests - covered by existing tests.
+
+        * platform/chromium/PlatformBridge.h:
+        * platform/graphics/chromium/CrossProcessFontLoading.h:
+        * platform/graphics/chromium/CrossProcessFontLoading.mm:
+        (WebCore::MemoryActivatedFont::create):
+        (WebCore::MemoryActivatedFont::MemoryActivatedFont):
+        (WebCore::MemoryActivatedFont::~MemoryActivatedFont):
+
 2011-09-09  Oliver Hunt  <oliver@apple.com>
 
         Remove support for anonymous storage from jsobjects
index 78e0174..e3217bb 100644 (file)
@@ -152,7 +152,7 @@ public:
     static bool ensureFontLoaded(HFONT);
 #endif
 #if OS(DARWIN)
-    static bool loadFont(NSFont* srcFont, ATSFontContainerRef*, uint32_t* fontID);
+    static bool loadFont(NSFont* srcFont, CGFontRef*, uint32_t* fontID);
 #elif OS(UNIX)
     static void getRenderStyleForStrike(const char* family, int sizeAndStyle, FontRenderStyle* result);
     static String getFontFamilyForCharacters(const UChar*, size_t numCharacters, const char* preferredLocale);
index d2c1565..e8deeb1 100644 (file)
@@ -36,8 +36,6 @@
 #import <wtf/text/WTFString.h>
 
 typedef struct CGFont* CGFontRef;
-typedef UInt32 ATSFontContainerRef;
-typedef UInt32 ATSFontRef;
 
 namespace WebCore {
 
@@ -74,25 +72,20 @@ namespace WebCore {
 class MemoryActivatedFont : public RefCounted<MemoryActivatedFont> {
 public:
     // Use to create a new object, see docs on constructor below.
-    static PassRefPtr<MemoryActivatedFont> create(uint32_t fontID, NSFont*, ATSFontContainerRef);
+    static PassRefPtr<MemoryActivatedFont> create(uint32_t fontID, NSFont*, CGFontRef);
     ~MemoryActivatedFont();
     
     // Get cached CGFontRef corresponding to the in-memory font.
     CGFontRef cgFont() { return m_cgFont.get(); }
-    
-    // Get cached ATSFontRef corresponding to the in-memory font.
-    ATSFontRef atsFontRef() { return m_atsFontRef; }
 
 private:
     // srcFontRef - ATSFontRef belonging to the NSFont object that failed to
     // load in-process.
     // container - a font container corresponding to an identical font that
     // we loaded cross-process.
-    MemoryActivatedFont(uint32_t fontID, NSFont*, ATSFontContainerRef);
+    MemoryActivatedFont(uint32_t fontID, NSFont*, CGFontRef);
 
-    ATSFontContainerRef m_fontContainer;
     WTF::RetainPtr<CGFontRef> m_cgFont;
-    ATSFontRef m_atsFontRef;
     uint32_t m_fontID;
     WTF::String m_inSandboxHashKey;
 };
index 6abe3d6..41b9d0f 100644 (file)
@@ -132,68 +132,36 @@ PassRefPtr<MemoryActivatedFont> loadFontFromBrowserProcess(NSFont* nsFont)
     if (font)
         return font;
 
-    ATSFontContainerRef container;
+    CGFontRef tmpCGFont;
     uint32_t fontID;
     // Send cross-process request to load font.
-    if (!PlatformSupport::loadFont(nsFont, &container, &fontID))
+    if (!PlatformSupport::loadFont(nsFont, &tmpCGFont, &fontID))
         return 0;
 
+    RetainPtr<CGFontRef> cgFont(tmpCGFont);
     // Now that we have the fontID from the browser process, we can consult
     // the ID cache.
     font = fontCacheByFontID().get(fontID);
-    if (font) {
-        // We can safely discard the new container since we already have the
-        // font in our cache.
+    if (font)
         // FIXME: PlatformSupport::loadFont() should consult the id cache
-        // before activating the font.  Then we can save this activate/deactive
-        // dance altogether.
-        ATSFontDeactivate(container, 0, kATSOptionFlagsDefault);
+        // before activating the font.
         return font;
-    }
 
-    return MemoryActivatedFont::create(fontID, nsFont, container);
+    return MemoryActivatedFont::create(fontID, nsFont, cgFont.get());
 }
 
 } // namespace
 
-PassRefPtr<MemoryActivatedFont> MemoryActivatedFont::create(uint32_t fontID, NSFont* nsFont, ATSFontContainerRef container)
+PassRefPtr<MemoryActivatedFont> MemoryActivatedFont::create(uint32_t fontID, NSFont* nsFont, CGFontRef cgFont)
 {
-  MemoryActivatedFont* font = new MemoryActivatedFont(fontID, nsFont, container);
-  if (!font->cgFont())  // Object construction failed.
-  {
-      delete font;
-      return 0;
-  }
-  return adoptRef(font);
+  return adoptRef(new MemoryActivatedFont(fontID, nsFont, cgFont));
 }
 
-MemoryActivatedFont::MemoryActivatedFont(uint32_t fontID, NSFont* nsFont, ATSFontContainerRef container)
-    : m_fontContainer(container)
-    , m_atsFontRef(kATSFontRefUnspecified)
+MemoryActivatedFont::MemoryActivatedFont(uint32_t fontID, NSFont* nsFont, CGFontRef cgFont)
+    : m_cgFont(cgFont)
     , m_fontID(fontID)
     , m_inSandboxHashKey(hashKeyFromNSFont(nsFont))
 {
-    if (!container)
-        return;
-    
-    // Count the number of fonts in the container.
-    ItemCount fontCount = 0;
-    OSStatus err = ATSFontFindFromContainer(container, kATSOptionFlagsDefault, 0, 0, &fontCount);
-    if (err != noErr || fontCount < 1)
-        return;
-
-    // For now always assume that we want the first font in the container.
-    ATSFontFindFromContainer(container, kATSOptionFlagsDefault, 1, &m_atsFontRef, 0);
-
-    if (!m_atsFontRef)
-        return;
-
-    // Cache CGFont representation of the font.
-    m_cgFont.adoptCF(CGFontCreateWithPlatformFont(&m_atsFontRef));
-    
-    if (!m_cgFont)
-        return;
-    
     // Add ourselves to caches.
     fontCacheByFontID().add(fontID, this);
     fontCacheByFontName().add(m_inSandboxHashKey, this);
@@ -203,20 +171,12 @@ MemoryActivatedFont::MemoryActivatedFont(uint32_t fontID, NSFont* nsFont, ATSFon
 // from cache.
 MemoryActivatedFont::~MemoryActivatedFont()
 {
-    if (m_cgFont) {
-        // First remove ourselves from the caches.
-        ASSERT(fontCacheByFontID().contains(m_fontID));
-        ASSERT(fontCacheByFontName().contains(m_inSandboxHashKey));
-        
-        fontCacheByFontID().remove(m_fontID);
-        fontCacheByFontName().remove(m_inSandboxHashKey);
-        
-        // Make sure the CGFont is destroyed before its font container.
-        m_cgFont.releaseRef();
-    }
-    
-    if (m_fontContainer != kATSFontContainerRefUnspecified)
-        ATSFontDeactivate(m_fontContainer, 0, kATSOptionFlagsDefault);
+    // First remove ourselves from the caches.
+    ASSERT(fontCacheByFontID().contains(m_fontID));
+    ASSERT(fontCacheByFontName().contains(m_inSandboxHashKey));
+
+    fontCacheByFontID().remove(m_fontID);
+    fontCacheByFontName().remove(m_inSandboxHashKey);
 }
 
 // Given an NSFont, try to load a representation of that font into the cgFont
index 9f1e18b..eefc81a 100644 (file)
@@ -1,3 +1,17 @@
+2011-09-11  Jeremy Moskovich  <jeremy@chromium.org>
+
+        [Chromium] Change OOP Font loading code to use CGFont*() APIs.
+        https://bugs.webkit.org/show_bug.cgi?id=66935
+
+        This change is necessary due a bug in ATSFontDeactivate() on 10.7.
+        See crbug.com/93191 for details.
+
+        Reviewed by Eric Seidel.
+
+        * public/mac/WebSandboxSupport.h:
+        * src/PlatformBridge.cpp:
+        (WebCore::PlatformBridge::loadFont):
+
 2011-09-11  Adam Barth  <abarth@webkit.org>
 
         [Chromium] Add more key codes to WebInputEvent for Android
index 0899a95..34280c6 100644 (file)
@@ -31,7 +31,7 @@
 #ifndef WebSandboxSupport_h
 #define WebSandboxSupport_h
 
-typedef uintptr_t ATSFontContainerRef;
+typedef struct CGFont* CGFontRef;
 
 #ifdef __OBJC__
 @class NSFont;
@@ -45,18 +45,15 @@ namespace WebKit {
 class WebSandboxSupport {
 public:
     // Given an input font - |srcFont| [which can't be loaded due to sandbox
-    // restrictions].  Return a font container belonging to an equivalent
-    // font file that can be used to access the font and a unique identifier
-    // corresponding to the on-disk font file.
-    //
-    // Note that a font container may contain multiple fonts, the caller is
-    // responsible for retreiving the appropriate font from the container.
+    // restrictions]. Return a font belonging to an equivalent font file
+    // that can be used to access the font and a unique identifier corresponding
+    // to the on-disk font file.
     //
     // If this function succeeds, the caller assumes ownership of the |out|
-    // parameter and must call ATSFontDeactivate() to unload it when done.
+    // parameter and must call CGFontRelease() to unload it when done.
     //
     // Returns: true on success, false on error.
-    virtual bool loadFont(NSFont* srcFont, ATSFontContainerRef*, uint32_t* fontID) = 0;
+    virtual bool loadFont(NSFont* srcFont, CGFontRef* out, uint32_t* fontID) = 0;
 };
 
 } // namespace WebKit
index bfc86fe..5487285 100644 (file)
@@ -446,17 +446,17 @@ bool PlatformSupport::ensureFontLoaded(HFONT font)
 #endif
 
 #if OS(DARWIN)
-bool PlatformSupport::loadFont(NSFont* srcFont, ATSFontContainerRef* container, uint32_t* fontID)
+bool PlatformSupport::loadFont(NSFont* srcFont, CGFontRef* out, uint32_t* fontID)
 {
     WebSandboxSupport* ss = webKitPlatformSupport()->sandboxSupport();
     if (ss)
-        return ss->loadFont(srcFont, container, fontID);
+        return ss->loadFont(srcFont, out, fontID);
 
     // This function should only be called in response to an error loading a
     // font due to being blocked by the sandbox.
     // This by definition shouldn't happen if there is no sandbox support.
     ASSERT_NOT_REACHED();
-    *container = 0;
+    *out = 0;
     *fontID = 0;
     return false;
 }