<!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  &lt;mmaxfield@apple.com&gt;
+
+        @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  &lt;aestes@apple.com&gt;
</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&lt;CSSSegmentedFontFace*&gt;::iterator end = m_segmentedFontFaces.end();
-    for (HashSet&lt;CSSSegmentedFontFace*&gt;::iterator it = m_segmentedFontFaces.begin(); it != end; ++it)
-        (*it)-&gt;fontLoaded(this);
</del><ins>+    for (auto* face : m_segmentedFontFaces)
+        face-&gt;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&lt;CSSFontFace&gt; {
</span><span class="cx"> public:
</span><del>-    static Ref&lt;CSSFontFace&gt; create(FontTraitsMask traitsMask, PassRefPtr&lt;CSSFontFaceRule&gt; rule, bool isLocalFallback = false) { return adoptRef(*new CSSFontFace(traitsMask, rule, isLocalFallback)); }
</del><ins>+    static Ref&lt;CSSFontFace&gt; create(FontTraitsMask traitsMask, RefPtr&lt;CSSFontFaceRule&gt;&amp;&amp; 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&lt;CSSFontFaceRule&gt; rule, bool isLocalFallback)
</del><ins>+    CSSFontFace(FontTraitsMask traitsMask, RefPtr&lt;CSSFontFaceRule&gt;&amp;&amp; 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&lt;FontTraitsMask&gt; computeTraitsMask(const StyleProperties&amp; style)
</ins><span class="cx"> {
</span><del>-    // Obtain the font-family property and the src property.  Both must be defined.
-    const StyleProperties&amp; style = fontFaceRule-&gt;properties();
-    RefPtr&lt;CSSValue&gt; fontFamily = style.getPropertyCSSValue(CSSPropertyFontFamily);
-    RefPtr&lt;CSSValue&gt; src = style.getPropertyCSSValue(CSSPropertySrc);
-    RefPtr&lt;CSSValue&gt; unicodeRange = style.getPropertyCSSValue(CSSPropertyUnicodeRange);
-    if (!is&lt;CSSValueList&gt;(fontFamily.get()) || !is&lt;CSSValueList&gt;(src.get()) || (unicodeRange &amp;&amp; !is&lt;CSSValueList&gt;(*unicodeRange)))
-        return;
-
-    CSSValueList&amp; familyList = downcast&lt;CSSValueList&gt;(*fontFamily);
-    if (!familyList.length())
-        return;
-
-    CSSValueList&amp; srcList = downcast&lt;CSSValueList&gt;(*src);
-    if (!srcList.length())
-        return;
-
-    CSSValueList* rangeList = downcast&lt;CSSValueList&gt;(unicodeRange.get());
-
</del><span class="cx">     unsigned traitsMask = 0;
</span><span class="cx"> 
</span><span class="cx">     if (RefPtr&lt;CSSValue&gt; fontStyle = style.getPropertyCSSValue(CSSPropertyFontStyle)) {
</span><span class="cx">         if (!is&lt;CSSPrimitiveValue&gt;(*fontStyle))
</span><del>-            return;
</del><ins>+            return Nullopt;
</ins><span class="cx"> 
</span><span class="cx">         switch (downcast&lt;CSSPrimitiveValue&gt;(*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&lt;CSSValue&gt; fontWeight = style.getPropertyCSSValue(CSSPropertyFontWeight)) {
</span><span class="cx">         if (!is&lt;CSSPrimitiveValue&gt;(*fontWeight))
</span><del>-            return;
</del><ins>+            return Nullopt;
</ins><span class="cx"> 
</span><span class="cx">         switch (downcast&lt;CSSPrimitiveValue&gt;(*fontWeight).getValueID()) {
</span><span class="cx">         case CSSValueBold:
</span><span class="lines">@@ -171,12 +153,12 @@
</span><span class="cx">             list-&gt;append(fontVariant.releaseNonNull());
</span><span class="cx">             fontVariant = list.releaseNonNull();
</span><span class="cx">         } else if (!is&lt;CSSValueList&gt;(*fontVariant))
</span><del>-            return;
</del><ins>+            return Nullopt;
</ins><span class="cx"> 
</span><span class="cx">         CSSValueList&amp; variantList = downcast&lt;CSSValueList&gt;(*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 &lt; numVariants; ++i) {
</span><span class="cx">             switch (downcast&lt;CSSPrimitiveValue&gt;(variantList.itemWithoutBoundsCheck(i))-&gt;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&lt;CSSFontFace&gt; fontFace;
</del><ins>+    return static_cast&lt;FontTraitsMask&gt;(traitsMask);
+}
</ins><span class="cx"> 
</span><ins>+static Ref&lt;CSSFontFace&gt; createFontFace(CSSValueList&amp; srcList, FontTraitsMask traitsMask, Document* document, const StyleRuleFontFace* fontFaceRule, bool isInitiatingElementInUserAgentShadowTree)
+{
+    RefPtr&lt;CSSFontFaceRule&gt; 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&lt;CSSFontFaceRule&gt;(fontFaceRule-&gt;createCSSOMWrapper());
+#else
+    UNUSED_PARAM(fontFaceRule);
+#endif
+    Ref&lt;CSSFontFace&gt; 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-&gt;frame() ? &amp;m_document-&gt;frame()-&gt;settings() : 0 : 0;
</del><ins>+            Settings* settings = document ? document-&gt;frame() ? &amp;document-&gt;frame()-&gt;settings() : 0 : 0;
</ins><span class="cx">             bool allowDownloading = foundSVGFont || (settings &amp;&amp; settings-&gt;downloadableBinaryFontsEnabled());
</span><del>-            if (allowDownloading &amp;&amp; item.isSupportedFormat() &amp;&amp; m_document) {
-                CachedFont* cachedFont = item.cachedFont(m_document, foundSVGFont, isInitiatingElementInUserAgentShadowTree);
</del><ins>+            if (allowDownloading &amp;&amp; item.isSupportedFormat() &amp;&amp; document) {
+                CachedFont* cachedFont = item.cachedFont(document, foundSVGFont, isInitiatingElementInUserAgentShadowTree);
</ins><span class="cx">                 if (cachedFont) {
</span><span class="cx">                     source = std::make_unique&lt;CSSFontFaceSource&gt;(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&lt;CSSFontFaceSource&gt;(item.resource());
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!fontFace) {
-            RefPtr&lt;CSSFontFaceRule&gt; 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&lt;CSSFontFaceRule&gt;(fontFaceRule-&gt;createCSSOMWrapper());
-#endif
-            fontFace = CSSFontFace::create(static_cast&lt;FontTraitsMask&gt;(traitsMask), rule);
-        }
-
</del><span class="cx">         if (source) {
</span><span class="cx"> #if ENABLE(SVG_FONTS)
</span><span class="cx">             source-&gt;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 &amp;&amp; !fontFace-&gt;isValid())
</del><ins>+static String familyNameFromPrimitive(const CSSPrimitiveValue&amp; 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&lt;Ref&lt;CSSFontFace&gt;&gt; constructFamilyFontFaces(const String&amp; familyName, HashMap&lt;String, Vector&lt;Ref&lt;CSSFontFace&gt;&gt;, CaseFoldingHash&gt;&amp; locallyInstalledFontFaces)
+{
+    auto result = Vector&lt;Ref&lt;CSSFontFace&gt;&gt;();
+
+    ASSERT(!locallyInstalledFontFaces.contains(familyName));
+
+    Vector&lt;FontTraitsMask&gt; traitsMasks = FontCache::singleton().getTraitsInFamily(familyName);
+    if (!traitsMasks.isEmpty()) {
+        Vector&lt;Ref&lt;CSSFontFace&gt;&gt; faces = { };
+        for (auto mask : traitsMasks) {
+            Ref&lt;CSSFontFace&gt; face = CSSFontFace::create(mask, nullptr, true);
+            face-&gt;addSource(std::make_unique&lt;CSSFontFaceSource&gt;(familyName));
+            ASSERT(face-&gt;isValid());
+            faces.append(WTF::move(face));
+        }
+        locallyInstalledFontFaces.add(familyName, WTF::move(faces));
+    }
+    return result;
+}
+
+void CSSFontSelector::addFontFaceRule(const StyleRuleFontFace* fontFaceRule, bool isInitiatingElementInUserAgentShadowTree)
+{
+    const StyleProperties&amp; style = fontFaceRule-&gt;properties();
+    RefPtr&lt;CSSValue&gt; fontFamily = style.getPropertyCSSValue(CSSPropertyFontFamily);
+    RefPtr&lt;CSSValue&gt; src = style.getPropertyCSSValue(CSSPropertySrc);
+    RefPtr&lt;CSSValue&gt; unicodeRange = style.getPropertyCSSValue(CSSPropertyUnicodeRange);
+    if (!is&lt;CSSValueList&gt;(fontFamily.get()) || !is&lt;CSSValueList&gt;(src.get()) || (unicodeRange &amp;&amp; !is&lt;CSSValueList&gt;(*unicodeRange)))
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    CSSValueList&amp; familyList = downcast&lt;CSSValueList&gt;(*fontFamily);
+    if (!familyList.length())
+        return;
+
+    CSSValueList&amp; srcList = downcast&lt;CSSValueList&gt;(*src);
+    if (!srcList.length())
+        return;
+
+    CSSValueList* rangeList = downcast&lt;CSSValueList&gt;(unicodeRange.get());
+
+    auto computedTraitsMask = computeTraitsMask(style);
+    if (!computedTraitsMask)
+        return;
+    auto traitsMask = computedTraitsMask.value();
+
+    Ref&lt;CSSFontFace&gt; fontFace = createFontFace(srcList, traitsMask, m_document, fontFaceRule, isInitiatingElementInUserAgentShadowTree);
+    if (!fontFace-&gt;isValid())
+        return;
+
</ins><span class="cx">     if (rangeList) {
</span><span class="cx">         unsigned numRanges = rangeList-&gt;length();
</span><span class="cx">         for (unsigned i = 0; i &lt; 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&amp; item : familyList) {
</span><del>-        auto&amp; value = downcast&lt;CSSPrimitiveValue&gt;(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&lt;CSSPrimitiveValue&gt;(item.get()));
</ins><span class="cx">         if (familyName.isEmpty())
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        std::unique_ptr&lt;Vector&lt;RefPtr&lt;CSSFontFace&gt;&gt;&gt;&amp; familyFontFaces = m_fontFaces.add(familyName, nullptr).iterator-&gt;value;
-        if (!familyFontFaces) {
-            familyFontFaces = std::make_unique&lt;Vector&lt;RefPtr&lt;CSSFontFace&gt;&gt;&gt;();
</del><ins>+        auto addResult = m_fontFaces.add(familyName, Vector&lt;Ref&lt;CSSFontFace&gt;&gt;());
+        auto&amp; familyFontFaces = addResult.iterator-&gt;value;
+        if (addResult.isNewEntry)
+            familyFontFaces = constructFamilyFontFaces(familyName, m_locallyInstalledFontFaces);
</ins><span class="cx"> 
</span><del>-            ASSERT(!m_locallyInstalledFontFaces.contains(familyName));
-
-            Vector&lt;unsigned&gt; locallyInstalledFontsTraitsMasks;
-            FontCache::singleton().getTraitsInFamily(familyName, locallyInstalledFontsTraitsMasks);
-            if (unsigned numLocallyInstalledFaces = locallyInstalledFontsTraitsMasks.size()) {
-                auto familyLocallyInstalledFaces = std::make_unique&lt;Vector&lt;RefPtr&lt;CSSFontFace&gt;&gt;&gt;();
-
-                for (unsigned i = 0; i &lt; numLocallyInstalledFaces; ++i) {
-                    RefPtr&lt;CSSFontFace&gt; locallyInstalledFontFace = CSSFontFace::create(static_cast&lt;FontTraitsMask&gt;(locallyInstalledFontsTraitsMasks[i]), 0, true);
-                    locallyInstalledFontFace-&gt;addSource(std::make_unique&lt;CSSFontFaceSource&gt;(familyName));
-                    ASSERT(locallyInstalledFontFace-&gt;isValid());
-                    familyLocallyInstalledFaces-&gt;append(locallyInstalledFontFace);
-                }
-
-                m_locallyInstalledFontFaces.set(familyName, WTF::move(familyLocallyInstalledFaces));
-            }
-        }
-
-        familyFontFaces-&gt;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&amp; first, const CSSFontFace&amp; second)
</ins><span class="cx"> {
</span><del>-    FontTraitsMask firstTraitsMask = first-&gt;traitsMask();
-    FontTraitsMask secondTraitsMask = second-&gt;traitsMask();
</del><ins>+    FontTraitsMask firstTraitsMask = first.traitsMask();
+    FontTraitsMask secondTraitsMask = second.traitsMask();
</ins><span class="cx"> 
</span><span class="cx">     bool firstHasDesiredVariant = firstTraitsMask &amp; desiredTraitsMaskForComparison &amp; FontVariantMask;
</span><span class="cx">     bool secondHasDesiredVariant = secondTraitsMask &amp; desiredTraitsMaskForComparison &amp; 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 &amp; FontVariantSmallCapsMask) &amp;&amp; !first-&gt;isLocalFallback() &amp;&amp; !second-&gt;isLocalFallback()) {
</del><ins>+    if ((desiredTraitsMaskForComparison &amp; FontVariantSmallCapsMask) &amp;&amp; !first.isLocalFallback() &amp;&amp; !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 &amp; FontVariantSmallCapsMask) &amp;&amp; !(firstTraitsMask &amp; 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 &amp; FontStyleItalicMask) &amp;&amp; !first-&gt;isLocalFallback() &amp;&amp; !second-&gt;isLocalFallback()) {
</del><ins>+    if ((desiredTraitsMaskForComparison &amp; FontStyleItalicMask) &amp;&amp; !first.isLocalFallback() &amp;&amp; !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 &amp; FontStyleItalicMask) &amp;&amp; !(firstTraitsMask &amp; FontStyleNormalMask);
</span><span class="lines">@@ -476,25 +485,23 @@
</span><span class="cx"> 
</span><span class="cx"> CSSSegmentedFontFace* CSSFontSelector::getFontFace(const FontDescription&amp; fontDescription, const AtomicString&amp; family)
</span><span class="cx"> {
</span><del>-    Vector&lt;RefPtr&lt;CSSFontFace&gt;&gt;* familyFontFaces = m_fontFaces.get(family);
-    if (!familyFontFaces || familyFontFaces-&gt;isEmpty())
-        return 0;
</del><ins>+    auto iterator = m_fontFaces.find(family);
+    if (iterator == m_fontFaces.end())
+        return nullptr;
+    auto&amp; familyFontFaces = iterator-&gt;value;
</ins><span class="cx"> 
</span><del>-    std::unique_ptr&lt;HashMap&lt;unsigned, RefPtr&lt;CSSSegmentedFontFace&gt;&gt;&gt;&amp; segmentedFontFaceCache = m_fonts.add(family, nullptr).iterator-&gt;value;
-    if (!segmentedFontFaceCache)
-        segmentedFontFaceCache = std::make_unique&lt;HashMap&lt;unsigned, RefPtr&lt;CSSSegmentedFontFace&gt;&gt;&gt;();
</del><ins>+    auto&amp; segmentedFontFaceCache = m_fonts.add(family, HashMap&lt;unsigned, RefPtr&lt;CSSSegmentedFontFace&gt;&gt;()).iterator-&gt;value;
</ins><span class="cx"> 
</span><span class="cx">     FontTraitsMask traitsMask = fontDescription.traitsMask();
</span><span class="cx"> 
</span><del>-    RefPtr&lt;CSSSegmentedFontFace&gt;&amp; face = segmentedFontFaceCache-&gt;add(traitsMask, nullptr).iterator-&gt;value;
</del><ins>+    RefPtr&lt;CSSSegmentedFontFace&gt;&amp; face = segmentedFontFaceCache.add(traitsMask, nullptr).iterator-&gt;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&lt;CSSFontFace*, 32&gt; candidateFontFaces;
-        for (int i = familyFontFaces-&gt;size() - 1; i &gt;= 0; --i) {
-            CSSFontFace* candidate = familyFontFaces-&gt;at(i).get();
-            unsigned candidateTraitsMask = candidate-&gt;traitsMask();
</del><ins>+        Vector&lt;std::reference_wrapper&lt;CSSFontFace&gt;, 32&gt; candidateFontFaces;
+        for (int i = familyFontFaces.size() - 1; i &gt;= 0; --i) {
+            CSSFontFace&amp; candidate = familyFontFaces[i];
+            unsigned candidateTraitsMask = candidate.traitsMask();
</ins><span class="cx">             if ((traitsMask &amp; FontStyleNormalMask) &amp;&amp; !(candidateTraitsMask &amp; FontStyleNormalMask))
</span><span class="cx">                 continue;
</span><span class="cx">             if ((traitsMask &amp; FontVariantNormalMask) &amp;&amp; !(candidateTraitsMask &amp; 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 &quot;normal&quot; 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-&gt;hasSVGFontFaceSource() &amp;&amp; (traitsMask &amp; FontVariantSmallCapsMask) &amp;&amp; !(candidateTraitsMask &amp; FontVariantSmallCapsMask))
</del><ins>+            if (candidate.hasSVGFontFaceSource() &amp;&amp; (traitsMask &amp; FontVariantSmallCapsMask) &amp;&amp; !(candidateTraitsMask &amp; 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&lt;RefPtr&lt;CSSFontFace&gt;&gt;* familyLocallyInstalledFontFaces = m_locallyInstalledFontFaces.get(family)) {
-            unsigned numLocallyInstalledFontFaces = familyLocallyInstalledFontFaces-&gt;size();
-            for (unsigned i = 0; i &lt; numLocallyInstalledFontFaces; ++i) {
-                CSSFontFace* candidate = familyLocallyInstalledFontFaces-&gt;at(i).get();
</del><ins>+        auto iterator = m_locallyInstalledFontFaces.find(family);
+        if (iterator != m_locallyInstalledFontFaces.end()) {
+            for (auto&amp; candidate : iterator-&gt;value) {
</ins><span class="cx">                 unsigned candidateTraitsMask = candidate-&gt;traitsMask();
</span><span class="cx">                 if ((traitsMask &amp; FontStyleNormalMask) &amp;&amp; !(candidateTraitsMask &amp; 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 &lt; numCandidates; ++i)
-            face-&gt;appendFontFace(candidateFontFaces[i]);
</del><ins>+        for (auto&amp; candidate : candidateFontFaces)
+            face-&gt;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&lt;String, std::unique_ptr&lt;Vector&lt;RefPtr&lt;CSSFontFace&gt;&gt;&gt;, CaseFoldingHash&gt; m_fontFaces;
-    HashMap&lt;String, std::unique_ptr&lt;Vector&lt;RefPtr&lt;CSSFontFace&gt;&gt;&gt;, CaseFoldingHash&gt; m_locallyInstalledFontFaces;
-    HashMap&lt;String, std::unique_ptr&lt;HashMap&lt;unsigned, RefPtr&lt;CSSSegmentedFontFace&gt;&gt;&gt;, CaseFoldingHash&gt; m_fonts;
</del><ins>+    HashMap&lt;String, Vector&lt;Ref&lt;CSSFontFace&gt;&gt;, CaseFoldingHash&gt; m_fontFaces;
+    HashMap&lt;String, Vector&lt;Ref&lt;CSSFontFace&gt;&gt;, CaseFoldingHash&gt; m_locallyInstalledFontFaces;
+    HashMap&lt;String, HashMap&lt;unsigned, RefPtr&lt;CSSSegmentedFontFace&gt;&gt;, CaseFoldingHash&gt; m_fonts;
</ins><span class="cx">     HashSet&lt;FontSelectorClient*&gt; m_clients;
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;CachedResourceHandle&lt;CachedFont&gt;&gt; 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 &lt; size; i++)
-        m_fontFaces[i]-&gt;removedFromSegmentedFontFace(this);
</del><ins>+    for (auto&amp; face : m_fontFaces)
+        face-&gt;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 &lt; size; i++) {
-        if (m_fontFaces[i]-&gt;isValid())
</del><ins>+    for (auto&amp; face : m_fontFaces) {
+        if (face-&gt;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&lt;CSSFontFace&gt; fontFace)
</del><ins>+void CSSSegmentedFontFace::appendFontFace(Ref&lt;CSSFontFace&gt;&amp;&amp; fontFace)
</ins><span class="cx"> {
</span><span class="cx">     pruneTable();
</span><span class="cx">     fontFace-&gt;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&amp; ranges, Ref&lt;Font&gt;&amp;&amp; font, const Vector&lt;CSSFontFace::UnicodeRange&gt;&amp; 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&lt;CSSFontFace&gt;);
</del><ins>+    void appendFontFace(Ref&lt;CSSFontFace&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     FontRanges fontRanges(const FontDescription&amp;);
</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&lt;FontDescriptionKey, FontRanges, FontDescriptionKeyHash, WTF::SimpleClassHashTraits&lt;FontDescriptionKey&gt;&gt; m_descriptionToRangesMap;
</span><del>-    Vector&lt;RefPtr&lt;CSSFontFace&gt;, 1&gt; m_fontFaces;
</del><ins>+    Vector&lt;Ref&lt;CSSFontFace&gt;, 1&gt; m_fontFaces;
</ins><span class="cx"> #if ENABLE(FONT_LOAD_EVENTS)
</span><span class="cx">     Vector&lt;RefPtr&lt;LoadFontCallback&gt;&gt; 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&amp;, Vector&lt;unsigned&gt;&amp;);
</del><ins>+    Vector&lt;FontTraitsMask&gt; getTraitsInFamily(const AtomicString&amp;);
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT RefPtr&lt;Font&gt; fontForFamily(const FontDescription&amp;, const AtomicString&amp;, bool checkingAlternateName = false);
</span><span class="cx">     WEBCORE_EXPORT Ref&lt;Font&gt; lastResortFallbackFont(const FontDescription&amp;);
</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&amp; familyName, Vector&lt;unsigned&gt;&amp; traitsMasks)
</del><ins>+Vector&lt;FontTraitsMask&gt; FontCache::getTraitsInFamily(const AtomicString&amp; familyName)
</ins><span class="cx"> {
</span><span class="cx">     RetainPtr&lt;CFStringRef&gt; 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&lt;CTFontDescriptorRef&gt; fontDescriptor = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
</span><span class="cx">     RetainPtr&lt;CFArrayRef&gt; 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&lt;FontTraitsMask&gt; traitsMasks;
+    traitsMasks.reserveInitialCapacity(numMatches);
</ins><span class="cx">     for (CFIndex i = 0; i &lt; numMatches; ++i) {
</span><span class="cx">         RetainPtr&lt;CFDictionaryRef&gt; 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, &amp;symbolicTraits);
</span><span class="cx">             CGFloat weight = 0;
</span><span class="cx">             CFNumberGetValue(weightRef, kCFNumberCGFloatType, &amp;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&amp;, Vector&lt;unsigned&gt;&amp;)
</del><ins>+Vector&lt;FontTraitsMask&gt; FontCache::getTraitsInFamily(const AtomicString&amp;)
</ins><span class="cx"> {
</span><ins>+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static String getFamilyNameStringFromFamily(const AtomicString&amp; 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-&gt;m_traitsMasks.add(traitsMask);
</span><span class="cx">     return 1;
</span><span class="cx"> }
</span><del>-void FontCache::getTraitsInFamily(const AtomicString&amp; familyName, Vector&lt;unsigned&gt;&amp; traitsMasks)
</del><ins>+Vector&lt;FontTraitsMask&gt; FontCache::getTraitsInFamily(const AtomicString&amp; 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, &amp;logFont, traitsInFamilyEnumProc, reinterpret_cast&lt;LPARAM&gt;(&amp;procData), 0);
</span><del>-    copyToVector(procData.m_traitsMasks, traitsMasks);
</del><ins>+    Vector&lt;FontTraitsMask&gt; result;
+    result.reserveInitialCapacity(procData.m_traitsMasks.size());
+    for (unsigned mask : procData.m_traitsMasks)
+        result.uncheckedAppend(static_cast&lt;FontTraitsMask&gt;(mask));
+    return result;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> std::unique_ptr&lt;FontPlatformData&gt; FontCache::createFontPlatformData(const FontDescription&amp; fontDescription, const AtomicString&amp; family)
</span></span></pre>
</div>
</div>

</body>
</html>