Changeset 201570 in webkit
- Timestamp:
- Jun 1, 2016, 2:40:16 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 14 edited
-
ChangeLog (modified) (1 diff)
-
css/CSSFontFace.cpp (modified) (1 diff)
-
css/CSSFontFace.h (modified) (2 diffs)
-
css/CSSFontFaceSource.cpp (modified) (1 diff)
-
css/CSSFontFaceSource.h (modified) (2 diffs)
-
css/CSSFontSelector.cpp (modified) (1 diff)
-
css/CSSFontSelector.h (modified) (1 diff)
-
css/CSSSegmentedFontFace.cpp (modified) (1 diff)
-
css/CSSSegmentedFontFace.h (modified) (2 diffs)
-
platform/graphics/FontCache.cpp (modified) (4 diffs)
-
platform/graphics/FontCache.h (modified) (3 diffs)
-
platform/graphics/FontCascade.cpp (modified) (2 diffs)
-
platform/graphics/FontSelector.h (modified) (3 diffs)
-
platform/graphics/cocoa/FontCacheCoreText.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r201568 r201570 1 2016-06-01 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r201551 and r201552. 4 https://bugs.webkit.org/show_bug.cgi?id=158275 5 6 This change caused 3 API tests to crash on ios-simulator 7 (Requested by ryanhaddad on #webkit). 8 9 Reverted changesets: 10 11 "Precache primary font in a secondary thread" 12 https://bugs.webkit.org/show_bug.cgi?id=158243 13 http://trac.webkit.org/changeset/201551 14 15 "Remove accidental fprintf." 16 http://trac.webkit.org/changeset/201552 17 1 18 2016-06-01 Chris Fleizach <cfleizach@apple.com> 2 19 -
trunk/Source/WebCore/css/CSSFontFace.cpp
r201551 r201570 521 521 } 522 522 523 Vector<ResolvedFontFamily> CSSFontFace::resolveFamilies() const524 {525 Vector<ResolvedFontFamily> result;526 for (auto& source : m_sources) {527 if (source->familyNameOrURI().isEmpty())528 continue;529 if (source->status() == CSSFontFaceSource::Status::Failure)530 continue;531 result.append({ source->familyNameOrURI(), source->url() });532 }533 return result;534 }535 536 523 #if ENABLE(SVG_FONTS) 537 524 bool CSSFontFace::hasSVGFontFaceSource() const -
trunk/Source/WebCore/css/CSSFontFace.h
r201551 r201570 28 28 #include "CSSFontFaceRule.h" 29 29 #include "FontFeatureSettings.h" 30 #include "FontSelector.h"31 30 #include "TextFlags.h" 32 31 #include <memory> … … 137 136 Ref<FontFace> wrapper(); 138 137 139 Vector<ResolvedFontFamily> resolveFamilies() const;140 141 138 #if ENABLE(SVG_FONTS) 142 139 bool hasSVGFontFaceSource() const; -
trunk/Source/WebCore/css/CSSFontFaceSource.cpp
r201551 r201570 189 189 } 190 190 191 Optional<URL> CSSFontFaceSource::url() const192 {193 if (!m_font)194 return Nullopt;195 return m_font->url();196 }197 198 191 #if ENABLE(SVG_FONTS) 199 192 bool CSSFontFaceSource::isSVGFontFaceSource() const -
trunk/Source/WebCore/css/CSSFontFaceSource.h
r201551 r201570 29 29 #include "CachedFontClient.h" 30 30 #include "CachedResourceHandle.h" 31 #include "URL.h"32 31 #include <runtime/ArrayBufferView.h> 33 32 #include <wtf/text/AtomicString.h> … … 73 72 #endif 74 73 75 Optional<URL> url() const;76 77 74 private: 78 75 void fontLoaded(CachedFont&) override; -
trunk/Source/WebCore/css/CSSFontSelector.cpp
r201551 r201570 335 335 } 336 336 337 Vector<ResolvedFontFamily> CSSFontSelector::resolveFamilies(const Vector<AtomicString>& families, const FontDescription& fontDescription, UChar32 character) 338 { 339 Vector<ResolvedFontFamily> result; 340 341 for (auto& family : families) { 342 if (family.isEmpty()) 343 continue; 344 auto* segmentedFace = m_cssFontFaceSet->getFontFace(fontDescription.traitsMask(), family); 345 if (!segmentedFace) { 346 result.append({ resolveGenericFamily(m_document, fontDescription, family), { } }); 347 continue; 348 } 349 result.appendVector(segmentedFace->resolveFamilies(character)); 350 } 351 352 return result; 353 } 354 355 } 337 } -
trunk/Source/WebCore/css/CSSFontSelector.h
r201551 r201570 65 65 RefPtr<Font> fallbackFontAt(const FontDescription&, size_t) override; 66 66 67 Vector<ResolvedFontFamily> resolveFamilies(const Vector<AtomicString>&, const FontDescription&, UChar32) override;68 69 67 void clearDocument(); 70 68 -
trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp
r201551 r201570 139 139 } 140 140 141 Vector<ResolvedFontFamily> CSSSegmentedFontFace::resolveFamilies(UChar32 character) const142 {143 for (auto& face : m_fontFaces) {144 bool inRange = face->ranges().isEmpty();145 for (auto& range : face->ranges()) {146 if (character >= range.from && character <= range.to) {147 inRange = true;148 break;149 }150 }151 if (inRange)152 return face->resolveFamilies();153 }154 return { };155 141 } 156 157 } -
trunk/Source/WebCore/css/CSSSegmentedFontFace.h
r201551 r201570 29 29 #include "CSSFontFace.h" 30 30 #include "FontCache.h" 31 #include "FontSelector.h"32 31 #include <wtf/HashMap.h> 33 32 #include <wtf/RefCounted.h> … … 59 58 void deref() override { RefCounted<CSSSegmentedFontFace>::deref(); } 60 59 61 Vector<ResolvedFontFamily> resolveFamilies(UChar32 character) const;62 63 60 private: 64 61 CSSSegmentedFontFace(); -
trunk/Source/WebCore/platform/graphics/FontCache.cpp
r201552 r201570 107 107 , m_fontFaceVariantSettings(fontFaceVariantSettings ? *fontFaceVariantSettings : FontVariantSettings()) 108 108 { } 109 FontPlatformDataCacheKey(const FontPlatformDataCacheKey&) = default;110 109 111 110 explicit FontPlatformDataCacheKey(HashTableDeletedValueType t) … … 161 160 } 162 161 163 #if PLATFORM(COCOA) && ENABLE(PLATFORM_FONT_LOOKUP)164 using PrecacheMap = HashMap<FontPlatformDataCacheKey, FontCache::PrecacheTask*, FontPlatformDataCacheKeyHash, WTF::SimpleClassHashTraits<FontPlatformDataCacheKey>>;165 166 static PrecacheMap& precacheTasksInProgress()167 {168 static NeverDestroyed<PrecacheMap> map;169 return map;170 }171 #endif172 173 162 static AtomicString alternateFamilyName(const AtomicString& familyName) 174 163 { … … 254 243 255 244 FontPlatformDataCacheKey key(familyName, fontDescription, fontFaceFeatures, fontFaceVariantSettings); 256 257 #if PLATFORM(COCOA) && ENABLE(PLATFORM_FONT_LOOKUP)258 auto* precacheTask = precacheTasksInProgress().get(key);259 if (precacheTask)260 platformCancelPrecache(*precacheTask);261 #endif262 245 263 246 auto addResult = fontPlatformDataCache().add(key, nullptr); … … 507 490 } 508 491 509 #if PLATFORM(COCOA) && ENABLE(PLATFORM_FONT_LOOKUP)510 void FontCache::precache(const Vector<AtomicString>& resolvedFamilies, const FontDescription& fontDescription)511 {512 if (resolvedFamilies.isEmpty())513 return;514 auto& family = resolvedFamilies.first();515 516 FontPlatformDataCacheKey key(family, fontDescription, nullptr, nullptr);517 518 // Maybe we have it already?519 auto it = fontPlatformDataCache().find(key);520 if (it != fontPlatformDataCache().end()) {521 if (it->value)522 return;523 524 // We already know this font isn't available. Try the next.525 Vector<AtomicString> remainingFamilies;526 remainingFamilies.appendRange(resolvedFamilies.begin() + 1, resolvedFamilies.end());527 precache(remainingFamilies, fontDescription);528 return;529 }530 531 auto taskAdd = precacheTasksInProgress().add(key, nullptr);532 if (!taskAdd.isNewEntry)533 return;534 535 auto& task = platformPrecache(family, fontDescription, [key, resolvedFamilies, fontDescription] (auto platformData, bool wasCanceled) {536 precacheTasksInProgress().remove(key);537 538 if (wasCanceled)539 return;540 541 if (platformData) {542 fontPlatformDataCache().add(key, WTFMove(platformData));543 return;544 }545 546 // Didn't find the font. Try the next one.547 Vector<AtomicString> remainingFamilies;548 549 auto alternateName = alternateFamilyName(resolvedFamilies.first());550 if (!alternateName.isNull()) {551 remainingFamilies = resolvedFamilies;552 remainingFamilies.first() = alternateName;553 } else {554 fontPlatformDataCache().add(key, nullptr);555 remainingFamilies.appendRange(resolvedFamilies.begin() + 1, resolvedFamilies.end());556 }557 558 singleton().precache(remainingFamilies, fontDescription);559 });560 561 taskAdd.iterator->value = &task;562 }563 #else564 void FontCache::precache(const Vector<AtomicString>&, const FontDescription&)565 {566 }567 #endif568 569 492 #if !PLATFORM(COCOA) 570 493 RefPtr<Font> FontCache::similarFont(const FontDescription&, const AtomicString&) -
trunk/Source/WebCore/platform/graphics/FontCache.h
r201551 r201570 194 194 RefPtr<Font> similarFont(const FontDescription&, const AtomicString& family); 195 195 196 void precache(const Vector<AtomicString>& resolvedFamilies, const FontDescription&);197 198 196 void addClient(FontSelector&); 199 197 void removeClient(FontSelector&); … … 215 213 #endif 216 214 217 struct PrecacheTask;218 219 215 private: 220 216 FontCache(); … … 231 227 #endif 232 228 std::unique_ptr<FontPlatformData> createFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings); 233 234 #if PLATFORM(COCOA) && ENABLE(PLATFORM_FONT_LOOKUP)235 using PrecacheCompletionHandler = std::function<void (std::unique_ptr<FontPlatformData>, bool wasCanceled)>;236 PrecacheTask& platformPrecache(const AtomicString& family, const FontDescription&, PrecacheCompletionHandler&&);237 void platformCancelPrecache(PrecacheTask&);238 #endif239 229 240 230 Timer m_purgeTimer; -
trunk/Source/WebCore/platform/graphics/FontCascade.cpp
r201551 r201570 262 262 } 263 263 264 static void precachePrimaryFamily(const FontCascadeDescription& fontDescription, FontSelector& fontSelector)265 {266 Vector<AtomicString> families;267 for (unsigned i = 0; i < fontDescription.familyCount(); ++i)268 families.append(fontDescription.familyAt(i));269 270 // Primary family lookup falls back to the standard family.271 families.append(standardFamily);272 273 auto resolvedPrimaryFamilies = fontSelector.resolveFamilies(families, fontDescription, ' ');274 275 Vector<AtomicString> resolvedPrimaryFamilyNames;276 for (auto& family : resolvedPrimaryFamilies) {277 // This doesn't handle web fonts for now.278 if (family.url)279 break;280 resolvedPrimaryFamilyNames.append(family.name);281 }282 283 // Asynchronously find first available font and precache it so it is likely to be available when needed.284 FontCache::singleton().precache(resolvedPrimaryFamilyNames, fontDescription);285 }286 287 264 static Ref<FontCascadeFonts> retrieveOrAddCachedFonts(const FontCascadeDescription& fontDescription, RefPtr<FontSelector>&& fontSelector) 288 265 { … … 293 270 if (!addResult.isNewEntry && keysMatch(addResult.iterator->value->key, key)) 294 271 return addResult.iterator->value->fonts.get(); 295 296 if (fontSelector)297 precachePrimaryFamily(fontDescription, *fontSelector);298 272 299 273 auto& newEntry = addResult.iterator->value; -
trunk/Source/WebCore/platform/graphics/FontSelector.h
r201551 r201570 27 27 28 28 #include "FontRanges.h" 29 #include "URL.h"30 29 #include <wtf/Forward.h> 31 30 #include <wtf/PassRefPtr.h> … … 46 45 }; 47 46 48 struct ResolvedFontFamily {49 AtomicString name;50 Optional<URL> url;51 };52 53 47 class FontSelector : public RefCounted<FontSelector> { 54 48 public: … … 65 59 virtual void unregisterForInvalidationCallbacks(FontSelectorClient&) = 0; 66 60 67 virtual Vector<ResolvedFontFamily> resolveFamilies(const Vector<AtomicString>& families, const FontDescription&, UChar32 character) = 0;68 69 61 virtual unsigned uniqueId() const = 0; 70 62 virtual unsigned version() const = 0; -
trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp
r201551 r201570 35 35 #include <wtf/MainThread.h> 36 36 #include <wtf/NeverDestroyed.h> 37 #include <wtf/RunLoop.h>38 #include <wtf/WorkQueue.h>39 37 40 38 namespace WebCore { … … 663 661 } 664 662 665 static RetainPtr<CTFontRef> fontWithFamily(const String& family, CTFontSymbolicTraits desiredTraits, FontWeight weight, const FontFeatureSettings& featureSettings, const FontVariantSettings& variantSettings, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const TextRenderingMode& textRenderingMode, float size, bool isWhitelisted) 663 #if ENABLE(PLATFORM_FONT_LOOKUP) 664 static RetainPtr<CTFontRef> platformFontLookupWithFamily(const AtomicString& family, CTFontSymbolicTraits requestedTraits, FontWeight weight, float size) 665 { 666 const auto& whitelist = fontWhitelist(); 667 if (whitelist.size() && !whitelist.contains(family)) 668 return nullptr; 669 670 return adoptCF(CTFontCreateForCSS(family.string().createCFString().get(), toCoreTextFontWeight(weight), requestedTraits, size)); 671 } 672 #endif 673 674 static RetainPtr<CTFontRef> fontWithFamily(const AtomicString& family, CTFontSymbolicTraits desiredTraits, FontWeight weight, const FontFeatureSettings& featureSettings, const FontVariantSettings& variantSettings, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, const TextRenderingMode& textRenderingMode, float size) 666 675 { 667 676 if (family.isEmpty()) … … 671 680 if (!foundFont) { 672 681 #if ENABLE(PLATFORM_FONT_LOOKUP) 673 if (!isWhitelisted) 674 return nullptr; 675 foundFont = adoptCF(CTFontCreateForCSS(family.createCFString().get(), toCoreTextFontWeight(weight), desiredTraits, size)); 682 foundFont = platformFontLookupWithFamily(family, desiredTraits, weight, size); 676 683 #else 677 UNUSED_PARAM(isWhitelisted);678 684 foundFont = platformFontWithFamily(family, desiredTraits, weight, textRenderingMode, size); 679 685 #endif … … 714 720 #endif 715 721 716 // This is only thread safe with ENABLE(PLATFORM_FONT_LOOKUP) due to fontWithFamily() implementation 717 static std::unique_ptr<FontPlatformData> createFontPlatformDataThreadSafe(const FontDescription& fontDescription, const String& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings, bool isWhitelisted, bool shouldAutoActivateIfNeeded) 722 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings) 718 723 { 719 724 CTFontSymbolicTraits traits = computeTraits(fontDescription); 720 725 float size = fontDescription.computedPixelSize(); 721 726 722 RetainPtr<CTFontRef> font = fontWithFamily(family, traits, fontDescription.weight(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), size , isWhitelisted);727 RetainPtr<CTFontRef> font = fontWithFamily(family, traits, fontDescription.weight(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), size); 723 728 724 729 #if PLATFORM(MAC) 725 if (!font && shouldAutoActivateIfNeeded) { 730 if (!font) { 731 if (!shouldAutoActivateFontIfNeeded(family)) 732 return nullptr; 733 726 734 // Auto activate the font before looking for it a second time. 727 735 // Ignore the result because we want to use our own algorithm to actually find the font. 728 autoActivateFont(family, size); 729 730 font = fontWithFamily(family, traits, fontDescription.weight(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), size, isWhitelisted); 731 } 732 #else 733 UNUSED_PARAM(shouldAutoActivateIfNeeded); 736 autoActivateFont(family.string(), size); 737 738 font = fontWithFamily(family, traits, fontDescription.weight(), fontDescription.featureSettings(), fontDescription.variantSettings(), fontFaceFeatures, fontFaceVariantSettings, fontDescription.textRenderingMode(), size); 739 } 734 740 #endif 735 741 … … 741 747 742 748 return std::make_unique<FontPlatformData>(font.get(), size, syntheticBold, syntheticOblique, fontDescription.orientation(), fontDescription.widthVariant(), fontDescription.textRenderingMode()); 743 }744 745 std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings)746 {747 const auto& whitelist = fontWhitelist();748 bool isWhitelisted = whitelist.isEmpty() || whitelist.contains(family);749 750 bool shouldAutoActivateIfNeeded = false;751 #if PLATFORM(MAC)752 shouldAutoActivateIfNeeded = shouldAutoActivateFontIfNeeded(family);753 #endif754 755 return createFontPlatformDataThreadSafe(fontDescription, family, fontFaceFeatures, fontFaceVariantSettings, isWhitelisted, shouldAutoActivateIfNeeded);756 749 } 757 750 … … 804 797 } 805 798 806 #if ENABLE(PLATFORM_FONT_LOOKUP) 807 struct FontCache::PrecacheTask { 808 String family; 809 FontDescription fontDescription; 810 bool shouldAutoActivateIfNeeded { false }; 811 bool isWhitelisted { true }; 812 PrecacheCompletionHandler completionHandler; 813 814 std::unique_ptr<FontPlatformData> result; 815 std::atomic_bool isCanceled { false }; 816 }; 817 818 FontCache::PrecacheTask& FontCache::platformPrecache(const AtomicString& family, const FontDescription& fontDescription, PrecacheCompletionHandler&& completionHandler) 819 { 820 static WorkQueue& queue = WorkQueue::create("org.webkit.font-precache", WorkQueue::Type::Serial, WorkQueue::QOS::UserInitiated).leakRef(); 821 822 auto task = std::make_unique<PrecacheTask>(); 823 task->family = family; 824 task->fontDescription = fontDescription; 825 const auto& whitelist = fontWhitelist(); 826 task->isWhitelisted = whitelist.isEmpty() || whitelist.contains(family); 827 #if PLATFORM(MAC) 828 task->shouldAutoActivateIfNeeded = shouldAutoActivateFontIfNeeded(family); 829 #endif 830 task->completionHandler = WTFMove(completionHandler); 831 832 auto& resultTask = *task; 833 834 queue.dispatch([task = task.release()] { 835 if (!task->isCanceled) { 836 auto family = task->family.isolatedCopy(); 837 task->result = createFontPlatformDataThreadSafe(task->fontDescription, family, nullptr, nullptr, task->isWhitelisted, task->shouldAutoActivateIfNeeded); 838 } 839 840 RunLoop::main().dispatch([task] { 841 std::unique_ptr<PrecacheTask> deleter(task); 842 task->completionHandler(WTFMove(task->result), task->isCanceled); 843 }); 844 }); 845 846 return resultTask; 847 } 848 849 void FontCache::platformCancelPrecache(FontCache::PrecacheTask& task) 850 { 851 task.isCanceled = true; 852 } 853 #endif 854 855 } 799 }
Note:
See TracChangeset
for help on using the changeset viewer.