<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[188853] trunk/Source/WebCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/188853">188853</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2015-08-24 01:06:00 -0700 (Mon, 24 Aug 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>@font-face related cleanup
https://bugs.webkit.org/show_bug.cgi?id=148355
Reviewed by Darin Adler.
This patch cleans up much of our code related to web fonts. In general, it
migrates to using C++ for-each style loops, uses Ref instead of RefPtr when
things can't be nullptr, migrates to C++ Rvalue-references instead of
PassRefPtr, and refactors CSSFontSelector::addFontFaceRule() to use helper
functions.
No new tests because there is no behavior change.
* css/CSSFontFace.cpp:
(WebCore::CSSFontFace::fontLoaded): Use a C++ for-each loop.
* css/CSSFontFace.h:
(WebCore::CSSFontFace::create): Use C++ Rvalue-references instead of
PassRefPtr.
(WebCore::CSSFontFace::CSSFontFace): Ditto.
* css/CSSFontSelector.cpp:
(WebCore::computeTraitsMask): Migrated a chunk of
CSSFontSelector::addFontFaceRule() into this helper function.
(WebCore::createFontFace): Ditto.
(WebCore::familyNameFromPrimitive): Ditto.
(WebCore::CSSFontSelector::addFontFaceRule): Call the newly-created helper
functions. In addition, migrate to Refs instead of RefPtrs.
(WebCore::compareFontFaces): Migrate to references instead of pointers.
(WebCore::CSSFontSelector::getFontFace): Migrate to Refs instead of
RefPtrs. Also use C++ for-each loops.
* css/CSSFontSelector.h:
* css/CSSSegmentedFontFace.cpp:
(WebCore::CSSSegmentedFontFace::~CSSSegmentedFontFace): Use C++ for-each
loops.
(WebCore::CSSSegmentedFontFace::isValid): Ditto.
(WebCore::CSSSegmentedFontFace::appendFontFace): Migrate to Rvalue-
references instead of PassRefPtr.
* css/CSSSegmentedFontFace.h:
* platform/graphics/FontCache.h:
* platform/graphics/cocoa/FontCacheCoreText.cpp:
(WebCore::FontCache::getTraitsInFamily): Return the result instead of being
passed an out parameter.
* platform/graphics/freetype/FontCacheFreeType.cpp:
(WebCore::FontCache::getTraitsInFamily): Ditto.
* platform/graphics/win/FontCacheWin.cpp:
(WebCore::traitsInFamilyEnumProc): Ditto.
(WebCore::FontCache::getTraitsInFamily): Ditto.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSFontFacecpp">trunk/Source/WebCore/css/CSSFontFace.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSFontFaceh">trunk/Source/WebCore/css/CSSFontFace.h</a></li>
<li><a href="#trunkSourceWebCorecssCSSFontSelectorcpp">trunk/Source/WebCore/css/CSSFontSelector.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSFontSelectorh">trunk/Source/WebCore/css/CSSFontSelector.h</a></li>
<li><a href="#trunkSourceWebCorecssCSSSegmentedFontFacecpp">trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSSegmentedFontFaceh">trunk/Source/WebCore/css/CSSSegmentedFontFace.h</a></li>
<li><a href="#trunkSourceWebCorecssStylePropertiescpp">trunk/Source/WebCore/css/StyleProperties.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsFontCacheh">trunk/Source/WebCore/platform/graphics/FontCache.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscocoaFontCacheCoreTextcpp">trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsfreetypeFontCacheFreeTypecpp">trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicswinFontCacheWincpp">trunk/Source/WebCore/platform/graphics/win/FontCacheWin.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/ChangeLog        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -1,3 +1,52 @@
</span><ins>+2015-08-24 Myles C. Maxfield <mmaxfield@apple.com>
+
+ @font-face related cleanup
+ https://bugs.webkit.org/show_bug.cgi?id=148355
+
+ Reviewed by Darin Adler.
+
+ This patch cleans up much of our code related to web fonts. In general, it
+ migrates to using C++ for-each style loops, uses Ref instead of RefPtr when
+ things can't be nullptr, migrates to C++ Rvalue-references instead of
+ PassRefPtr, and refactors CSSFontSelector::addFontFaceRule() to use helper
+ functions.
+
+ No new tests because there is no behavior change.
+
+ * css/CSSFontFace.cpp:
+ (WebCore::CSSFontFace::fontLoaded): Use a C++ for-each loop.
+ * css/CSSFontFace.h:
+ (WebCore::CSSFontFace::create): Use C++ Rvalue-references instead of
+ PassRefPtr.
+ (WebCore::CSSFontFace::CSSFontFace): Ditto.
+ * css/CSSFontSelector.cpp:
+ (WebCore::computeTraitsMask): Migrated a chunk of
+ CSSFontSelector::addFontFaceRule() into this helper function.
+ (WebCore::createFontFace): Ditto.
+ (WebCore::familyNameFromPrimitive): Ditto.
+ (WebCore::CSSFontSelector::addFontFaceRule): Call the newly-created helper
+ functions. In addition, migrate to Refs instead of RefPtrs.
+ (WebCore::compareFontFaces): Migrate to references instead of pointers.
+ (WebCore::CSSFontSelector::getFontFace): Migrate to Refs instead of
+ RefPtrs. Also use C++ for-each loops.
+ * css/CSSFontSelector.h:
+ * css/CSSSegmentedFontFace.cpp:
+ (WebCore::CSSSegmentedFontFace::~CSSSegmentedFontFace): Use C++ for-each
+ loops.
+ (WebCore::CSSSegmentedFontFace::isValid): Ditto.
+ (WebCore::CSSSegmentedFontFace::appendFontFace): Migrate to Rvalue-
+ references instead of PassRefPtr.
+ * css/CSSSegmentedFontFace.h:
+ * platform/graphics/FontCache.h:
+ * platform/graphics/cocoa/FontCacheCoreText.cpp:
+ (WebCore::FontCache::getTraitsInFamily): Return the result instead of being
+ passed an out parameter.
+ * platform/graphics/freetype/FontCacheFreeType.cpp:
+ (WebCore::FontCache::getTraitsInFamily): Ditto.
+ * platform/graphics/win/FontCacheWin.cpp:
+ (WebCore::traitsInFamilyEnumProc): Ditto.
+ (WebCore::FontCache::getTraitsInFamily): Ditto.
+
</ins><span class="cx"> 2015-08-23 Andy Estes <aestes@apple.com>
</span><span class="cx">
</span><span class="cx"> [Content Filtering] REGRESSION (r182356): Provisional URL is incorrect in didReceiveServerRedirectForProvisionalLoadForFrame when Content Filtering is enabled
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontFacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontFace.cpp (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontFace.cpp        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/css/CSSFontFace.cpp        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -98,9 +98,8 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>- HashSet<CSSSegmentedFontFace*>::iterator end = m_segmentedFontFaces.end();
- for (HashSet<CSSSegmentedFontFace*>::iterator it = m_segmentedFontFaces.begin(); it != end; ++it)
- (*it)->fontLoaded(this);
</del><ins>+ for (auto* face : m_segmentedFontFaces)
+ face->fontLoaded(this);
</ins><span class="cx">
</span><span class="cx"> #if ENABLE(FONT_LOAD_EVENTS)
</span><span class="cx"> if (RuntimeEnabledFeatures::sharedFeatures().fontLoadEventsEnabled())
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontFaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontFace.h (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontFace.h        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/css/CSSFontFace.h        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -44,7 +44,7 @@
</span><span class="cx">
</span><span class="cx"> class CSSFontFace : public RefCounted<CSSFontFace> {
</span><span class="cx"> public:
</span><del>- static Ref<CSSFontFace> create(FontTraitsMask traitsMask, PassRefPtr<CSSFontFaceRule> rule, bool isLocalFallback = false) { return adoptRef(*new CSSFontFace(traitsMask, rule, isLocalFallback)); }
</del><ins>+ static Ref<CSSFontFace> create(FontTraitsMask traitsMask, RefPtr<CSSFontFaceRule>&& rule, bool isLocalFallback = false) { return adoptRef(*new CSSFontFace(traitsMask, WTF::move(rule), isLocalFallback)); }
</ins><span class="cx">
</span><span class="cx"> FontTraitsMask traitsMask() const { return m_traitsMask; }
</span><span class="cx">
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- CSSFontFace(FontTraitsMask traitsMask, PassRefPtr<CSSFontFaceRule> rule, bool isLocalFallback)
</del><ins>+ CSSFontFace(FontTraitsMask traitsMask, RefPtr<CSSFontFaceRule>&& rule, bool isLocalFallback)
</ins><span class="cx"> : m_traitsMask(traitsMask)
</span><span class="cx"> , m_activeSource(0)
</span><span class="cx"> , m_isLocalFallback(isLocalFallback)
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontSelectorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontSelector.cpp (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontSelector.cpp        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/css/CSSFontSelector.cpp        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -84,31 +84,13 @@
</span><span class="cx"> return m_fonts.isEmpty();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void CSSFontSelector::addFontFaceRule(const StyleRuleFontFace* fontFaceRule, bool isInitiatingElementInUserAgentShadowTree)
</del><ins>+static Optional<FontTraitsMask> computeTraitsMask(const StyleProperties& style)
</ins><span class="cx"> {
</span><del>- // Obtain the font-family property and the src property. Both must be defined.
- const StyleProperties& style = fontFaceRule->properties();
- RefPtr<CSSValue> fontFamily = style.getPropertyCSSValue(CSSPropertyFontFamily);
- RefPtr<CSSValue> src = style.getPropertyCSSValue(CSSPropertySrc);
- RefPtr<CSSValue> unicodeRange = style.getPropertyCSSValue(CSSPropertyUnicodeRange);
- if (!is<CSSValueList>(fontFamily.get()) || !is<CSSValueList>(src.get()) || (unicodeRange && !is<CSSValueList>(*unicodeRange)))
- return;
-
- CSSValueList& familyList = downcast<CSSValueList>(*fontFamily);
- if (!familyList.length())
- return;
-
- CSSValueList& srcList = downcast<CSSValueList>(*src);
- if (!srcList.length())
- return;
-
- CSSValueList* rangeList = downcast<CSSValueList>(unicodeRange.get());
-
</del><span class="cx"> unsigned traitsMask = 0;
</span><span class="cx">
</span><span class="cx"> if (RefPtr<CSSValue> fontStyle = style.getPropertyCSSValue(CSSPropertyFontStyle)) {
</span><span class="cx"> if (!is<CSSPrimitiveValue>(*fontStyle))
</span><del>- return;
</del><ins>+ return Nullopt;
</ins><span class="cx">
</span><span class="cx"> switch (downcast<CSSPrimitiveValue>(*fontStyle).getValueID()) {
</span><span class="cx"> case CSSValueNormal:
</span><span class="lines">@@ -126,7 +108,7 @@
</span><span class="cx">
</span><span class="cx"> if (RefPtr<CSSValue> fontWeight = style.getPropertyCSSValue(CSSPropertyFontWeight)) {
</span><span class="cx"> if (!is<CSSPrimitiveValue>(*fontWeight))
</span><del>- return;
</del><ins>+ return Nullopt;
</ins><span class="cx">
</span><span class="cx"> switch (downcast<CSSPrimitiveValue>(*fontWeight).getValueID()) {
</span><span class="cx"> case CSSValueBold:
</span><span class="lines">@@ -171,12 +153,12 @@
</span><span class="cx"> list->append(fontVariant.releaseNonNull());
</span><span class="cx"> fontVariant = list.releaseNonNull();
</span><span class="cx"> } else if (!is<CSSValueList>(*fontVariant))
</span><del>- return;
</del><ins>+ return Nullopt;
</ins><span class="cx">
</span><span class="cx"> CSSValueList& variantList = downcast<CSSValueList>(*fontVariant);
</span><span class="cx"> unsigned numVariants = variantList.length();
</span><span class="cx"> if (!numVariants)
</span><del>- return;
</del><ins>+ return Nullopt;
</ins><span class="cx">
</span><span class="cx"> for (unsigned i = 0; i < numVariants; ++i) {
</span><span class="cx"> switch (downcast<CSSPrimitiveValue>(variantList.itemWithoutBoundsCheck(i))->getValueID()) {
</span><span class="lines">@@ -193,9 +175,21 @@
</span><span class="cx"> } else
</span><span class="cx"> traitsMask |= FontVariantMask;
</span><span class="cx">
</span><del>- // Each item in the src property's list is a single CSSFontFaceSource. Put them all into a CSSFontFace.
- RefPtr<CSSFontFace> fontFace;
</del><ins>+ return static_cast<FontTraitsMask>(traitsMask);
+}
</ins><span class="cx">
</span><ins>+static Ref<CSSFontFace> createFontFace(CSSValueList& srcList, FontTraitsMask traitsMask, Document* document, const StyleRuleFontFace* fontFaceRule, bool isInitiatingElementInUserAgentShadowTree)
+{
+ RefPtr<CSSFontFaceRule> rule;
+#if ENABLE(FONT_LOAD_EVENTS)
+ // FIXME: https://bugs.webkit.org/show_bug.cgi?id=112116 - This CSSFontFaceRule has no parent.
+ if (RuntimeEnabledFeatures::sharedFeatures().fontLoadEventsEnabled())
+ rule = static_pointer_cast<CSSFontFaceRule>(fontFaceRule->createCSSOMWrapper());
+#else
+ UNUSED_PARAM(fontFaceRule);
+#endif
+ Ref<CSSFontFace> fontFace = CSSFontFace::create(traitsMask, WTF::move(rule));
+
</ins><span class="cx"> int srcLength = srcList.length();
</span><span class="cx">
</span><span class="cx"> bool foundSVGFont = false;
</span><span class="lines">@@ -209,10 +203,10 @@
</span><span class="cx"> foundSVGFont = item.isSVGFontFaceSrc() || item.svgFontFaceElement();
</span><span class="cx"> #endif
</span><span class="cx"> if (!item.isLocal()) {
</span><del>- Settings* settings = m_document ? m_document->frame() ? &m_document->frame()->settings() : 0 : 0;
</del><ins>+ Settings* settings = document ? document->frame() ? &document->frame()->settings() : 0 : 0;
</ins><span class="cx"> bool allowDownloading = foundSVGFont || (settings && settings->downloadableBinaryFontsEnabled());
</span><del>- if (allowDownloading && item.isSupportedFormat() && m_document) {
- CachedFont* cachedFont = item.cachedFont(m_document, foundSVGFont, isInitiatingElementInUserAgentShadowTree);
</del><ins>+ if (allowDownloading && item.isSupportedFormat() && document) {
+ CachedFont* cachedFont = item.cachedFont(document, foundSVGFont, isInitiatingElementInUserAgentShadowTree);
</ins><span class="cx"> if (cachedFont) {
</span><span class="cx"> source = std::make_unique<CSSFontFaceSource>(item.resource(), cachedFont);
</span><span class="cx"> #if ENABLE(SVG_FONTS)
</span><span class="lines">@@ -225,16 +219,6 @@
</span><span class="cx"> source = std::make_unique<CSSFontFaceSource>(item.resource());
</span><span class="cx"> }
</span><span class="cx">
</span><del>- if (!fontFace) {
- RefPtr<CSSFontFaceRule> rule;
-#if ENABLE(FONT_LOAD_EVENTS)
- // FIXME: https://bugs.webkit.org/show_bug.cgi?id=112116 - This CSSFontFaceRule has no parent.
- if (RuntimeEnabledFeatures::sharedFeatures().fontLoadEventsEnabled())
- rule = static_pointer_cast<CSSFontFaceRule>(fontFaceRule->createCSSOMWrapper());
-#endif
- fontFace = CSSFontFace::create(static_cast<FontTraitsMask>(traitsMask), rule);
- }
-
</del><span class="cx"> if (source) {
</span><span class="cx"> #if ENABLE(SVG_FONTS)
</span><span class="cx"> source->setSVGFontFaceElement(item.svgFontFaceElement());
</span><span class="lines">@@ -243,11 +227,84 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>- ASSERT(fontFace);
</del><ins>+ return fontFace;
+}
</ins><span class="cx">
</span><del>- if (fontFace && !fontFace->isValid())
</del><ins>+static String familyNameFromPrimitive(const CSSPrimitiveValue& value)
+{
+ if (value.isFontFamily())
+ return value.fontFamily().familyName;
+ if (!value.isValueID())
+ return { };
+
+ // We need to use the raw text for all the generic family types, since @font-face is a way of actually
+ // defining what font to use for those types.
+ switch (value.getValueID()) {
+ case CSSValueSerif:
+ return serifFamily;
+ case CSSValueSansSerif:
+ return sansSerifFamily;
+ case CSSValueCursive:
+ return cursiveFamily;
+ case CSSValueFantasy:
+ return fantasyFamily;
+ case CSSValueMonospace:
+ return monospaceFamily;
+ case CSSValueWebkitPictograph:
+ return pictographFamily;
+ default:
+ return { };
+ }
+}
+
+static Vector<Ref<CSSFontFace>> constructFamilyFontFaces(const String& familyName, HashMap<String, Vector<Ref<CSSFontFace>>, CaseFoldingHash>& locallyInstalledFontFaces)
+{
+ auto result = Vector<Ref<CSSFontFace>>();
+
+ ASSERT(!locallyInstalledFontFaces.contains(familyName));
+
+ Vector<FontTraitsMask> traitsMasks = FontCache::singleton().getTraitsInFamily(familyName);
+ if (!traitsMasks.isEmpty()) {
+ Vector<Ref<CSSFontFace>> faces = { };
+ for (auto mask : traitsMasks) {
+ Ref<CSSFontFace> face = CSSFontFace::create(mask, nullptr, true);
+ face->addSource(std::make_unique<CSSFontFaceSource>(familyName));
+ ASSERT(face->isValid());
+ faces.append(WTF::move(face));
+ }
+ locallyInstalledFontFaces.add(familyName, WTF::move(faces));
+ }
+ return result;
+}
+
+void CSSFontSelector::addFontFaceRule(const StyleRuleFontFace* fontFaceRule, bool isInitiatingElementInUserAgentShadowTree)
+{
+ const StyleProperties& style = fontFaceRule->properties();
+ RefPtr<CSSValue> fontFamily = style.getPropertyCSSValue(CSSPropertyFontFamily);
+ RefPtr<CSSValue> src = style.getPropertyCSSValue(CSSPropertySrc);
+ RefPtr<CSSValue> unicodeRange = style.getPropertyCSSValue(CSSPropertyUnicodeRange);
+ if (!is<CSSValueList>(fontFamily.get()) || !is<CSSValueList>(src.get()) || (unicodeRange && !is<CSSValueList>(*unicodeRange)))
</ins><span class="cx"> return;
</span><span class="cx">
</span><ins>+ CSSValueList& familyList = downcast<CSSValueList>(*fontFamily);
+ if (!familyList.length())
+ return;
+
+ CSSValueList& srcList = downcast<CSSValueList>(*src);
+ if (!srcList.length())
+ return;
+
+ CSSValueList* rangeList = downcast<CSSValueList>(unicodeRange.get());
+
+ auto computedTraitsMask = computeTraitsMask(style);
+ if (!computedTraitsMask)
+ return;
+ auto traitsMask = computedTraitsMask.value();
+
+ Ref<CSSFontFace> fontFace = createFontFace(srcList, traitsMask, m_document, fontFaceRule, isInitiatingElementInUserAgentShadowTree);
+ if (!fontFace->isValid())
+ return;
+
</ins><span class="cx"> if (rangeList) {
</span><span class="cx"> unsigned numRanges = rangeList->length();
</span><span class="cx"> for (unsigned i = 0; i < numRanges; i++) {
</span><span class="lines">@@ -256,65 +313,17 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>- // Hash under every single family name.
</del><span class="cx"> for (auto& item : familyList) {
</span><del>- auto& value = downcast<CSSPrimitiveValue>(item.get());
- String familyName;
- if (value.isFontFamily()) {
- familyName = value.fontFamily().familyName;
- } else if (value.isValueID()) {
- // We need to use the raw text for all the generic family types, since @font-face is a way of actually
- // defining what font to use for those types.
- switch (value.getValueID()) {
- case CSSValueSerif:
- familyName = serifFamily;
- break;
- case CSSValueSansSerif:
- familyName = sansSerifFamily;
- break;
- case CSSValueCursive:
- familyName = cursiveFamily;
- break;
- case CSSValueFantasy:
- familyName = fantasyFamily;
- break;
- case CSSValueMonospace:
- familyName = monospaceFamily;
- break;
- case CSSValueWebkitPictograph:
- familyName = pictographFamily;
- break;
- default:
- break;
- }
- }
-
</del><ins>+ String familyName = familyNameFromPrimitive(downcast<CSSPrimitiveValue>(item.get()));
</ins><span class="cx"> if (familyName.isEmpty())
</span><span class="cx"> continue;
</span><span class="cx">
</span><del>- std::unique_ptr<Vector<RefPtr<CSSFontFace>>>& familyFontFaces = m_fontFaces.add(familyName, nullptr).iterator->value;
- if (!familyFontFaces) {
- familyFontFaces = std::make_unique<Vector<RefPtr<CSSFontFace>>>();
</del><ins>+ auto addResult = m_fontFaces.add(familyName, Vector<Ref<CSSFontFace>>());
+ auto& familyFontFaces = addResult.iterator->value;
+ if (addResult.isNewEntry)
+ familyFontFaces = constructFamilyFontFaces(familyName, m_locallyInstalledFontFaces);
</ins><span class="cx">
</span><del>- ASSERT(!m_locallyInstalledFontFaces.contains(familyName));
-
- Vector<unsigned> locallyInstalledFontsTraitsMasks;
- FontCache::singleton().getTraitsInFamily(familyName, locallyInstalledFontsTraitsMasks);
- if (unsigned numLocallyInstalledFaces = locallyInstalledFontsTraitsMasks.size()) {
- auto familyLocallyInstalledFaces = std::make_unique<Vector<RefPtr<CSSFontFace>>>();
-
- for (unsigned i = 0; i < numLocallyInstalledFaces; ++i) {
- RefPtr<CSSFontFace> locallyInstalledFontFace = CSSFontFace::create(static_cast<FontTraitsMask>(locallyInstalledFontsTraitsMasks[i]), 0, true);
- locallyInstalledFontFace->addSource(std::make_unique<CSSFontFaceSource>(familyName));
- ASSERT(locallyInstalledFontFace->isValid());
- familyLocallyInstalledFaces->append(locallyInstalledFontFace);
- }
-
- m_locallyInstalledFontFaces.set(familyName, WTF::move(familyLocallyInstalledFaces));
- }
- }
-
- familyFontFaces->append(fontFace);
</del><ins>+ familyFontFaces.append(fontFace.copyRef());
</ins><span class="cx">
</span><span class="cx"> ++m_version;
</span><span class="cx"> }
</span><span class="lines">@@ -378,10 +387,10 @@
</span><span class="cx">
</span><span class="cx"> static FontTraitsMask desiredTraitsMaskForComparison;
</span><span class="cx">
</span><del>-static inline bool compareFontFaces(CSSFontFace* first, CSSFontFace* second)
</del><ins>+static inline bool compareFontFaces(const CSSFontFace& first, const CSSFontFace& second)
</ins><span class="cx"> {
</span><del>- FontTraitsMask firstTraitsMask = first->traitsMask();
- FontTraitsMask secondTraitsMask = second->traitsMask();
</del><ins>+ FontTraitsMask firstTraitsMask = first.traitsMask();
+ FontTraitsMask secondTraitsMask = second.traitsMask();
</ins><span class="cx">
</span><span class="cx"> bool firstHasDesiredVariant = firstTraitsMask & desiredTraitsMaskForComparison & FontVariantMask;
</span><span class="cx"> bool secondHasDesiredVariant = secondTraitsMask & desiredTraitsMaskForComparison & FontVariantMask;
</span><span class="lines">@@ -390,7 +399,7 @@
</span><span class="cx"> return firstHasDesiredVariant;
</span><span class="cx">
</span><span class="cx"> // We need to check font-variant css property for CSS2.1 compatibility.
</span><del>- if ((desiredTraitsMaskForComparison & FontVariantSmallCapsMask) && !first->isLocalFallback() && !second->isLocalFallback()) {
</del><ins>+ if ((desiredTraitsMaskForComparison & FontVariantSmallCapsMask) && !first.isLocalFallback() && !second.isLocalFallback()) {
</ins><span class="cx"> // Prefer a font that has indicated that it can only support small-caps to a font that claims to support
</span><span class="cx"> // all variants. The specialized font is more likely to be true small-caps and not require synthesis.
</span><span class="cx"> bool firstRequiresSmallCaps = (firstTraitsMask & FontVariantSmallCapsMask) && !(firstTraitsMask & FontVariantNormalMask);
</span><span class="lines">@@ -405,7 +414,7 @@
</span><span class="cx"> if (firstHasDesiredStyle != secondHasDesiredStyle)
</span><span class="cx"> return firstHasDesiredStyle;
</span><span class="cx">
</span><del>- if ((desiredTraitsMaskForComparison & FontStyleItalicMask) && !first->isLocalFallback() && !second->isLocalFallback()) {
</del><ins>+ if ((desiredTraitsMaskForComparison & FontStyleItalicMask) && !first.isLocalFallback() && !second.isLocalFallback()) {
</ins><span class="cx"> // Prefer a font that has indicated that it can only support italics to a font that claims to support
</span><span class="cx"> // all styles. The specialized font is more likely to be the one the author wants used.
</span><span class="cx"> bool firstRequiresItalics = (firstTraitsMask & FontStyleItalicMask) && !(firstTraitsMask & FontStyleNormalMask);
</span><span class="lines">@@ -476,25 +485,23 @@
</span><span class="cx">
</span><span class="cx"> CSSSegmentedFontFace* CSSFontSelector::getFontFace(const FontDescription& fontDescription, const AtomicString& family)
</span><span class="cx"> {
</span><del>- Vector<RefPtr<CSSFontFace>>* familyFontFaces = m_fontFaces.get(family);
- if (!familyFontFaces || familyFontFaces->isEmpty())
- return 0;
</del><ins>+ auto iterator = m_fontFaces.find(family);
+ if (iterator == m_fontFaces.end())
+ return nullptr;
+ auto& familyFontFaces = iterator->value;
</ins><span class="cx">
</span><del>- std::unique_ptr<HashMap<unsigned, RefPtr<CSSSegmentedFontFace>>>& segmentedFontFaceCache = m_fonts.add(family, nullptr).iterator->value;
- if (!segmentedFontFaceCache)
- segmentedFontFaceCache = std::make_unique<HashMap<unsigned, RefPtr<CSSSegmentedFontFace>>>();
</del><ins>+ auto& segmentedFontFaceCache = m_fonts.add(family, HashMap<unsigned, RefPtr<CSSSegmentedFontFace>>()).iterator->value;
</ins><span class="cx">
</span><span class="cx"> FontTraitsMask traitsMask = fontDescription.traitsMask();
</span><span class="cx">
</span><del>- RefPtr<CSSSegmentedFontFace>& face = segmentedFontFaceCache->add(traitsMask, nullptr).iterator->value;
</del><ins>+ RefPtr<CSSSegmentedFontFace>& face = segmentedFontFaceCache.add(traitsMask, nullptr).iterator->value;
</ins><span class="cx"> if (!face) {
</span><span class="cx"> face = CSSSegmentedFontFace::create(this);
</span><span class="cx">
</span><del>- // Collect all matching faces and sort them in order of preference.
- Vector<CSSFontFace*, 32> candidateFontFaces;
- for (int i = familyFontFaces->size() - 1; i >= 0; --i) {
- CSSFontFace* candidate = familyFontFaces->at(i).get();
- unsigned candidateTraitsMask = candidate->traitsMask();
</del><ins>+ Vector<std::reference_wrapper<CSSFontFace>, 32> candidateFontFaces;
+ for (int i = familyFontFaces.size() - 1; i >= 0; --i) {
+ CSSFontFace& candidate = familyFontFaces[i];
+ unsigned candidateTraitsMask = candidate.traitsMask();
</ins><span class="cx"> if ((traitsMask & FontStyleNormalMask) && !(candidateTraitsMask & FontStyleNormalMask))
</span><span class="cx"> continue;
</span><span class="cx"> if ((traitsMask & FontVariantNormalMask) && !(candidateTraitsMask & FontVariantNormalMask))
</span><span class="lines">@@ -502,16 +509,15 @@
</span><span class="cx"> #if ENABLE(SVG_FONTS)
</span><span class="cx"> // For SVG Fonts that specify that they only support the "normal" variant, we will assume they are incapable
</span><span class="cx"> // of small-caps synthesis and just ignore the font face as a candidate.
</span><del>- if (candidate->hasSVGFontFaceSource() && (traitsMask & FontVariantSmallCapsMask) && !(candidateTraitsMask & FontVariantSmallCapsMask))
</del><ins>+ if (candidate.hasSVGFontFaceSource() && (traitsMask & FontVariantSmallCapsMask) && !(candidateTraitsMask & FontVariantSmallCapsMask))
</ins><span class="cx"> continue;
</span><span class="cx"> #endif
</span><span class="cx"> candidateFontFaces.append(candidate);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- if (Vector<RefPtr<CSSFontFace>>* familyLocallyInstalledFontFaces = m_locallyInstalledFontFaces.get(family)) {
- unsigned numLocallyInstalledFontFaces = familyLocallyInstalledFontFaces->size();
- for (unsigned i = 0; i < numLocallyInstalledFontFaces; ++i) {
- CSSFontFace* candidate = familyLocallyInstalledFontFaces->at(i).get();
</del><ins>+ auto iterator = m_locallyInstalledFontFaces.find(family);
+ if (iterator != m_locallyInstalledFontFaces.end()) {
+ for (auto& candidate : iterator->value) {
</ins><span class="cx"> unsigned candidateTraitsMask = candidate->traitsMask();
</span><span class="cx"> if ((traitsMask & FontStyleNormalMask) && !(candidateTraitsMask & FontStyleNormalMask))
</span><span class="cx"> continue;
</span><span class="lines">@@ -523,9 +529,8 @@
</span><span class="cx">
</span><span class="cx"> desiredTraitsMaskForComparison = traitsMask;
</span><span class="cx"> std::stable_sort(candidateFontFaces.begin(), candidateFontFaces.end(), compareFontFaces);
</span><del>- unsigned numCandidates = candidateFontFaces.size();
- for (unsigned i = 0; i < numCandidates; ++i)
- face->appendFontFace(candidateFontFaces[i]);
</del><ins>+ for (auto& candidate : candidateFontFaces)
+ face->appendFontFace(candidate.get());
</ins><span class="cx"> }
</span><span class="cx"> return face.get();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontSelectorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontSelector.h (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontSelector.h        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/css/CSSFontSelector.h        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -89,9 +89,9 @@
</span><span class="cx"> void beginLoadTimerFired();
</span><span class="cx">
</span><span class="cx"> Document* m_document;
</span><del>- HashMap<String, std::unique_ptr<Vector<RefPtr<CSSFontFace>>>, CaseFoldingHash> m_fontFaces;
- HashMap<String, std::unique_ptr<Vector<RefPtr<CSSFontFace>>>, CaseFoldingHash> m_locallyInstalledFontFaces;
- HashMap<String, std::unique_ptr<HashMap<unsigned, RefPtr<CSSSegmentedFontFace>>>, CaseFoldingHash> m_fonts;
</del><ins>+ HashMap<String, Vector<Ref<CSSFontFace>>, CaseFoldingHash> m_fontFaces;
+ HashMap<String, Vector<Ref<CSSFontFace>>, CaseFoldingHash> m_locallyInstalledFontFaces;
+ HashMap<String, HashMap<unsigned, RefPtr<CSSSegmentedFontFace>>, CaseFoldingHash> m_fonts;
</ins><span class="cx"> HashSet<FontSelectorClient*> m_clients;
</span><span class="cx">
</span><span class="cx"> Vector<CachedResourceHandle<CachedFont>> m_fontsToBeginLoading;
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSSegmentedFontFacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/css/CSSSegmentedFontFace.cpp        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -45,9 +45,8 @@
</span><span class="cx"> CSSSegmentedFontFace::~CSSSegmentedFontFace()
</span><span class="cx"> {
</span><span class="cx"> pruneTable();
</span><del>- unsigned size = m_fontFaces.size();
- for (unsigned i = 0; i < size; i++)
- m_fontFaces[i]->removedFromSegmentedFontFace(this);
</del><ins>+ for (auto& face : m_fontFaces)
+ face->removedFromSegmentedFontFace(this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void CSSSegmentedFontFace::pruneTable()
</span><span class="lines">@@ -58,9 +57,8 @@
</span><span class="cx"> bool CSSSegmentedFontFace::isValid() const
</span><span class="cx"> {
</span><span class="cx"> // Valid if at least one font face is valid.
</span><del>- unsigned size = m_fontFaces.size();
- for (unsigned i = 0; i < size; i++) {
- if (m_fontFaces[i]->isValid())
</del><ins>+ for (auto& face : m_fontFaces) {
+ if (face->isValid())
</ins><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx"> return false;
</span><span class="lines">@@ -84,11 +82,11 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void CSSSegmentedFontFace::appendFontFace(PassRefPtr<CSSFontFace> fontFace)
</del><ins>+void CSSSegmentedFontFace::appendFontFace(Ref<CSSFontFace>&& fontFace)
</ins><span class="cx"> {
</span><span class="cx"> pruneTable();
</span><span class="cx"> fontFace->addedToSegmentedFontFace(this);
</span><del>- m_fontFaces.append(fontFace);
</del><ins>+ m_fontFaces.append(WTF::move(fontFace));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void appendFontWithInvalidUnicodeRangeIfLoading(FontRanges& ranges, Ref<Font>&& font, const Vector<CSSFontFace::UnicodeRange>& unicodeRanges)
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSSegmentedFontFaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSSegmentedFontFace.h (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSSegmentedFontFace.h        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/css/CSSSegmentedFontFace.h        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx">
</span><span class="cx"> void fontLoaded(CSSFontFace*);
</span><span class="cx">
</span><del>- void appendFontFace(PassRefPtr<CSSFontFace>);
</del><ins>+ void appendFontFace(Ref<CSSFontFace>&&);
</ins><span class="cx">
</span><span class="cx"> FontRanges fontRanges(const FontDescription&);
</span><span class="cx">
</span><span class="lines">@@ -75,7 +75,7 @@
</span><span class="cx">
</span><span class="cx"> CSSFontSelector* m_fontSelector;
</span><span class="cx"> HashMap<FontDescriptionKey, FontRanges, FontDescriptionKeyHash, WTF::SimpleClassHashTraits<FontDescriptionKey>> m_descriptionToRangesMap;
</span><del>- Vector<RefPtr<CSSFontFace>, 1> m_fontFaces;
</del><ins>+ Vector<Ref<CSSFontFace>, 1> m_fontFaces;
</ins><span class="cx"> #if ENABLE(FONT_LOAD_EVENTS)
</span><span class="cx"> Vector<RefPtr<LoadFontCallback>> m_callbacks;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCorecssStylePropertiescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleProperties.cpp (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleProperties.cpp        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/css/StyleProperties.cpp        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -583,7 +583,7 @@
</span><span class="cx"> {
</span><span class="cx"> int foundPropertyIndex = findPropertyIndex(propertyID);
</span><span class="cx"> if (foundPropertyIndex == -1)
</span><del>- return 0;
</del><ins>+ return nullptr;
</ins><span class="cx"> return propertyAt(foundPropertyIndex).value();
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsFontCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/FontCache.h (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/FontCache.h        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/platform/graphics/FontCache.h        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -166,7 +166,7 @@
</span><span class="cx">
</span><span class="cx"> // This function exists so CSSFontSelector can have a unified notion of preinstalled fonts and @font-face.
</span><span class="cx"> // It comes into play when you create an @font-face which shares a family name as a preinstalled font.
</span><del>- void getTraitsInFamily(const AtomicString&, Vector<unsigned>&);
</del><ins>+ Vector<FontTraitsMask> getTraitsInFamily(const AtomicString&);
</ins><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT RefPtr<Font> fontForFamily(const FontDescription&, const AtomicString&, bool checkingAlternateName = false);
</span><span class="cx"> WEBCORE_EXPORT Ref<Font> lastResortFallbackFont(const FontDescription&);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscocoaFontCacheCoreTextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -237,7 +237,7 @@
</span><span class="cx"> return font.release();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void FontCache::getTraitsInFamily(const AtomicString& familyName, Vector<unsigned>& traitsMasks)
</del><ins>+Vector<FontTraitsMask> FontCache::getTraitsInFamily(const AtomicString& familyName)
</ins><span class="cx"> {
</span><span class="cx"> RetainPtr<CFStringRef> familyNameStr = familyName.string().createCFString();
</span><span class="cx"> CFStringRef familyNameStrPtr = familyNameStr.get();
</span><span class="lines">@@ -245,12 +245,14 @@
</span><span class="cx"> RetainPtr<CTFontDescriptorRef> fontDescriptor = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
</span><span class="cx"> RetainPtr<CFArrayRef> matchedDescriptors = adoptCF(CTFontDescriptorCreateMatchingFontDescriptors(fontDescriptor.get(), nullptr));
</span><span class="cx"> if (!matchedDescriptors)
</span><del>- return;
</del><ins>+ return { };
</ins><span class="cx">
</span><span class="cx"> CFIndex numMatches = CFArrayGetCount(matchedDescriptors.get());
</span><span class="cx"> if (!numMatches)
</span><del>- return;
</del><ins>+ return { };
</ins><span class="cx">
</span><ins>+ Vector<FontTraitsMask> traitsMasks;
+ traitsMasks.reserveInitialCapacity(numMatches);
</ins><span class="cx"> for (CFIndex i = 0; i < numMatches; ++i) {
</span><span class="cx"> RetainPtr<CFDictionaryRef> traits = adoptCF((CFDictionaryRef)CTFontDescriptorCopyAttribute((CTFontDescriptorRef)CFArrayGetValueAtIndex(matchedDescriptors.get(), i), kCTFontTraitsAttribute));
</span><span class="cx"> CFNumberRef resultRef = (CFNumberRef)CFDictionaryGetValue(traits.get(), kCTFontSymbolicTrait);
</span><span class="lines">@@ -260,9 +262,10 @@
</span><span class="cx"> CFNumberGetValue(resultRef, kCFNumberIntType, &symbolicTraits);
</span><span class="cx"> CGFloat weight = 0;
</span><span class="cx"> CFNumberGetValue(weightRef, kCFNumberCGFloatType, &weight);
</span><del>- traitsMasks.append(toTraitsMask(symbolicTraits, weight));
</del><ins>+ traitsMasks.uncheckedAppend(toTraitsMask(symbolicTraits, weight));
</ins><span class="cx"> }
</span><span class="cx"> }
</span><ins>+ return traitsMasks;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsfreetypeFontCacheFreeTypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -137,8 +137,9 @@
</span><span class="cx"> return *fontForFamily(fontDescription, timesStr, false);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void FontCache::getTraitsInFamily(const AtomicString&, Vector<unsigned>&)
</del><ins>+Vector<FontTraitsMask> FontCache::getTraitsInFamily(const AtomicString&)
</ins><span class="cx"> {
</span><ins>+ return { };
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static String getFamilyNameStringFromFamily(const AtomicString& family)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicswinFontCacheWincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/win/FontCacheWin.cpp (188852 => 188853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/win/FontCacheWin.cpp        2015-08-24 06:54:41 UTC (rev 188852)
+++ trunk/Source/WebCore/platform/graphics/win/FontCacheWin.cpp        2015-08-24 08:06:00 UTC (rev 188853)
</span><span class="lines">@@ -542,7 +542,7 @@
</span><span class="cx"> procData->m_traitsMasks.add(traitsMask);
</span><span class="cx"> return 1;
</span><span class="cx"> }
</span><del>-void FontCache::getTraitsInFamily(const AtomicString& familyName, Vector<unsigned>& traitsMasks)
</del><ins>+Vector<FontTraitsMask> FontCache::getTraitsInFamily(const AtomicString& familyName)
</ins><span class="cx"> {
</span><span class="cx"> HWndDC hdc(0);
</span><span class="cx">
</span><span class="lines">@@ -555,7 +555,11 @@
</span><span class="cx">
</span><span class="cx"> TraitsInFamilyProcData procData(familyName);
</span><span class="cx"> EnumFontFamiliesEx(hdc, &logFont, traitsInFamilyEnumProc, reinterpret_cast<LPARAM>(&procData), 0);
</span><del>- copyToVector(procData.m_traitsMasks, traitsMasks);
</del><ins>+ Vector<FontTraitsMask> result;
+ result.reserveInitialCapacity(procData.m_traitsMasks.size());
+ for (unsigned mask : procData.m_traitsMasks)
+ result.uncheckedAppend(static_cast<FontTraitsMask>(mask));
+ return result;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> std::unique_ptr<FontPlatformData> FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family)
</span></span></pre>
</div>
</div>
</body>
</html>