WebKit Bugzilla
Attachment 339259 Details for
Bug 184624
: Collection fragment identifiers don't use PostScript names
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-184624-20180501194931.patch (text/plain), 23.01 KB, created by
Myles C. Maxfield
on 2018-05-01 19:49:32 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Myles C. Maxfield
Created:
2018-05-01 19:49:32 PDT
Size:
23.01 KB
patch
obsolete
>Subversion Revision: 231188 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index c4b55410f4575ba272e49d5e425586a5bdd1613c..aae648c14150ce3b85cad9d6505ca2739d42ab78 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,31 @@ >+2018-04-30 Myles C. Maxfield <mmaxfield@apple.com> >+ >+ Collection fragment identifiers don't use PostScript names >+ https://bugs.webkit.org/show_bug.cgi?id=184624 >+ <rdar://problem/39432089> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ In a previous version of the CSS Fonts spec, there was text saying that items in font collections >+ should be 1-indexed (so the first item would be MyFonts.ttc#1). However, this is unfortunate because >+ inserting an item into the middle of a collection would throw off all content that uses the file. >+ Instead, the spec has since changed to use PostScript names (so the content instead would say >+ MyFonts.ttc#MyFont-Regular). >+ >+ Test: fast/text/font-collection.html >+ >+ * css/CSSFontFaceSource.cpp: >+ (WebCore::CSSFontFaceSource::load): >+ * loader/cache/CachedFont.cpp: >+ (WebCore::CachedFont::calculateItemInCollection const): >+ (WebCore::CachedFont::ensureCustomFontData): >+ (WebCore::CachedFont::createCustomFontData): >+ (WebCore::CachedFont::calculateIndex const): Deleted. >+ * loader/cache/CachedFont.h: >+ * platform/graphics/mac/FontCustomPlatformData.cpp: >+ (WebCore::createFontCustomPlatformData): >+ * platform/graphics/mac/FontCustomPlatformData.h: >+ > 2018-04-30 Myles C. Maxfield <mmaxfield@apple.com> > > Improve the performance of FontCascadeDescription's effectiveFamilies >diff --git a/Source/WebCore/css/CSSFontFaceSource.cpp b/Source/WebCore/css/CSSFontFaceSource.cpp >index 85a4eabded866d2c398e56a6a52ad0e51e716b45..1092213a35fe7b2a78034706154a8c670ee8b68d 100644 >--- a/Source/WebCore/css/CSSFontFaceSource.cpp >+++ b/Source/WebCore/css/CSSFontFaceSource.cpp >@@ -159,7 +159,7 @@ void CSSFontFaceSource::load(CSSFontSelector* fontSelector) > if (auto otfFont = convertSVGToOTFFont(fontElement)) > m_generatedOTFBuffer = SharedBuffer::create(WTFMove(otfFont.value())); > if (m_generatedOTFBuffer) { >- m_inDocumentCustomPlatformData = createFontCustomPlatformData(*m_generatedOTFBuffer, 0); >+ m_inDocumentCustomPlatformData = createFontCustomPlatformData(*m_generatedOTFBuffer, String()); > success = static_cast<bool>(m_inDocumentCustomPlatformData); > } > } >@@ -170,7 +170,7 @@ void CSSFontFaceSource::load(CSSFontSelector* fontSelector) > bool wrapping; > RefPtr<SharedBuffer> buffer = SharedBuffer::create(static_cast<const char*>(m_immediateSource->baseAddress()), m_immediateSource->byteLength()); > ASSERT(buffer); >- m_immediateFontCustomPlatformData = CachedFont::createCustomFontData(*buffer, 0, wrapping); >+ m_immediateFontCustomPlatformData = CachedFont::createCustomFontData(*buffer, String(), wrapping); > success = static_cast<bool>(m_immediateFontCustomPlatformData); > } else { > // We are only interested in whether or not fontForFamily() returns null or not. Luckily, none of >diff --git a/Source/WebCore/loader/cache/CachedFont.cpp b/Source/WebCore/loader/cache/CachedFont.cpp >index 2b6815e921f9524a17737773a3fd910faa3b020f..f60a38cc7c96b5a838ada357f5df85ea6e44ef18 100644 >--- a/Source/WebCore/loader/cache/CachedFont.cpp >+++ b/Source/WebCore/loader/cache/CachedFont.cpp >@@ -88,27 +88,19 @@ bool CachedFont::ensureCustomFontData(const AtomicString&) > return ensureCustomFontData(m_data.get()); > } > >-unsigned CachedFont::calculateIndex() const >+String CachedFont::calculateItemInCollection() const > { > auto& url = this->url(); > if (!url.hasFragmentIdentifier()) >- return 0; >- const auto& fragment = url.fragmentIdentifier(); >- unsigned result = 0; >- for (unsigned i = 0; i < fragment.length(); ++i) { >- UChar c = fragment[i]; >- if (c < '0' || c > '9') >- return 0; >- result = result * 10 + (c - '0'); >- } >- return result; >+ return String(); >+ return url.fragmentIdentifier(); > } > > bool CachedFont::ensureCustomFontData(SharedBuffer* data) > { > if (!m_fontCustomPlatformData && !errorOccurred() && !isLoading() && data) { > bool wrapping; >- m_fontCustomPlatformData = createCustomFontData(*data, calculateIndex(), wrapping); >+ m_fontCustomPlatformData = createCustomFontData(*data, calculateItemInCollection(), wrapping); > m_hasCreatedFontDataWrappingResource = m_fontCustomPlatformData && wrapping; > if (!m_fontCustomPlatformData) > setStatus(DecodeError); >@@ -117,7 +109,7 @@ bool CachedFont::ensureCustomFontData(SharedBuffer* data) > return m_fontCustomPlatformData.get(); > } > >-std::unique_ptr<FontCustomPlatformData> CachedFont::createCustomFontData(SharedBuffer& bytes, unsigned index, bool& wrapping) >+std::unique_ptr<FontCustomPlatformData> CachedFont::createCustomFontData(SharedBuffer& bytes, const String& itemInCollection, bool& wrapping) > { > wrapping = true; > >@@ -129,11 +121,11 @@ std::unique_ptr<FontCustomPlatformData> CachedFont::createCustomFontData(SharedB > return nullptr; > > auto buffer = SharedBuffer::create(WTFMove(convertedFont)); >- return createFontCustomPlatformData(buffer, index); >+ return createFontCustomPlatformData(buffer, itemInCollection); > } > #endif > >- return createFontCustomPlatformData(bytes, index); >+ return createFontCustomPlatformData(bytes, itemInCollection); > } > > RefPtr<Font> CachedFont::createFont(const FontDescription& fontDescription, const AtomicString&, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities) >diff --git a/Source/WebCore/loader/cache/CachedFont.h b/Source/WebCore/loader/cache/CachedFont.h >index daa3c732ed38c3b10fe66056a68ba4bab1bf59dc..e9de5ed6b5adc1c6f2704cb64ea0df4ed0d461f4 100644 >--- a/Source/WebCore/loader/cache/CachedFont.h >+++ b/Source/WebCore/loader/cache/CachedFont.h >@@ -52,7 +52,7 @@ public: > bool stillNeedsLoad() const override { return !m_loadInitiated; } > > virtual bool ensureCustomFontData(const AtomicString& remoteURI); >- static std::unique_ptr<FontCustomPlatformData> createCustomFontData(SharedBuffer&, unsigned index, bool& wrapping); >+ static std::unique_ptr<FontCustomPlatformData> createCustomFontData(SharedBuffer&, const String& itemInCollection, bool& wrapping); > static FontPlatformData platformDataFromCustomData(FontCustomPlatformData&, const FontDescription&, bool bold, bool italic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities); > > virtual RefPtr<Font> createFont(const FontDescription&, const AtomicString& remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&, const FontVariantSettings&, FontSelectionSpecifiedCapabilities); >@@ -63,7 +63,7 @@ protected: > bool ensureCustomFontData(SharedBuffer* data); > > private: >- unsigned calculateIndex() const; >+ String calculateItemInCollection() const; > > void checkNotify() override; > bool mayTryReplaceEncodedData() const override; >diff --git a/Source/WebCore/platform/graphics/cairo/FontCustomPlatformData.h b/Source/WebCore/platform/graphics/cairo/FontCustomPlatformData.h >index adb30e767100309dd858e0fe5462e3ebff203e03..c0d72ec02156c96faa9f522183b3f28e428be18a 100644 >--- a/Source/WebCore/platform/graphics/cairo/FontCustomPlatformData.h >+++ b/Source/WebCore/platform/graphics/cairo/FontCustomPlatformData.h >@@ -48,7 +48,7 @@ private: > cairo_font_face_t* m_fontFace; > }; > >-std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer&, unsigned); >+std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer&, const String&); > > } // namespace WebCore > >diff --git a/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp b/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp >index 4c1b16d2c868b92b23fe4a05fe3199c52b660454..d3fc934fe4be263eacd1d1cc93e1f692d010ab66 100644 >--- a/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp >+++ b/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp >@@ -90,7 +90,7 @@ static bool initializeFreeTypeLibrary(FT_Library& library) > return true; > } > >-std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer& buffer, unsigned) >+std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer& buffer, const String&) > { > static FT_Library library; > if (!library && !initializeFreeTypeLibrary(library)) { >diff --git a/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp b/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp >index dc0afa3f917fb9d5311f41fdf3c1e5f78c047558..749a585057434fa3cff4bddd5617622339f87f1a 100644 >--- a/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp >+++ b/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp >@@ -51,7 +51,7 @@ FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& > return FontPlatformData(font.get(), size, bold, italic, orientation, widthVariant, fontDescription.textRenderingMode()); > } > >-std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer& buffer, unsigned index) >+std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer& buffer, const String& itemInCollection) > { > RetainPtr<CFDataRef> bufferData = buffer.createCFData(); > >@@ -63,17 +63,26 @@ std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffe > auto length = CFArrayGetCount(array.get()); > if (length <= 0) > return nullptr; >- if (index > 0) >- --index; >- if (index >= static_cast<unsigned>(length)) >- index = 0; >- fontDescriptor = static_cast<CTFontDescriptorRef>(CFArrayGetValueAtIndex(array.get(), index)); >+ if (!itemInCollection.isNull()) { >+ if (auto desiredName = itemInCollection.createCFString()) { >+ for (CFIndex i = 0; i < length; ++i) { >+ auto candidate = static_cast<CTFontDescriptorRef>(CFArrayGetValueAtIndex(array.get(), i)); >+ auto postScriptName = adoptCF(static_cast<CFStringRef>(CTFontDescriptorCopyAttribute(candidate, kCTFontNameAttribute))); >+ if (CFStringCompare(postScriptName.get(), desiredName.get(), 0) == kCFCompareEqualTo) { >+ fontDescriptor = candidate; >+ break; >+ } >+ } >+ } >+ } >+ if (!fontDescriptor) >+ fontDescriptor = static_cast<CTFontDescriptorRef>(CFArrayGetValueAtIndex(array.get(), 0)); > #else >- UNUSED_PARAM(index); >+ UNUSED_PARAM(itemInCollection); > fontDescriptor = adoptCF(CTFontManagerCreateFontDescriptorFromData(bufferData.get())); >-#endif > if (!fontDescriptor) > return nullptr; >+#endif > > return std::make_unique<FontCustomPlatformData>(fontDescriptor.get()); > } >diff --git a/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h b/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h >index 9cf761898354f0ec792efbc0f3392822d0416a48..ab203fab36cf478835e007e892b410cb7fbeb8b2 100644 >--- a/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h >+++ b/Source/WebCore/platform/graphics/mac/FontCustomPlatformData.h >@@ -57,7 +57,7 @@ public: > RetainPtr<CTFontDescriptorRef> m_fontDescriptor; > }; > >-std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer&, unsigned index); >+std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer&, const String&); > > } > >diff --git a/Source/WebCore/platform/graphics/win/FontCustomPlatformData.cpp b/Source/WebCore/platform/graphics/win/FontCustomPlatformData.cpp >index ec8543fdce8aa600f2c606f8d48ea987356b7cba..21106700ab7565bed26a121a72664bf5f5cc95f8 100644 >--- a/Source/WebCore/platform/graphics/win/FontCustomPlatformData.cpp >+++ b/Source/WebCore/platform/graphics/win/FontCustomPlatformData.cpp >@@ -96,7 +96,7 @@ static String createUniqueFontName() > return fontName; > } > >-std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer& buffer, unsigned) >+std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer& buffer, const String&) > { > String fontName = createUniqueFontName(); > HANDLE fontReference; >diff --git a/Source/WebCore/platform/graphics/win/FontCustomPlatformData.h b/Source/WebCore/platform/graphics/win/FontCustomPlatformData.h >index 2f1aa16e5f2be46c0d0a3056c09ea398776e0eef..28aaaadcc5f130448ac5fab2b5154f1bfdc45de5 100644 >--- a/Source/WebCore/platform/graphics/win/FontCustomPlatformData.h >+++ b/Source/WebCore/platform/graphics/win/FontCustomPlatformData.h >@@ -54,7 +54,7 @@ public: > String m_name; > }; > >-std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer&, unsigned); >+std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer&, const String&); > > } > >diff --git a/Source/WebCore/platform/graphics/win/FontCustomPlatformDataCairo.cpp b/Source/WebCore/platform/graphics/win/FontCustomPlatformDataCairo.cpp >index 0d9a7c30999ac9fe146bb43c4fb43de665dfd113..a3400f1119391ee3218b399abbc3453fb1262fdf 100644 >--- a/Source/WebCore/platform/graphics/win/FontCustomPlatformDataCairo.cpp >+++ b/Source/WebCore/platform/graphics/win/FontCustomPlatformDataCairo.cpp >@@ -85,7 +85,7 @@ static String createUniqueFontName() > return fontName; > } > >-std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer& buffer, unsigned) >+std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer& buffer, const String&) > { > String fontName = createUniqueFontName(); > HANDLE fontReference = renameAndActivateFont(buffer, fontName); >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index b7c81c8732b896e08678030dc37aa3c08c62b8aa..fcf51b02b29fdd449b499c3f4c611b3fe265a0b9 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,15 @@ >+2018-04-30 Myles C. Maxfield <mmaxfield@apple.com> >+ >+ Collection fragment identifiers don't use PostScript names >+ https://bugs.webkit.org/show_bug.cgi?id=184624 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * fast/text/font-collection-expected.html: >+ * fast/text/font-collection.html: >+ * fast/text/resources/collection.ttc: I generated this font collection by hand. The "Ahemerator" font inside it is missing the >+ "A" glyph. >+ > 2018-04-30 Megan Gardner <megan_gardner@apple.com> > > Add tests for selection in content editable >diff --git a/LayoutTests/fast/text/font-collection-expected.html b/LayoutTests/fast/text/font-collection-expected.html >new file mode 100644 >index 0000000000000000000000000000000000000000..69d48e274b592ca5294464749a6bbc1a71f8de97 >--- /dev/null >+++ b/LayoutTests/fast/text/font-collection-expected.html >@@ -0,0 +1,9 @@ >+<!DOCTYPE html> >+<html> >+<head> >+</head> >+<body> >+This test makes sure that font collections work correctly. The font passes if you see a letter "A" below. >+<div style="font: 48px 'Helvetica';">A</div> >+</body> >+</html> >diff --git a/LayoutTests/fast/text/font-collection.html b/LayoutTests/fast/text/font-collection.html >new file mode 100644 >index 0000000000000000000000000000000000000000..87b429e4b92718f5e514e7bc350e31b709e6fd03 >--- /dev/null >+++ b/LayoutTests/fast/text/font-collection.html >@@ -0,0 +1,19 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<style> >+@font-face { >+ font-family: "WebFont1"; >+ src: url("resources/collection.ttc#Ahemerator"); >+} >+@font-face { >+ font-family: "WebFont2"; >+ src: url("resources/collection.ttc#Ahem"); >+} >+</style> >+</head> >+<body> >+This test makes sure that font collections work correctly. The font passes if you see a letter "A" below. >+<div style="font: 48px 'WebFont1', 'Helvetica';">A</div> >+</body> >+</html> >diff --git a/LayoutTests/fast/text/resources/collection.ttc b/LayoutTests/fast/text/resources/collection.ttc >new file mode 100644 >index 0000000000000000000000000000000000000000..97d7fb33dd2f7b0f79cf78649eafeb725f22a625 >GIT binary patch >literal 43712 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 >XKh8`GtX6^5x))fj0;zTHky`%=l^RC) > >literal 0 >HcmV?d00001 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 184624
:
338141
|
339169
|
339259
|
339264
|
339272