Index: third_party/harfbuzz-ng/src/hb-coretext.cc |
diff --git a/third_party/harfbuzz-ng/src/hb-coretext.cc b/third_party/harfbuzz-ng/src/hb-coretext.cc |
index e64d2651a5e73bfa579880adf7276350f42cb426..98592af846f450fe320c44ee227b3c110adc3c2f 100644 |
--- a/third_party/harfbuzz-ng/src/hb-coretext.cc |
+++ b/third_party/harfbuzz-ng/src/hb-coretext.cc |
@@ -145,6 +145,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) |
DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed"); |
return NULL; |
} |
+ CFURLRef original_url = (CFURLRef)CTFontCopyAttribute(ct_font, kCTFontURLAttribute); |
/* Create font copy with cascade list that has LastResort first; this speeds up CoreText |
* font fallback which we don't need anyway. */ |
@@ -154,14 +155,31 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) |
CFRelease (last_resort_font_desc); |
if (new_ct_font) |
{ |
- CFRelease (ct_font); |
- ct_font = new_ct_font; |
+ // The CTFontCreateCopyWithAttributes call fails to stay on the same font |
+ // when reconfiguring the cascade list and may switch to a different font |
+ // when there are fonts that go by the same name, since the descriptor is |
+ // just name and size. |
+ |
+ // Avoid reconfiguring the cascade lists if the new font is outside the |
+ // system locations that we cannot access from the sandboxed renderer |
+ // process in Blink. This can be detected by the new file URL location |
+ // that the newly found font points to. |
+ CFURLRef new_url = (CFURLRef)CTFontCopyAttribute(new_ct_font, kCTFontURLAttribute); |
+ if (CFEqual(original_url, new_url)) { |
+ CFRelease (ct_font); |
+ ct_font = new_ct_font; |
+ } else { |
+ CFRelease(new_ct_font); |
+ DEBUG_MSG (CORETEXT, ct_font, "Discarding reconfigured CTFont, location changed."); |
+ } |
+ CFRelease(new_url); |
} |
else |
DEBUG_MSG (CORETEXT, ct_font, "Font copy with empty cascade list failed"); |
} |
- return ct_font; |
+ CFRelease(original_url); |
+ return ct_font; |
} |
struct hb_coretext_shaper_face_data_t { |