WebKit Bugzilla
Attachment 339264 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-20180501203103.patch (text/plain), 23.03 KB, created by
Myles C. Maxfield
on 2018-05-01 20:31:04 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Myles C. Maxfield
Created:
2018-05-01 20:31:04 PDT
Size:
23.03 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..abbc355e45bbc420833e137b182b01bb19a4bd7b >GIT binary patch >literal 43712 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 > >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