<!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>[196510] 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/196510">196510</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2016-02-12 14:22:20 -0800 (Fri, 12 Feb 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[CSS Font Loading] Implement CSSFontFace Boilerplate
https://bugs.webkit.org/show_bug.cgi?id=154145

Reviewed by Dean Jackson.

The CSS Font Loading spec[1] dictates that the FontFace object needs to have string
accessors and mutators for a bunch of properties. Our CSSFontFace object currently
contains this parsed information, but it isn't accessible via string-based methods.
This patch adds the necessary accessors and mutators, and migrates CSSFontSelector
to use these mutators where necessary.

There is more work to come on CSSFontFace; the next step is to create an .idl file
and hook it up to our CSSFontFace object. In this patch I have left some
unimplemented pieces (for example: where the spec dictates that some operation should
throw a JavaScript exception) which will be implemented in a follow-up patch. This
patch does not have any visible behavior change; I'm separating out the boilerplate
into this patch in order to ease reviewing burden.

This patch separates the externally-facing JavaScript API into a new class, FontFace.
This class owns a CSSFontFace, which provides the backing implementation. There will
be a system of shared ownership of these objects once FontFaceSet is implemented.

No new tests because there is no behavior change.

* CMakeLists.txt: Add new files to CMake builds.
* WebCore.vcxproj/WebCore.vcxproj: Ditto for Windows.
* WebCore.vcxproj/WebCore.vcxproj.filters: Ditto.
* WebCore.xcodeproj/project.pbxproj: Ditto for Cocoa.
* css/CSSAllInOne.cpp: Ditto for All-In-One builds.
* css/CSSFontFace.cpp: Move shared code from CSSFontSelector into CSSFontFace.
(WebCore::CSSFontFace::CSSFontFace):
(WebCore::CSSFontFace::~CSSFontFace):
(WebCore::CSSFontFace::setFamilies):
(WebCore::CSSFontFace::setStyle):
(WebCore::CSSFontFace::setWeight):
(WebCore::CSSFontFace::setUnicodeRange):
(WebCore::CSSFontFace::setVariantLigatures):
(WebCore::CSSFontFace::setVariantPosition):
(WebCore::CSSFontFace::setVariantCaps):
(WebCore::CSSFontFace::setVariantNumeric):
(WebCore::CSSFontFace::setVariantAlternates):
(WebCore::CSSFontFace::setVariantEastAsian):
(WebCore::CSSFontFace::setFeatureSettings):
* css/CSSFontFace.h: Clean up.
(WebCore::CSSFontFace::create):
(WebCore::CSSFontFace::families):
(WebCore::CSSFontFace::traitsMask):
(WebCore::CSSFontFace::featureSettings):
(WebCore::CSSFontFace::variantSettings):
(WebCore::CSSFontFace::setVariantSettings):
(WebCore::CSSFontFace::setTraitsMask):
(WebCore::CSSFontFace::isLocalFallback):
(WebCore::CSSFontFace::addRange): Deleted.
(WebCore::CSSFontFace::insertFeature): Deleted.
(WebCore::CSSFontFace::setVariantCommonLigatures): Deleted.
(WebCore::CSSFontFace::setVariantDiscretionaryLigatures): Deleted.
(WebCore::CSSFontFace::setVariantHistoricalLigatures): Deleted.
(WebCore::CSSFontFace::setVariantContextualAlternates): Deleted.
(WebCore::CSSFontFace::setVariantPosition): Deleted.
(WebCore::CSSFontFace::setVariantCaps): Deleted.
(WebCore::CSSFontFace::setVariantNumericFigure): Deleted.
(WebCore::CSSFontFace::setVariantNumericSpacing): Deleted.
(WebCore::CSSFontFace::setVariantNumericFraction): Deleted.
(WebCore::CSSFontFace::setVariantNumericOrdinal): Deleted.
(WebCore::CSSFontFace::setVariantNumericSlashedZero): Deleted.
(WebCore::CSSFontFace::setVariantAlternates): Deleted.
(WebCore::CSSFontFace::setVariantEastAsianVariant): Deleted.
(WebCore::CSSFontFace::setVariantEastAsianWidth): Deleted.
(WebCore::CSSFontFace::setVariantEastAsianRuby): Deleted.
(WebCore::CSSFontFace::CSSFontFace): Deleted.
* css/CSSFontSelector.cpp: Migrate shared code into CSSFontFace, and udpate
to use the new API.
(WebCore::appendSources):
(WebCore::registerLocalFontFacesForFamily):
(WebCore::CSSFontSelector::addFontFaceRule):
(WebCore::computeTraitsMask): Deleted.
(WebCore::createFontFace): Deleted.
* css/FontFace.cpp: Added. External JavaScript API. Owns a CSSFontFace.
(WebCore::FontFace::FontFace):
(WebCore::FontFace::~FontFace):
(WebCore::parseString):
(WebCore::FontFace::setFamily):
(WebCore::FontFace::setStyle):
(WebCore::FontFace::setWeight):
(WebCore::FontFace::setStretch):
(WebCore::FontFace::setUnicodeRange):
(WebCore::FontFace::setVariant):
(WebCore::FontFace::setFeatureSettings):
(WebCore::FontFace::family):
(WebCore::FontFace::style):
(WebCore::FontFace::weight):
(WebCore::FontFace::stretch):
(WebCore::FontFace::unicodeRange):
(WebCore::FontFace::variant):
(WebCore::FontFace::featureSettings):
* css/FontFace.h: Added. Ditto.
(WebCore::FontFace::create):
* css/FontVariantBuilder.cpp: Added. Moved code here from FontVariantBuilder.h.
Refactored to support a new client (CSSFontFace).
(WebCore::extractFontVariantLigatures):
(WebCore::extractFontVariantNumeric):
(WebCore::extractFontVariantEastAsian):
(WebCore::computeFontVariant):
* css/FontVariantBuilder.h: Moved code from here into FontVariantBuilder.cpp.
(WebCore::applyValueFontVariantLigatures): Deleted.
(WebCore::applyValueFontVariantNumeric): Deleted.
(WebCore::applyValueFontVariantEastAsian): Deleted.
* css/StyleBuilderCustom.h: Update for new FontVariantBuilder API.
(WebCore::StyleBuilderCustom::applyValueFontVariantLigatures):
(WebCore::StyleBuilderCustom::applyValueFontVariantNumeric):
(WebCore::StyleBuilderCustom::applyValueFontVariantEastAsian):
* platform/text/TextFlags.h: Provide convenience classes.
(WebCore::FontVariantLigaturesValues::FontVariantLigaturesValues):
(WebCore::FontVariantNumericValues::FontVariantNumericValues):
(WebCore::FontVariantEastAsianValues::FontVariantEastAsianValues):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorevcxprojWebCorevcxproj">trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj</a></li>
<li><a href="#trunkSourceWebCoreWebCorevcxprojWebCorevcxprojfilters">trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorecssCSSAllInOnecpp">trunk/Source/WebCore/css/CSSAllInOne.cpp</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="#trunkSourceWebCorecssFontVariantBuilderh">trunk/Source/WebCore/css/FontVariantBuilder.h</a></li>
<li><a href="#trunkSourceWebCorecssStyleBuilderCustomh">trunk/Source/WebCore/css/StyleBuilderCustom.h</a></li>
<li><a href="#trunkSourceWebCoreplatformtextTextFlagsh">trunk/Source/WebCore/platform/text/TextFlags.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCorecssFontFacecpp">trunk/Source/WebCore/css/FontFace.cpp</a></li>
<li><a href="#trunkSourceWebCorecssFontFaceh">trunk/Source/WebCore/css/FontFace.h</a></li>
<li><a href="#trunkSourceWebCorecssFontVariantBuildercpp">trunk/Source/WebCore/css/FontVariantBuilder.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/CMakeLists.txt        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -1299,6 +1299,7 @@
</span><span class="cx">     css/CSSCursorImageValue.cpp
</span><span class="cx">     css/CSSDefaultStyleSheets.cpp
</span><span class="cx">     css/CSSFilterImageValue.cpp
</span><ins>+    css/FontFace.cpp
</ins><span class="cx">     css/CSSFontFace.cpp
</span><span class="cx">     css/CSSFontFaceLoadEvent.cpp
</span><span class="cx">     css/CSSFontFaceRule.cpp
</span><span class="lines">@@ -1355,6 +1356,7 @@
</span><span class="cx">     css/DocumentRuleSets.cpp
</span><span class="cx">     css/ElementRuleCollector.cpp
</span><span class="cx">     css/FontLoader.cpp
</span><ins>+    css/FontVariantBuilder.cpp
</ins><span class="cx">     css/InspectorCSSOMWrappers.cpp
</span><span class="cx">     css/LengthFunctions.cpp
</span><span class="cx">     css/MediaFeatureNames.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/ChangeLog        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -1,3 +1,121 @@
</span><ins>+2016-02-12  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        [CSS Font Loading] Implement CSSFontFace Boilerplate
+        https://bugs.webkit.org/show_bug.cgi?id=154145
+
+        Reviewed by Dean Jackson.
+
+        The CSS Font Loading spec[1] dictates that the FontFace object needs to have string
+        accessors and mutators for a bunch of properties. Our CSSFontFace object currently
+        contains this parsed information, but it isn't accessible via string-based methods.
+        This patch adds the necessary accessors and mutators, and migrates CSSFontSelector
+        to use these mutators where necessary.
+
+        There is more work to come on CSSFontFace; the next step is to create an .idl file
+        and hook it up to our CSSFontFace object. In this patch I have left some
+        unimplemented pieces (for example: where the spec dictates that some operation should
+        throw a JavaScript exception) which will be implemented in a follow-up patch. This
+        patch does not have any visible behavior change; I'm separating out the boilerplate
+        into this patch in order to ease reviewing burden.
+
+        This patch separates the externally-facing JavaScript API into a new class, FontFace.
+        This class owns a CSSFontFace, which provides the backing implementation. There will
+        be a system of shared ownership of these objects once FontFaceSet is implemented.
+
+        No new tests because there is no behavior change.
+
+        * CMakeLists.txt: Add new files to CMake builds.
+        * WebCore.vcxproj/WebCore.vcxproj: Ditto for Windows.
+        * WebCore.vcxproj/WebCore.vcxproj.filters: Ditto.
+        * WebCore.xcodeproj/project.pbxproj: Ditto for Cocoa.
+        * css/CSSAllInOne.cpp: Ditto for All-In-One builds.
+        * css/CSSFontFace.cpp: Move shared code from CSSFontSelector into CSSFontFace.
+        (WebCore::CSSFontFace::CSSFontFace):
+        (WebCore::CSSFontFace::~CSSFontFace):
+        (WebCore::CSSFontFace::setFamilies):
+        (WebCore::CSSFontFace::setStyle):
+        (WebCore::CSSFontFace::setWeight):
+        (WebCore::CSSFontFace::setUnicodeRange):
+        (WebCore::CSSFontFace::setVariantLigatures):
+        (WebCore::CSSFontFace::setVariantPosition):
+        (WebCore::CSSFontFace::setVariantCaps):
+        (WebCore::CSSFontFace::setVariantNumeric):
+        (WebCore::CSSFontFace::setVariantAlternates):
+        (WebCore::CSSFontFace::setVariantEastAsian):
+        (WebCore::CSSFontFace::setFeatureSettings):
+        * css/CSSFontFace.h: Clean up.
+        (WebCore::CSSFontFace::create):
+        (WebCore::CSSFontFace::families):
+        (WebCore::CSSFontFace::traitsMask):
+        (WebCore::CSSFontFace::featureSettings):
+        (WebCore::CSSFontFace::variantSettings):
+        (WebCore::CSSFontFace::setVariantSettings):
+        (WebCore::CSSFontFace::setTraitsMask):
+        (WebCore::CSSFontFace::isLocalFallback):
+        (WebCore::CSSFontFace::addRange): Deleted.
+        (WebCore::CSSFontFace::insertFeature): Deleted.
+        (WebCore::CSSFontFace::setVariantCommonLigatures): Deleted.
+        (WebCore::CSSFontFace::setVariantDiscretionaryLigatures): Deleted.
+        (WebCore::CSSFontFace::setVariantHistoricalLigatures): Deleted.
+        (WebCore::CSSFontFace::setVariantContextualAlternates): Deleted.
+        (WebCore::CSSFontFace::setVariantPosition): Deleted.
+        (WebCore::CSSFontFace::setVariantCaps): Deleted.
+        (WebCore::CSSFontFace::setVariantNumericFigure): Deleted.
+        (WebCore::CSSFontFace::setVariantNumericSpacing): Deleted.
+        (WebCore::CSSFontFace::setVariantNumericFraction): Deleted.
+        (WebCore::CSSFontFace::setVariantNumericOrdinal): Deleted.
+        (WebCore::CSSFontFace::setVariantNumericSlashedZero): Deleted.
+        (WebCore::CSSFontFace::setVariantAlternates): Deleted.
+        (WebCore::CSSFontFace::setVariantEastAsianVariant): Deleted.
+        (WebCore::CSSFontFace::setVariantEastAsianWidth): Deleted.
+        (WebCore::CSSFontFace::setVariantEastAsianRuby): Deleted.
+        (WebCore::CSSFontFace::CSSFontFace): Deleted.
+        * css/CSSFontSelector.cpp: Migrate shared code into CSSFontFace, and udpate
+        to use the new API.
+        (WebCore::appendSources):
+        (WebCore::registerLocalFontFacesForFamily):
+        (WebCore::CSSFontSelector::addFontFaceRule):
+        (WebCore::computeTraitsMask): Deleted.
+        (WebCore::createFontFace): Deleted.
+        * css/FontFace.cpp: Added. External JavaScript API. Owns a CSSFontFace.
+        (WebCore::FontFace::FontFace):
+        (WebCore::FontFace::~FontFace):
+        (WebCore::parseString):
+        (WebCore::FontFace::setFamily):
+        (WebCore::FontFace::setStyle):
+        (WebCore::FontFace::setWeight):
+        (WebCore::FontFace::setStretch):
+        (WebCore::FontFace::setUnicodeRange):
+        (WebCore::FontFace::setVariant):
+        (WebCore::FontFace::setFeatureSettings):
+        (WebCore::FontFace::family):
+        (WebCore::FontFace::style):
+        (WebCore::FontFace::weight):
+        (WebCore::FontFace::stretch):
+        (WebCore::FontFace::unicodeRange):
+        (WebCore::FontFace::variant):
+        (WebCore::FontFace::featureSettings):
+        * css/FontFace.h: Added. Ditto.
+        (WebCore::FontFace::create):
+        * css/FontVariantBuilder.cpp: Added. Moved code here from FontVariantBuilder.h.
+        Refactored to support a new client (CSSFontFace).
+        (WebCore::extractFontVariantLigatures):
+        (WebCore::extractFontVariantNumeric):
+        (WebCore::extractFontVariantEastAsian):
+        (WebCore::computeFontVariant):
+        * css/FontVariantBuilder.h: Moved code from here into FontVariantBuilder.cpp.
+        (WebCore::applyValueFontVariantLigatures): Deleted.
+        (WebCore::applyValueFontVariantNumeric): Deleted.
+        (WebCore::applyValueFontVariantEastAsian): Deleted.
+        * css/StyleBuilderCustom.h: Update for new FontVariantBuilder API.
+        (WebCore::StyleBuilderCustom::applyValueFontVariantLigatures):
+        (WebCore::StyleBuilderCustom::applyValueFontVariantNumeric):
+        (WebCore::StyleBuilderCustom::applyValueFontVariantEastAsian):
+        * platform/text/TextFlags.h: Provide convenience classes.
+        (WebCore::FontVariantLigaturesValues::FontVariantLigaturesValues):
+        (WebCore::FontVariantNumericValues::FontVariantNumericValues):
+        (WebCore::FontVariantEastAsianValues::FontVariantEastAsianValues):
+
</ins><span class="cx"> 2016-02-12  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Build fix after r196506; publish MediaResourceLoader.h as a private header so it can be used by
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorevcxprojWebCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -9583,6 +9583,20 @@
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\css\FontFace.cpp&quot;&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug_WinCairo|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='DebugSuffix|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release_WinCairo|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\css\CSSFontFace.cpp&quot;&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="lines">@@ -10242,6 +10256,20 @@
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\css\FontVariantBuilder.cpp&quot;&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug_WinCairo|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='DebugSuffix|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release_WinCairo|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\css\FontLoader.cpp&quot;&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="lines">@@ -21630,6 +21658,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\css\CSSCursorImageValue.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\css\CSSFilterImageValue.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\css\CSSFontFace.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\css\FontFace.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\css\CSSFontFaceLoadEvent.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\css\CSSFontFaceRule.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\css\CSSFontFaceSource.h&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorevcxprojWebCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -2084,6 +2084,9 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\css\CSSCursorImageValue.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;css&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\css\FontFace.cpp&quot;&gt;
+      &lt;Filter&gt;css&lt;/Filter&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\css\CSSFontFace.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;css&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><span class="lines">@@ -2222,6 +2225,9 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\css\CSSVariableValue.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;css&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\css\FontVariantBuilder.cpp&quot;&gt;
+      &lt;Filter&gt;css&lt;/Filter&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\css\FontLoader.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;css&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><span class="lines">@@ -9052,6 +9058,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\css\CSSCursorImageValue.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;css&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\css\FontFace.h&quot;&gt;
+      &lt;Filter&gt;css&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\css\CSSFontFace.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;css&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -951,9 +951,12 @@
</span><span class="cx">                 1C21E57D183ED1FF001C289D /* IOSurfacePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C21E57B183ED1FF001C289D /* IOSurfacePool.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 1C2417BA1992C04100EF9938 /* SpellingDot@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C2417B91992C04100EF9938 /* SpellingDot@3x.png */; };
</span><span class="cx">                 1C26497A0D7E248A00BD10F2 /* DocumentLoaderMac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1C2649790D7E248A00BD10F2 /* DocumentLoaderMac.cpp */; };
</span><ins>+                1C3249111C6D6A3B007EDB32 /* FontVariantBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1C3249101C6D6A3B007EDB32 /* FontVariantBuilder.cpp */; };
</ins><span class="cx">                 1C3969D01B74211E002BCFA7 /* FontCacheCoreText.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1C3969CF1B74211E002BCFA7 /* FontCacheCoreText.cpp */; };
</span><span class="cx">                 1C6466251A12C38E0094603C /* CoreTextSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C5E980F1A02CEFA002DB55F /* CoreTextSPI.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 1C6466281A12C4200094603C /* NSFontSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C6466271A12C3F90094603C /* NSFontSPI.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                1C6626101C6E7CA600AB527C /* FontFace.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1C66260E1C6E7CA600AB527C /* FontFace.cpp */; };
+                1C6626111C6E7CA600AB527C /* FontFace.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C66260F1C6E7CA600AB527C /* FontFace.h */; };
</ins><span class="cx">                 1C81B95A0E97330800266E07 /* InspectorController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C81B9560E97330800266E07 /* InspectorController.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 1C81B95B0E97330800266E07 /* InspectorController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1C81B9570E97330800266E07 /* InspectorController.cpp */; };
</span><span class="cx">                 1C81B95C0E97330800266E07 /* InspectorClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C81B9580E97330800266E07 /* InspectorClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -8352,9 +8355,12 @@
</span><span class="cx">                 1C21E57B183ED1FF001C289D /* IOSurfacePool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IOSurfacePool.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1C2417B91992C04100EF9938 /* SpellingDot@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = &quot;SpellingDot@3x.png&quot;; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1C2649790D7E248A00BD10F2 /* DocumentLoaderMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DocumentLoaderMac.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                1C3249101C6D6A3B007EDB32 /* FontVariantBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontVariantBuilder.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 1C3969CF1B74211E002BCFA7 /* FontCacheCoreText.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontCacheCoreText.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1C5E980F1A02CEFA002DB55F /* CoreTextSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoreTextSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1C6466271A12C3F90094603C /* NSFontSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSFontSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                1C66260E1C6E7CA600AB527C /* FontFace.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontFace.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                1C66260F1C6E7CA600AB527C /* FontFace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FontFace.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 1C81B9560E97330800266E07 /* InspectorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorController.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1C81B9570E97330800266E07 /* InspectorController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorController.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1C81B9580E97330800266E07 /* InspectorClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -23703,6 +23709,9 @@
</span><span class="cx">                                 3FFFF9A6159D9A550020BBD5 /* WebKitCSSViewportRule.cpp */,
</span><span class="cx">                                 3FFFF9A7159D9A550020BBD5 /* WebKitCSSViewportRule.h */,
</span><span class="cx">                                 3F2B33E3165ABD3500E3987C /* WebKitCSSViewportRule.idl */,
</span><ins>+                                1C3249101C6D6A3B007EDB32 /* FontVariantBuilder.cpp */,
+                                1C66260E1C6E7CA600AB527C /* FontFace.cpp */,
+                                1C66260F1C6E7CA600AB527C /* FontFace.h */,
</ins><span class="cx">                         );
</span><span class="cx">                         path = css;
</span><span class="cx">                         sourceTree = &quot;&lt;group&gt;&quot;;
</span><span class="lines">@@ -24996,6 +25005,7 @@
</span><span class="cx">                                 BCB16C1C0979C3BD00467741 /* CachedImage.h in Headers */,
</span><span class="cx">                                 319FBD5F15D2F464009640A6 /* CachedImageClient.h in Headers */,
</span><span class="cx">                                 510184690B08602A004A825F /* CachedPage.h in Headers */,
</span><ins>+                                1C6626111C6E7CA600AB527C /* FontFace.h in Headers */,
</ins><span class="cx">                                 D0EDA775143E303C0028E383 /* CachedRawResource.h in Headers */,
</span><span class="cx">                                 E1B533491717DEE300F205F9 /* CachedRawResourceClient.h in Headers */,
</span><span class="cx">                                 BCB16C200979C3BD00467741 /* CachedResource.h in Headers */,
</span><span class="lines">@@ -29911,6 +29921,7 @@
</span><span class="cx">                                 B275357D0B053814002CE64F /* IntRectMac.mm in Sources */,
</span><span class="cx">                                 2D46F05017B96FD2005647F0 /* IntSize.cpp in Sources */,
</span><span class="cx">                                 B27535620B053814002CE64F /* IntSizeCG.cpp in Sources */,
</span><ins>+                                1C3249111C6D6A3B007EDB32 /* FontVariantBuilder.cpp in Sources */,
</ins><span class="cx">                                 B275357E0B053814002CE64F /* IntSizeMac.mm in Sources */,
</span><span class="cx">                                 2D0B4AAC18DA1CCD00434DE1 /* IOSurface.mm in Sources */,
</span><span class="cx">                                 1C21E57C183ED1FF001C289D /* IOSurfacePool.cpp in Sources */,
</span><span class="lines">@@ -30112,6 +30123,7 @@
</span><span class="cx">                                 BCCBAD400C18C14200CE890F /* JSHTMLCollection.cpp in Sources */,
</span><span class="cx">                                 BCCBAD3B0C18BFF800CE890F /* JSHTMLCollectionCustom.cpp in Sources */,
</span><span class="cx">                                 F5C041E60FFCA96D00839D4A /* JSHTMLDataListElement.cpp in Sources */,
</span><ins>+                                1C6626101C6E7CA600AB527C /* FontFace.cpp in Sources */,
</ins><span class="cx">                                 D359D8BE129CA55C0006E5D2 /* JSHTMLDetailsElement.cpp in Sources */,
</span><span class="cx">                                 1A85B1E60A1B240500D8C87C /* JSHTMLDirectoryElement.cpp in Sources */,
</span><span class="cx">                                 1A85B2B60A1B2AC700D8C87C /* JSHTMLDivElement.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSAllInOnecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSAllInOne.cpp (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSAllInOne.cpp        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/css/CSSAllInOne.cpp        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -93,7 +93,9 @@
</span><span class="cx"> #include &quot;DOMWindowCSS.cpp&quot;
</span><span class="cx"> #include &quot;DocumentRuleSets.cpp&quot;
</span><span class="cx"> #include &quot;ElementRuleCollector.cpp&quot;
</span><ins>+#include &quot;FontFace.cpp&quot;
</ins><span class="cx"> #include &quot;FontLoader.cpp&quot;
</span><ins>+#include &quot;FontVariantBuilder.cpp&quot;
</ins><span class="cx"> #include &quot;InspectorCSSOMWrappers.cpp&quot;
</span><span class="cx"> #include &quot;LengthFunctions.cpp&quot;
</span><span class="cx"> #include &quot;MediaList.cpp&quot;
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontFacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontFace.cpp (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontFace.cpp        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/css/CSSFontFace.cpp        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -27,16 +27,194 @@
</span><span class="cx"> #include &quot;CSSFontFace.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CSSFontFaceSource.h&quot;
</span><ins>+#include &quot;CSSFontFamily.h&quot;
+#include &quot;CSSFontFeatureValue.h&quot;
</ins><span class="cx"> #include &quot;CSSFontSelector.h&quot;
</span><ins>+#include &quot;CSSPrimitiveValueMappings.h&quot;
</ins><span class="cx"> #include &quot;CSSSegmentedFontFace.h&quot;
</span><ins>+#include &quot;CSSUnicodeRangeValue.h&quot;
+#include &quot;CSSValue.h&quot;
+#include &quot;CSSValueList.h&quot;
</ins><span class="cx"> #include &quot;Document.h&quot;
</span><span class="cx"> #include &quot;Font.h&quot;
</span><span class="cx"> #include &quot;FontDescription.h&quot;
</span><span class="cx"> #include &quot;FontLoader.h&quot;
</span><ins>+#include &quot;FontVariantBuilder.h&quot;
</ins><span class="cx"> #include &quot;RuntimeEnabledFeatures.h&quot;
</span><ins>+#include &quot;StyleProperties.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+CSSFontFace::CSSFontFace(bool isLocalFallback)
+    : m_isLocalFallback(isLocalFallback)
+{
+}
+
+CSSFontFace::~CSSFontFace()
+{
+}
+
+bool CSSFontFace::setFamilies(CSSValue&amp; family)
+{
+    if (!is&lt;CSSValueList&gt;(family))
+        return false;
+
+    CSSValueList&amp; familyList = downcast&lt;CSSValueList&gt;(family);
+    if (!familyList.length())
+        return false;
+
+    m_families = &amp;familyList;
+    return true;
+}
+
+bool CSSFontFace::setStyle(CSSValue&amp; style)
+{
+    if (!is&lt;CSSPrimitiveValue&gt;(style))
+        return false;
+
+    unsigned styleMask = 0;
+    switch (downcast&lt;CSSPrimitiveValue&gt;(style).getValueID()) {
+    case CSSValueNormal:
+        styleMask = FontStyleNormalMask;
+        break;
+    case CSSValueItalic:
+    case CSSValueOblique:
+        styleMask = FontStyleItalicMask;
+        break;
+    default:
+        return false;
+    }
+
+    m_traitsMask = static_cast&lt;FontTraitsMask&gt;((static_cast&lt;unsigned&gt;(m_traitsMask) &amp; (~FontStyleMask)) | styleMask);
+    return true;
+}
+
+bool CSSFontFace::setWeight(CSSValue&amp; weight)
+{
+    if (!is&lt;CSSPrimitiveValue&gt;(weight))
+        return false;
+
+    unsigned weightMask = 0;
+    switch (downcast&lt;CSSPrimitiveValue&gt;(weight).getValueID()) {
+    case CSSValueBold:
+    case CSSValue700:
+        weightMask = FontWeight700Mask;
+        break;
+    case CSSValueNormal:
+    case CSSValue400:
+        weightMask = FontWeight400Mask;
+        break;
+    case CSSValue900:
+        weightMask = FontWeight900Mask;
+        break;
+    case CSSValue800:
+        weightMask = FontWeight800Mask;
+        break;
+    case CSSValue600:
+        weightMask = FontWeight600Mask;
+        break;
+    case CSSValue500:
+        weightMask = FontWeight500Mask;
+        break;
+    case CSSValue300:
+        weightMask = FontWeight300Mask;
+        break;
+    case CSSValue200:
+        weightMask = FontWeight200Mask;
+        break;
+    case CSSValue100:
+        weightMask = FontWeight100Mask;
+        break;
+    default:
+        break;
+    }
+
+    m_traitsMask = static_cast&lt;FontTraitsMask&gt;((static_cast&lt;unsigned&gt;(m_traitsMask) &amp; (~FontWeightMask)) | weightMask);
+    return true;
+}
+
+bool CSSFontFace::setUnicodeRange(CSSValue&amp; unicodeRange)
+{
+    if (!is&lt;CSSValueList&gt;(unicodeRange))
+        return false;
+
+    m_ranges.clear();
+    auto&amp; list = downcast&lt;CSSValueList&gt;(unicodeRange);
+    for (auto&amp; rangeValue : list) {
+        CSSUnicodeRangeValue&amp; range = downcast&lt;CSSUnicodeRangeValue&gt;(rangeValue.get());
+        m_ranges.append(UnicodeRange(range.from(), range.to()));
+    }
+    return true;
+}
+
+bool CSSFontFace::setVariantLigatures(CSSValue&amp; variantLigatures)
+{
+    auto ligatures = extractFontVariantLigatures(variantLigatures);
+    m_variantSettings.commonLigatures = ligatures.commonLigatures;
+    m_variantSettings.discretionaryLigatures = ligatures.discretionaryLigatures;
+    m_variantSettings.historicalLigatures = ligatures.historicalLigatures;
+    m_variantSettings.contextualAlternates = ligatures.contextualAlternates;
+    return true;
+}
+
+bool CSSFontFace::setVariantPosition(CSSValue&amp; variantPosition)
+{
+    if (!is&lt;CSSPrimitiveValue&gt;(variantPosition))
+        return false;
+    m_variantSettings.position = downcast&lt;CSSPrimitiveValue&gt;(variantPosition);
+    return true;
+}
+
+bool CSSFontFace::setVariantCaps(CSSValue&amp; variantCaps)
+{
+    if (!is&lt;CSSPrimitiveValue&gt;(variantCaps))
+        return false;
+    m_variantSettings.caps = downcast&lt;CSSPrimitiveValue&gt;(variantCaps);
+    return true;
+}
+
+bool CSSFontFace::setVariantNumeric(CSSValue&amp; variantNumeric)
+{
+    auto numeric = extractFontVariantNumeric(variantNumeric);
+    m_variantSettings.numericFigure = numeric.figure;
+    m_variantSettings.numericSpacing = numeric.spacing;
+    m_variantSettings.numericFraction = numeric.fraction;
+    m_variantSettings.numericOrdinal = numeric.ordinal;
+    m_variantSettings.numericSlashedZero = numeric.slashedZero;
+    return true;
+}
+
+bool CSSFontFace::setVariantAlternates(CSSValue&amp; variantAlternates)
+{
+    if (!is&lt;CSSPrimitiveValue&gt;(variantAlternates))
+        return false;
+    m_variantSettings.alternates = downcast&lt;CSSPrimitiveValue&gt;(variantAlternates);
+    return true;
+}
+
+bool CSSFontFace::setVariantEastAsian(CSSValue&amp; variantEastAsian)
+{
+    auto eastAsian = extractFontVariantEastAsian(variantEastAsian);
+    m_variantSettings.eastAsianVariant = eastAsian.variant;
+    m_variantSettings.eastAsianWidth = eastAsian.width;
+    m_variantSettings.eastAsianRuby = eastAsian.ruby;
+    return true;
+}
+
+bool CSSFontFace::setFeatureSettings(CSSValue&amp; featureSettings)
+{
+    if (!is&lt;CSSValueList&gt;(featureSettings))
+        return false;
+
+    m_featureSettings = FontFeatureSettings();
+    auto&amp; list = downcast&lt;CSSValueList&gt;(featureSettings);
+    for (auto&amp; rangeValue : list) {
+        CSSFontFeatureValue&amp; feature = downcast&lt;CSSFontFeatureValue&gt;(rangeValue.get());
+        m_featureSettings.insert(FontFeature(feature.tag(), feature.value()));
+    }
+    return true;
+}
+
</ins><span class="cx"> bool CSSFontFace::allSourcesFailed() const
</span><span class="cx"> {
</span><span class="cx">     for (auto&amp; source : m_sources) {
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontFaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontFace.h (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontFace.h        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/css/CSSFontFace.h        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -40,45 +40,43 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class CSSSegmentedFontFace;
</span><ins>+class CSSValue;
+class CSSValueList;
</ins><span class="cx"> class FontDescription;
</span><span class="cx"> class Font;
</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, bool isLocalFallback = false) { return adoptRef(*new CSSFontFace(traitsMask, isLocalFallback)); }
</del><ins>+    static Ref&lt;CSSFontFace&gt; create(bool isLocalFallback = false) { return adoptRef(*new CSSFontFace(isLocalFallback)); }
+    virtual ~CSSFontFace();
</ins><span class="cx"> 
</span><del>-    FontTraitsMask traitsMask() const { return m_traitsMask; }
</del><ins>+    bool setFamilies(CSSValue&amp;);
+    bool setStyle(CSSValue&amp;);
+    bool setWeight(CSSValue&amp;);
+    bool setUnicodeRange(CSSValue&amp;);
+    bool setVariantLigatures(CSSValue&amp;);
+    bool setVariantPosition(CSSValue&amp;);
+    bool setVariantCaps(CSSValue&amp;);
+    bool setVariantNumeric(CSSValue&amp;);
+    bool setVariantAlternates(CSSValue&amp;);
+    bool setVariantEastAsian(CSSValue&amp;);
+    bool setFeatureSettings(CSSValue&amp;);
</ins><span class="cx"> 
</span><span class="cx">     struct UnicodeRange;
</span><del>-
-    void addRange(UChar32 from, UChar32 to) { m_ranges.append(UnicodeRange(from, to)); }
</del><ins>+    const CSSValueList* families() const { return m_families.get(); }
+    FontTraitsMask traitsMask() const { return m_traitsMask; }
</ins><span class="cx">     const Vector&lt;UnicodeRange&gt;&amp; ranges() const { return m_ranges; }
</span><ins>+    const FontFeatureSettings&amp; featureSettings() const { return m_featureSettings; }
+    const FontVariantSettings&amp; variantSettings() const { return m_variantSettings; }
+    void setVariantSettings(const FontVariantSettings&amp; variantSettings) { m_variantSettings = variantSettings; }
+    void setTraitsMask(FontTraitsMask traitsMask) { m_traitsMask = traitsMask; }
+    bool isLocalFallback() const { return m_isLocalFallback; }
</ins><span class="cx"> 
</span><del>-    void insertFeature(FontFeature&amp;&amp; feature) { m_featureSettings.insert(WTFMove(feature)); }
-
-    void setVariantCommonLigatures(FontVariantLigatures ligatures) { m_variantSettings.commonLigatures = ligatures; }
-    void setVariantDiscretionaryLigatures(FontVariantLigatures ligatures) { m_variantSettings.discretionaryLigatures = ligatures; }
-    void setVariantHistoricalLigatures(FontVariantLigatures ligatures) { m_variantSettings.historicalLigatures = ligatures; }
-    void setVariantContextualAlternates(FontVariantLigatures ligatures) { m_variantSettings.contextualAlternates = ligatures; }
-    void setVariantPosition(FontVariantPosition position) { m_variantSettings.position = position; }
-    void setVariantCaps(FontVariantCaps caps) { m_variantSettings.caps = caps; }
-    void setVariantNumericFigure(FontVariantNumericFigure figure) { m_variantSettings.numericFigure = figure; }
-    void setVariantNumericSpacing(FontVariantNumericSpacing spacing) { m_variantSettings.numericSpacing = spacing; }
-    void setVariantNumericFraction(FontVariantNumericFraction fraction) { m_variantSettings.numericFraction = fraction; }
-    void setVariantNumericOrdinal(FontVariantNumericOrdinal ordinal) { m_variantSettings.numericOrdinal = ordinal; }
-    void setVariantNumericSlashedZero(FontVariantNumericSlashedZero slashedZero) { m_variantSettings.numericSlashedZero = slashedZero; }
-    void setVariantAlternates(FontVariantAlternates alternates) { m_variantSettings.alternates = alternates; }
-    void setVariantEastAsianVariant(FontVariantEastAsianVariant variant) { m_variantSettings.eastAsianVariant = variant; }
-    void setVariantEastAsianWidth(FontVariantEastAsianWidth width) { m_variantSettings.eastAsianWidth = width; }
-    void setVariantEastAsianRuby(FontVariantEastAsianRuby ruby) { m_variantSettings.eastAsianRuby = ruby; }
-
</del><span class="cx">     void addedToSegmentedFontFace(CSSSegmentedFontFace&amp;);
</span><span class="cx">     void removedFromSegmentedFontFace(CSSSegmentedFontFace&amp;);
</span><span class="cx"> 
</span><span class="cx">     bool allSourcesFailed() const;
</span><span class="cx"> 
</span><del>-    bool isLocalFallback() const { return m_isLocalFallback; }
-
</del><span class="cx">     void adoptSource(std::unique_ptr&lt;CSSFontFaceSource&gt;&amp;&amp;);
</span><span class="cx"> 
</span><span class="cx">     void fontLoaded(CSSFontFaceSource&amp;);
</span><span class="lines">@@ -105,12 +103,9 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    CSSFontFace(FontTraitsMask traitsMask, bool isLocalFallback)
-        : m_traitsMask(traitsMask)
-        , m_isLocalFallback(isLocalFallback)
-    {
-    }
</del><ins>+    CSSFontFace(bool isLocalFallback);
</ins><span class="cx"> 
</span><ins>+    RefPtr&lt;CSSValueList&gt; m_families;
</ins><span class="cx">     FontTraitsMask m_traitsMask;
</span><span class="cx">     Vector&lt;UnicodeRange&gt; m_ranges;
</span><span class="cx">     HashSet&lt;CSSSegmentedFontFace*&gt; m_segmentedFontFaces;
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontSelectorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontSelector.cpp (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontSelector.cpp        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/css/CSSFontSelector.cpp        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> #include &quot;CSSUnicodeRangeValue.h&quot;
</span><span class="cx"> #include &quot;CSSValueKeywords.h&quot;
</span><span class="cx"> #include &quot;CSSValueList.h&quot;
</span><ins>+#include &quot;CSSValuePool.h&quot;
</ins><span class="cx"> #include &quot;CachedResourceLoader.h&quot;
</span><span class="cx"> #include &quot;Document.h&quot;
</span><span class="cx"> #include &quot;Font.h&quot;
</span><span class="lines">@@ -87,75 +88,8 @@
</span><span class="cx">     return m_fonts.isEmpty();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static Optional&lt;FontTraitsMask&gt; computeTraitsMask(const StyleProperties&amp; style)
</del><ins>+static void appendSources(CSSFontFace&amp; fontFace, CSSValueList&amp; srcList, Document* document, bool isInitiatingElementInUserAgentShadowTree)
</ins><span class="cx"> {
</span><del>-    unsigned traitsMask = 0;
-
-    if (RefPtr&lt;CSSValue&gt; fontStyle = style.getPropertyCSSValue(CSSPropertyFontStyle)) {
-        if (!is&lt;CSSPrimitiveValue&gt;(*fontStyle))
-            return Nullopt;
-
-        switch (downcast&lt;CSSPrimitiveValue&gt;(*fontStyle).getValueID()) {
-        case CSSValueNormal:
-            traitsMask |= FontStyleNormalMask;
-            break;
-        case CSSValueItalic:
-        case CSSValueOblique:
-            traitsMask |= FontStyleItalicMask;
-            break;
-        default:
-            break;
-        }
-    } else
-        traitsMask |= FontStyleNormalMask;
-
-    if (RefPtr&lt;CSSValue&gt; fontWeight = style.getPropertyCSSValue(CSSPropertyFontWeight)) {
-        if (!is&lt;CSSPrimitiveValue&gt;(*fontWeight))
-            return Nullopt;
-
-        switch (downcast&lt;CSSPrimitiveValue&gt;(*fontWeight).getValueID()) {
-        case CSSValueBold:
-        case CSSValue700:
-            traitsMask |= FontWeight700Mask;
-            break;
-        case CSSValueNormal:
-        case CSSValue400:
-            traitsMask |= FontWeight400Mask;
-            break;
-        case CSSValue900:
-            traitsMask |= FontWeight900Mask;
-            break;
-        case CSSValue800:
-            traitsMask |= FontWeight800Mask;
-            break;
-        case CSSValue600:
-            traitsMask |= FontWeight600Mask;
-            break;
-        case CSSValue500:
-            traitsMask |= FontWeight500Mask;
-            break;
-        case CSSValue300:
-            traitsMask |= FontWeight300Mask;
-            break;
-        case CSSValue200:
-            traitsMask |= FontWeight200Mask;
-            break;
-        case CSSValue100:
-            traitsMask |= FontWeight100Mask;
-            break;
-        default:
-            break;
-        }
-    } else
-        traitsMask |= FontWeight400Mask;
-
-    return static_cast&lt;FontTraitsMask&gt;(traitsMask);
-}
-
-static Ref&lt;CSSFontFace&gt; createFontFace(CSSValueList&amp; srcList, FontTraitsMask traitsMask, Document* document, bool isInitiatingElementInUserAgentShadowTree)
-{
-    Ref&lt;CSSFontFace&gt; fontFace = CSSFontFace::create(traitsMask);
-
</del><span class="cx">     for (auto&amp; src : srcList) {
</span><span class="cx">         // An item in the list either specifies a string (local font name) or a URL (remote font to download).
</span><span class="cx">         CSSFontFaceSrcValue&amp; item = downcast&lt;CSSFontFaceSrcValue&gt;(src.get());
</span><span class="lines">@@ -172,16 +106,14 @@
</span><span class="cx">             bool allowDownloading = foundSVGFont || (settings &amp;&amp; settings-&gt;downloadableBinaryFontsEnabled());
</span><span class="cx">             if (allowDownloading &amp;&amp; item.isSupportedFormat() &amp;&amp; document) {
</span><span class="cx">                 if (CachedFont* cachedFont = item.cachedFont(document, foundSVGFont, isInitiatingElementInUserAgentShadowTree))
</span><del>-                    source = std::make_unique&lt;CSSFontFaceSource&gt;(fontFace.get(), item.resource(), cachedFont);
</del><ins>+                    source = std::make_unique&lt;CSSFontFaceSource&gt;(fontFace, item.resource(), cachedFont);
</ins><span class="cx">             }
</span><span class="cx">         } else
</span><del>-            source = std::make_unique&lt;CSSFontFaceSource&gt;(fontFace.get(), item.resource(), nullptr, fontFaceElement);
</del><ins>+            source = std::make_unique&lt;CSSFontFaceSource&gt;(fontFace, item.resource(), nullptr, fontFaceElement);
</ins><span class="cx"> 
</span><span class="cx">         if (source)
</span><del>-            fontFace-&gt;adoptSource(WTFMove(source));
</del><ins>+            fontFace.adoptSource(WTFMove(source));
</ins><span class="cx">     }
</span><del>-
-    return fontFace;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static String familyNameFromPrimitive(const CSSPrimitiveValue&amp; value)
</span><span class="lines">@@ -221,7 +153,8 @@
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;Ref&lt;CSSFontFace&gt;&gt; faces = { };
</span><span class="cx">     for (auto mask : traitsMasks) {
</span><del>-        Ref&lt;CSSFontFace&gt; face = CSSFontFace::create(mask, true);
</del><ins>+        Ref&lt;CSSFontFace&gt; face = CSSFontFace::create(true);
+        face-&gt;setTraitsMask(mask);
</ins><span class="cx">         face-&gt;adoptSource(std::make_unique&lt;CSSFontFaceSource&gt;(face.get(), familyName));
</span><span class="cx">         ASSERT(!face-&gt;allSourcesFailed());
</span><span class="cx">         faces.append(WTFMove(face));
</span><span class="lines">@@ -233,6 +166,8 @@
</span><span class="cx"> {
</span><span class="cx">     const StyleProperties&amp; style = fontFaceRule.properties();
</span><span class="cx">     RefPtr&lt;CSSValue&gt; fontFamily = style.getPropertyCSSValue(CSSPropertyFontFamily);
</span><ins>+    RefPtr&lt;CSSValue&gt; fontStyle = style.getPropertyCSSValue(CSSPropertyFontStyle);
+    RefPtr&lt;CSSValue&gt; fontWeight = style.getPropertyCSSValue(CSSPropertyFontWeight);
</ins><span class="cx">     RefPtr&lt;CSSValue&gt; src = style.getPropertyCSSValue(CSSPropertySrc);
</span><span class="cx">     RefPtr&lt;CSSValue&gt; unicodeRange = style.getPropertyCSSValue(CSSPropertyUnicodeRange);
</span><span class="cx">     RefPtr&lt;CSSValue&gt; featureSettings = style.getPropertyCSSValue(CSSPropertyFontFeatureSettings);
</span><span class="lines">@@ -249,54 +184,47 @@
</span><span class="cx">     if (!familyList.length())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    if (!fontStyle)
+        fontStyle = CSSValuePool::singleton().createIdentifierValue(CSSValueNormal).ptr();
+
+    if (!fontWeight)
+        fontWeight = CSSValuePool::singleton().createIdentifierValue(CSSValueNormal);
+
+    CSSValueList* rangeList = downcast&lt;CSSValueList&gt;(unicodeRange.get());
+
</ins><span class="cx">     CSSValueList&amp; srcList = downcast&lt;CSSValueList&gt;(*src);
</span><span class="cx">     if (!srcList.length())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    CSSValueList* rangeList = downcast&lt;CSSValueList&gt;(unicodeRange.get());
</del><ins>+    Ref&lt;CSSFontFace&gt; fontFace = CSSFontFace::create();
</ins><span class="cx"> 
</span><del>-    auto computedTraitsMask = computeTraitsMask(style);
-    if (!computedTraitsMask)
</del><ins>+    if (!fontFace-&gt;setFamilies(*fontFamily))
</ins><span class="cx">         return;
</span><del>-    auto traitsMask = computedTraitsMask.value();
</del><ins>+    if (!fontFace-&gt;setStyle(*fontStyle))
+        return;
+    if (!fontFace-&gt;setWeight(*fontWeight))
+        return;
+    if (rangeList &amp;&amp; !fontFace-&gt;setUnicodeRange(*rangeList))
+        return;
+    if (variantLigatures &amp;&amp; !fontFace-&gt;setVariantLigatures(*variantLigatures))
+        return;
+    if (variantPosition &amp;&amp; !fontFace-&gt;setVariantPosition(*variantPosition))
+        return;
+    if (variantCaps &amp;&amp; !fontFace-&gt;setVariantCaps(*variantCaps))
+        return;
+    if (variantNumeric &amp;&amp; !fontFace-&gt;setVariantNumeric(*variantNumeric))
+        return;
+    if (variantAlternates &amp;&amp; !fontFace-&gt;setVariantAlternates(*variantAlternates))
+        return;
+    if (variantEastAsian &amp;&amp; !fontFace-&gt;setVariantEastAsian(*variantEastAsian))
+        return;
+    if (featureSettings &amp;&amp; !fontFace-&gt;setFeatureSettings(*featureSettings))
+        return;
</ins><span class="cx"> 
</span><del>-    Ref&lt;CSSFontFace&gt; fontFace = createFontFace(srcList, traitsMask, m_document, isInitiatingElementInUserAgentShadowTree);
</del><ins>+    appendSources(fontFace, srcList, m_document, isInitiatingElementInUserAgentShadowTree);
</ins><span class="cx">     if (fontFace-&gt;allSourcesFailed())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (rangeList) {
-        unsigned numRanges = rangeList-&gt;length();
-        for (unsigned i = 0; i &lt; numRanges; i++) {
-            CSSUnicodeRangeValue&amp; range = downcast&lt;CSSUnicodeRangeValue&gt;(*rangeList-&gt;itemWithoutBoundsCheck(i));
-            fontFace-&gt;addRange(range.from(), range.to());
-        }
-    }
-
-    if (featureSettings) {
-        for (auto&amp; item : downcast&lt;CSSValueList&gt;(*featureSettings)) {
-            auto&amp; feature = downcast&lt;CSSFontFeatureValue&gt;(item.get());
-            fontFace-&gt;insertFeature(FontFeature(feature.tag(), feature.value()));
-        }
-    }
-
-    if (variantLigatures)
-        applyValueFontVariantLigatures(fontFace.get(), *variantLigatures);
-
-    if (variantPosition &amp;&amp; is&lt;CSSPrimitiveValue&gt;(*variantPosition))
-        fontFace-&gt;setVariantPosition(downcast&lt;CSSPrimitiveValue&gt;(*variantPosition));
-
-    if (variantCaps &amp;&amp; is&lt;CSSPrimitiveValue&gt;(*variantCaps))
-        fontFace-&gt;setVariantCaps(downcast&lt;CSSPrimitiveValue&gt;(*variantCaps));
-
-    if (variantNumeric)
-        applyValueFontVariantNumeric(fontFace.get(), *variantNumeric);
-
-    if (variantAlternates &amp;&amp; is&lt;CSSPrimitiveValue&gt;(*variantAlternates))
-        fontFace-&gt;setVariantAlternates(downcast&lt;CSSPrimitiveValue&gt;(*variantAlternates));
-
-    if (variantEastAsian)
-        applyValueFontVariantEastAsian(fontFace.get(), *variantEastAsian);
-
</del><span class="cx">     for (auto&amp; item : familyList) {
</span><span class="cx">         String familyName = familyNameFromPrimitive(downcast&lt;CSSPrimitiveValue&gt;(item.get()));
</span><span class="cx">         if (familyName.isEmpty())
</span></span></pre></div>
<a id="trunkSourceWebCorecssFontFacecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/css/FontFace.cpp (0 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontFace.cpp                                (rev 0)
+++ trunk/Source/WebCore/css/FontFace.cpp        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -0,0 +1,204 @@
</span><ins>+/*
+ * Copyright (C) 2007, 2008, 2011, 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;FontFace.h&quot;
+
+#include &quot;CSSFontFace.h&quot;
+#include &quot;CSSFontFeatureValue.h&quot;
+#include &quot;CSSUnicodeRangeValue.h&quot;
+#include &quot;CSSValue.h&quot;
+#include &quot;FontVariantBuilder.h&quot;
+#include &quot;StyleProperties.h&quot;
+#include &lt;wtf/text/StringBuilder.h&gt;
+
+namespace WebCore {
+
+FontFace::FontFace()
+    : m_backing(CSSFontFace::create())
+{
+}
+
+FontFace::~FontFace()
+{
+}
+
+static inline RefPtr&lt;CSSValue&gt; parseString(const String&amp; string, CSSPropertyID propertyID)
+{
+    Ref&lt;MutableStyleProperties&gt; style = MutableStyleProperties::create();
+    auto result = CSSParser::parseValue(style.ptr(), propertyID, string, true, CSSStrictMode, nullptr);
+    if (result == CSSParser::ParseResult::Error)
+        return nullptr;
+    return style-&gt;getPropertyCSSValue(propertyID);
+}
+
+void FontFace::setFamily(const String&amp; family, ExceptionCode&amp; ec)
+{
+    bool success = false;
+    if (auto value = parseString(family, CSSPropertyFontFamily))
+        success = m_backing-&gt;setFamilies(*value);
+    if (!success)
+        ec = SYNTAX_ERR;
+}
+
+void FontFace::setStyle(const String&amp; style, ExceptionCode&amp; ec)
+{
+    bool success = false;
+    if (auto value = parseString(style, CSSPropertyFontStyle))
+        success = m_backing-&gt;setStyle(*value);
+    if (!success)
+        ec = SYNTAX_ERR;
+}
+
+void FontFace::setWeight(const String&amp; weight, ExceptionCode&amp; ec)
+{
+    bool success = false;
+    if (auto value = parseString(weight, CSSPropertyFontWeight))
+        success = m_backing-&gt;setWeight(*value);
+    if (!success)
+        ec = SYNTAX_ERR;
+}
+
+void FontFace::setStretch(const String&amp;, ExceptionCode&amp;)
+{
+    // We don't support font-stretch. Swallow the call.
+}
+
+void FontFace::setUnicodeRange(const String&amp; unicodeRange, ExceptionCode&amp; ec)
+{
+    bool success = false;
+    if (auto value = parseString(unicodeRange, CSSPropertyUnicodeRange))
+        success = m_backing-&gt;setUnicodeRange(*value);
+    if (!success)
+        ec = SYNTAX_ERR;
+}
+
+void FontFace::setVariant(const String&amp; variant, ExceptionCode&amp; ec)
+{
+    Ref&lt;MutableStyleProperties&gt; style = MutableStyleProperties::create();
+    auto result = CSSParser::parseValue(style.ptr(), CSSPropertyFontVariant, variant, true, CSSStrictMode, nullptr);
+    if (result != CSSParser::ParseResult::Error) {
+        FontVariantSettings backup = m_backing-&gt;variantSettings();
+        bool success = true;
+        if (auto value = style-&gt;getPropertyCSSValue(CSSPropertyFontVariantLigatures))
+            success &amp;= m_backing-&gt;setVariantLigatures(*value);
+        if (auto value = style-&gt;getPropertyCSSValue(CSSPropertyFontVariantPosition))
+            success &amp;= m_backing-&gt;setVariantPosition(*value);
+        if (auto value = style-&gt;getPropertyCSSValue(CSSPropertyFontVariantCaps))
+            success &amp;= m_backing-&gt;setVariantCaps(*value);
+        if (auto value = style-&gt;getPropertyCSSValue(CSSPropertyFontVariantNumeric))
+            success &amp;= m_backing-&gt;setVariantNumeric(*value);
+        if (auto value = style-&gt;getPropertyCSSValue(CSSPropertyFontVariantAlternates))
+            success &amp;= m_backing-&gt;setVariantAlternates(*value);
+        if (auto value = style-&gt;getPropertyCSSValue(CSSPropertyFontVariantEastAsian))
+            success &amp;= m_backing-&gt;setVariantEastAsian(*value);
+        if (success)
+            return;
+        m_backing-&gt;setVariantSettings(backup);
+    }
+    ec = SYNTAX_ERR;
+}
+
+void FontFace::setFeatureSettings(const String&amp; featureSettings, ExceptionCode&amp; ec)
+{
+    bool success = false;
+    if (auto value = parseString(featureSettings, CSSPropertyFontFeatureSettings))
+        success = m_backing-&gt;setFeatureSettings(*value);
+    if (!success)
+        ec = SYNTAX_ERR;
+}
+
+String FontFace::family() const
+{
+    return m_backing-&gt;families()-&gt;cssText();
+}
+
+String FontFace::style() const
+{
+    switch (m_backing-&gt;traitsMask() &amp; FontStyleMask) {
+    case FontStyleNormalMask:
+        return String(&quot;normal&quot;, String::ConstructFromLiteral);
+    case FontStyleItalicMask:
+        return String(&quot;italic&quot;, String::ConstructFromLiteral);
+    }
+    ASSERT_NOT_REACHED();
+    return String(&quot;normal&quot;, String::ConstructFromLiteral);
+}
+
+String FontFace::weight() const
+{
+    switch (m_backing-&gt;traitsMask() &amp; FontWeightMask) {
+    case FontWeight100Mask:
+        return String(&quot;100&quot;, String::ConstructFromLiteral);
+    case FontWeight200Mask:
+        return String(&quot;200&quot;, String::ConstructFromLiteral);
+    case FontWeight300Mask:
+        return String(&quot;300&quot;, String::ConstructFromLiteral);
+    case FontWeight400Mask:
+        return String(&quot;normal&quot;, String::ConstructFromLiteral);
+    case FontWeight500Mask:
+        return String(&quot;500&quot;, String::ConstructFromLiteral);
+    case FontWeight600Mask:
+        return String(&quot;600&quot;, String::ConstructFromLiteral);
+    case FontWeight700Mask:
+        return String(&quot;bold&quot;, String::ConstructFromLiteral);
+    case FontWeight800Mask:
+        return String(&quot;800&quot;, String::ConstructFromLiteral);
+    case FontWeight900Mask:
+        return String(&quot;900&quot;, String::ConstructFromLiteral);
+    }
+    ASSERT_NOT_REACHED();
+    return String(&quot;normal&quot;, String::ConstructFromLiteral);
+}
+
+String FontFace::stretch() const
+{
+    return &quot;normal&quot;;
+}
+
+String FontFace::unicodeRange() const
+{
+    RefPtr&lt;CSSValueList&gt; values = CSSValueList::createCommaSeparated();
+    for (auto&amp; range : m_backing-&gt;ranges())
+        values-&gt;append(CSSUnicodeRangeValue::create(range.from(), range.to()));
+    return values-&gt;cssText();
+}
+
+String FontFace::variant() const
+{
+    return computeFontVariant(m_backing-&gt;variantSettings())-&gt;cssText();
+}
+
+String FontFace::featureSettings() const
+{
+    if (!m_backing-&gt;featureSettings().size())
+        return &quot;normal&quot;;
+    RefPtr&lt;CSSValueList&gt; list = CSSValueList::createCommaSeparated();
+    for (auto&amp; feature : m_backing-&gt;featureSettings())
+        list-&gt;append(CSSFontFeatureValue::create(FontFeatureTag(feature.tag()), feature.value()));
+    return list-&gt;cssText();
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCorecssFontFaceh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/css/FontFace.h (0 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontFace.h                                (rev 0)
+++ trunk/Source/WebCore/css/FontFace.h        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+/*
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FontFace_h
+#define FontFace_h
+
+#include &quot;ExceptionCode.h&quot;
+#include &lt;wtf/RefCounted.h&gt;
+#include &lt;wtf/RefPtr.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+namespace WebCore {
+
+class CSSFontFace;
+
+class FontFace : public RefCounted&lt;FontFace&gt; {
+public:
+    static Ref&lt;FontFace&gt; create() { return adoptRef(*new FontFace()); }
+    virtual ~FontFace();
+
+    void setFamily(const String&amp;, ExceptionCode&amp;);
+    void setStyle(const String&amp;, ExceptionCode&amp;);
+    void setWeight(const String&amp;, ExceptionCode&amp;);
+    void setStretch(const String&amp;, ExceptionCode&amp;);
+    void setUnicodeRange(const String&amp;, ExceptionCode&amp;);
+    void setVariant(const String&amp;, ExceptionCode&amp;);
+    void setFeatureSettings(const String&amp;, ExceptionCode&amp;);
+
+    String family() const;
+    String style() const;
+    String weight() const;
+    String stretch() const;
+    String unicodeRange() const;
+    String variant() const;
+    String featureSettings() const;
+
+private:
+    FontFace();
+
+    Ref&lt;CSSFontFace&gt; m_backing;
+};
+
+}
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCorecssFontVariantBuildercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/css/FontVariantBuilder.cpp (0 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontVariantBuilder.cpp                                (rev 0)
+++ trunk/Source/WebCore/css/FontVariantBuilder.cpp        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -0,0 +1,375 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;FontVariantBuilder.h&quot;
+
+#include &quot;CSSPrimitiveValue.h&quot;
+#include &quot;CSSValueList.h&quot;
+#include &quot;CSSValuePool.h&quot;
+#include &quot;TextFlags.h&quot;
+
+namespace WebCore {
+
+FontVariantLigaturesValues extractFontVariantLigatures(CSSValue&amp; value)
+{
+    FontVariantLigatures common = FontVariantLigatures::Normal;
+    FontVariantLigatures discretionary = FontVariantLigatures::Normal;
+    FontVariantLigatures historical = FontVariantLigatures::Normal;
+    FontVariantLigatures contextualAlternates = FontVariantLigatures::Normal;
+
+    if (is&lt;CSSValueList&gt;(value)) {
+        for (auto&amp; item : downcast&lt;CSSValueList&gt;(value)) {
+            switch (downcast&lt;CSSPrimitiveValue&gt;(item.get()).getValueID()) {
+            case CSSValueNoCommonLigatures:
+                common = FontVariantLigatures::No;
+                break;
+            case CSSValueCommonLigatures:
+                common = FontVariantLigatures::Yes;
+                break;
+            case CSSValueNoDiscretionaryLigatures:
+                discretionary = FontVariantLigatures::No;
+                break;
+            case CSSValueDiscretionaryLigatures:
+                discretionary = FontVariantLigatures::Yes;
+                break;
+            case CSSValueNoHistoricalLigatures:
+                historical = FontVariantLigatures::No;
+                break;
+            case CSSValueHistoricalLigatures:
+                historical = FontVariantLigatures::Yes;
+                break;
+            case CSSValueContextual:
+                contextualAlternates = FontVariantLigatures::Yes;
+                break;
+            case CSSValueNoContextual:
+                contextualAlternates = FontVariantLigatures::No;
+                break;
+            default:
+                ASSERT_NOT_REACHED();
+                break;
+            }
+        }
+    } else if (is&lt;CSSPrimitiveValue&gt;(value)) {
+        switch (downcast&lt;CSSPrimitiveValue&gt;(value).getValueID()) {
+        case CSSValueNormal:
+            break;
+        case CSSValueNone:
+            common = FontVariantLigatures::No;
+            discretionary = FontVariantLigatures::No;
+            historical = FontVariantLigatures::No;
+            contextualAlternates = FontVariantLigatures::No;
+            break;
+        default:
+            ASSERT_NOT_REACHED();
+            break;
+        }
+    }
+
+    return FontVariantLigaturesValues(common, discretionary, historical, contextualAlternates);
+}
+
+FontVariantNumericValues extractFontVariantNumeric(CSSValue&amp; value)
+{
+    FontVariantNumericFigure figure = FontVariantNumericFigure::Normal;
+    FontVariantNumericSpacing spacing = FontVariantNumericSpacing::Normal;
+    FontVariantNumericFraction fraction = FontVariantNumericFraction::Normal;
+    FontVariantNumericOrdinal ordinal = FontVariantNumericOrdinal::Normal;
+    FontVariantNumericSlashedZero slashedZero = FontVariantNumericSlashedZero::Normal;
+
+    if (is&lt;CSSValueList&gt;(value)) {
+        for (auto&amp; item : downcast&lt;CSSValueList&gt;(value)) {
+            switch (downcast&lt;CSSPrimitiveValue&gt;(item.get()).getValueID()) {
+            case CSSValueLiningNums:
+                figure = FontVariantNumericFigure::LiningNumbers;
+                break;
+            case CSSValueOldstyleNums:
+                figure = FontVariantNumericFigure::OldStyleNumbers;
+                break;
+            case CSSValueProportionalNums:
+                spacing = FontVariantNumericSpacing::ProportionalNumbers;
+                break;
+            case CSSValueTabularNums:
+                spacing = FontVariantNumericSpacing::TabularNumbers;
+                break;
+            case CSSValueDiagonalFractions:
+                fraction = FontVariantNumericFraction::DiagonalFractions;
+                break;
+            case CSSValueStackedFractions:
+                fraction = FontVariantNumericFraction::StackedFractions;
+                break;
+            case CSSValueOrdinal:
+                ordinal = FontVariantNumericOrdinal::Yes;
+                break;
+            case CSSValueSlashedZero:
+                slashedZero = FontVariantNumericSlashedZero::Yes;
+                break;
+            default:
+                ASSERT_NOT_REACHED();
+                break;
+            }
+        }
+    } else if (is&lt;CSSPrimitiveValue&gt;(value))
+        ASSERT(downcast&lt;CSSPrimitiveValue&gt;(value).getValueID() == CSSValueNormal);
+
+    return FontVariantNumericValues(figure, spacing, fraction, ordinal, slashedZero);
+}
+
+FontVariantEastAsianValues extractFontVariantEastAsian(CSSValue&amp; value)
+{
+    FontVariantEastAsianVariant variant = FontVariantEastAsianVariant::Normal;
+    FontVariantEastAsianWidth width = FontVariantEastAsianWidth::Normal;
+    FontVariantEastAsianRuby ruby = FontVariantEastAsianRuby::Normal;
+
+    if (is&lt;CSSValueList&gt;(value)) {
+        for (auto&amp; item : downcast&lt;CSSValueList&gt;(value)) {
+            switch (downcast&lt;CSSPrimitiveValue&gt;(item.get()).getValueID()) {
+            case CSSValueJis78:
+                variant = FontVariantEastAsianVariant::Jis78;
+                break;
+            case CSSValueJis83:
+                variant = FontVariantEastAsianVariant::Jis83;
+                break;
+            case CSSValueJis90:
+                variant = FontVariantEastAsianVariant::Jis90;
+                break;
+            case CSSValueJis04:
+                variant = FontVariantEastAsianVariant::Jis04;
+                break;
+            case CSSValueSimplified:
+                variant = FontVariantEastAsianVariant::Simplified;
+                break;
+            case CSSValueTraditional:
+                variant = FontVariantEastAsianVariant::Traditional;
+                break;
+            case CSSValueFullWidth:
+                width = FontVariantEastAsianWidth::Full;
+                break;
+            case CSSValueProportionalWidth:
+                width = FontVariantEastAsianWidth::Proportional;
+                break;
+            case CSSValueRuby:
+                ruby = FontVariantEastAsianRuby::Yes;
+                break;
+            default:
+                ASSERT_NOT_REACHED();
+                break;
+            }
+        }
+    } else if (is&lt;CSSPrimitiveValue&gt;(value))
+        ASSERT(downcast&lt;CSSPrimitiveValue&gt;(value).getValueID() == CSSValueNormal);
+
+    return FontVariantEastAsianValues(variant, width, ruby);
+}
+
+Ref&lt;CSSValue&gt; computeFontVariant(const FontVariantSettings&amp; variantSettings)
+{
+    if (variantSettings.isAllNormal())
+        return CSSValuePool::singleton().createIdentifierValue(CSSValueNormal);
+
+    auto list = CSSValueList::createSpaceSeparated();
+
+    switch (variantSettings.commonLigatures) {
+    case FontVariantLigatures::Normal:
+        break;
+    case FontVariantLigatures::Yes:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueCommonLigatures));
+        break;
+    case FontVariantLigatures::No:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueNoCommonLigatures));
+        break;
+    }
+
+    switch (variantSettings.discretionaryLigatures) {
+    case FontVariantLigatures::Normal:
+        break;
+    case FontVariantLigatures::Yes:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueDiscretionaryLigatures));
+        break;
+    case FontVariantLigatures::No:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueNoDiscretionaryLigatures));
+        break;
+    }
+
+    switch (variantSettings.historicalLigatures) {
+    case FontVariantLigatures::Normal:
+        break;
+    case FontVariantLigatures::Yes:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueHistoricalLigatures));
+        break;
+    case FontVariantLigatures::No:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueNoHistoricalLigatures));
+        break;
+    }
+
+    switch (variantSettings.contextualAlternates) {
+    case FontVariantLigatures::Normal:
+        break;
+    case FontVariantLigatures::Yes:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueContextual));
+        break;
+    case FontVariantLigatures::No:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueNoContextual));
+        break;
+    }
+
+    switch (variantSettings.position) {
+    case FontVariantPosition::Normal:
+        break;
+    case FontVariantPosition::Subscript:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueSub));
+        break;
+    case FontVariantPosition::Superscript:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueSuper));
+        break;
+    }
+
+    switch (variantSettings.caps) {
+    case FontVariantCaps::Normal:
+        break;
+    case FontVariantCaps::Small:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueSmallCaps));
+        break;
+    case FontVariantCaps::AllSmall:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueAllSmallCaps));
+        break;
+    case FontVariantCaps::Petite:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValuePetiteCaps));
+        break;
+    case FontVariantCaps::AllPetite:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueAllPetiteCaps));
+        break;
+    case FontVariantCaps::Unicase:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueUnicase));
+        break;
+    case FontVariantCaps::Titling:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueTitlingCaps));
+        break;
+    }
+
+    switch (variantSettings.numericFigure) {
+    case FontVariantNumericFigure::Normal:
+        break;
+    case FontVariantNumericFigure::LiningNumbers:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueLiningNums));
+        break;
+    case FontVariantNumericFigure::OldStyleNumbers:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueOldstyleNums));
+        break;
+    }
+
+    switch (variantSettings.numericSpacing) {
+    case FontVariantNumericSpacing::Normal:
+        break;
+    case FontVariantNumericSpacing::ProportionalNumbers:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueProportionalNums));
+        break;
+    case FontVariantNumericSpacing::TabularNumbers:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueTabularNums));
+        break;
+    }
+
+    switch (variantSettings.numericFraction) {
+    case FontVariantNumericFraction::Normal:
+        break;
+    case FontVariantNumericFraction::DiagonalFractions:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueDiagonalFractions));
+        break;
+    case FontVariantNumericFraction::StackedFractions:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueStackedFractions));
+        break;
+    }
+
+    switch (variantSettings.numericOrdinal) {
+    case FontVariantNumericOrdinal::Normal:
+        break;
+    case FontVariantNumericOrdinal::Yes:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueOrdinal));
+        break;
+    }
+
+    switch (variantSettings.numericSlashedZero) {
+    case FontVariantNumericSlashedZero::Normal:
+        break;
+    case FontVariantNumericSlashedZero::Yes:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueSlashedZero));
+        break;
+    }
+
+    switch (variantSettings.alternates) {
+    case FontVariantAlternates::Normal:
+        break;
+    case FontVariantAlternates::HistoricalForms:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueHistoricalForms));
+        break;
+    }
+
+    switch (variantSettings.eastAsianVariant) {
+    case FontVariantEastAsianVariant::Normal:
+        break;
+    case FontVariantEastAsianVariant::Jis78:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueJis78));
+        break;
+    case FontVariantEastAsianVariant::Jis83:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueJis83));
+        break;
+    case FontVariantEastAsianVariant::Jis90:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueJis90));
+        break;
+    case FontVariantEastAsianVariant::Jis04:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueJis04));
+        break;
+    case FontVariantEastAsianVariant::Simplified:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueSimplified));
+        break;
+    case FontVariantEastAsianVariant::Traditional:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueTraditional));
+        break;
+    }
+
+    switch (variantSettings.eastAsianWidth) {
+    case FontVariantEastAsianWidth::Normal:
+        break;
+    case FontVariantEastAsianWidth::Full:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueFullWidth));
+        break;
+    case FontVariantEastAsianWidth::Proportional:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueProportionalWidth));
+        break;
+    }
+
+    switch (variantSettings.eastAsianRuby) {
+    case FontVariantEastAsianRuby::Normal:
+        break;
+    case FontVariantEastAsianRuby::Yes:
+        list.get().append(CSSValuePool::singleton().createIdentifierValue(CSSValueRuby));
+        break;
+    }
+
+    return WTFMove(list);
+}
+
+}
+
</ins></span></pre></div>
<a id="trunkSourceWebCorecssFontVariantBuilderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/FontVariantBuilder.h (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontVariantBuilder.h        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/css/FontVariantBuilder.h        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -26,171 +26,22 @@
</span><span class="cx"> #ifndef FontVariantBuilder_h
</span><span class="cx"> #define FontVariantBuilder_h
</span><span class="cx"> 
</span><ins>+#include &lt;wtf/Ref.h&gt;
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-template &lt;typename T&gt;
-inline void applyValueFontVariantLigatures(T&amp; receiver, CSSValue&amp; value)
-{
-    FontVariantLigatures common = FontVariantLigatures::Normal;
-    FontVariantLigatures discretionary = FontVariantLigatures::Normal;
-    FontVariantLigatures historical = FontVariantLigatures::Normal;
-    FontVariantLigatures contextualAlternates = FontVariantLigatures::Normal;
</del><ins>+class CSSValue;
+struct FontVariantSettings;
+struct FontVariantLigaturesValues;
+struct FontVariantNumericValues;
+struct FontVariantEastAsianValues;
</ins><span class="cx"> 
</span><del>-    if (is&lt;CSSValueList&gt;(value)) {
-        for (auto&amp; item : downcast&lt;CSSValueList&gt;(value)) {
-            switch (downcast&lt;CSSPrimitiveValue&gt;(item.get()).getValueID()) {
-            case CSSValueNoCommonLigatures:
-                common = FontVariantLigatures::No;
-                break;
-            case CSSValueCommonLigatures:
-                common = FontVariantLigatures::Yes;
-                break;
-            case CSSValueNoDiscretionaryLigatures:
-                discretionary = FontVariantLigatures::No;
-                break;
-            case CSSValueDiscretionaryLigatures:
-                discretionary = FontVariantLigatures::Yes;
-                break;
-            case CSSValueNoHistoricalLigatures:
-                historical = FontVariantLigatures::No;
-                break;
-            case CSSValueHistoricalLigatures:
-                historical = FontVariantLigatures::Yes;
-                break;
-            case CSSValueContextual:
-                contextualAlternates = FontVariantLigatures::Yes;
-                break;
-            case CSSValueNoContextual:
-                contextualAlternates = FontVariantLigatures::No;
-                break;
-            default:
-                ASSERT_NOT_REACHED();
-                break;
-            }
-        }
-    } else if (is&lt;CSSPrimitiveValue&gt;(value)) {
-        switch (downcast&lt;CSSPrimitiveValue&gt;(value).getValueID()) {
-        case CSSValueNormal:
-            break;
-        case CSSValueNone:
-            common = FontVariantLigatures::No;
-            discretionary = FontVariantLigatures::No;
-            historical = FontVariantLigatures::No;
-            contextualAlternates = FontVariantLigatures::No;
-            break;
-        default:
-            ASSERT_NOT_REACHED();
-            break;
-        }
-    }
</del><ins>+FontVariantLigaturesValues extractFontVariantLigatures(CSSValue&amp;);
+FontVariantNumericValues extractFontVariantNumeric(CSSValue&amp;);
+FontVariantEastAsianValues extractFontVariantEastAsian(CSSValue&amp;);
</ins><span class="cx"> 
</span><del>-    receiver.setVariantCommonLigatures(common);
-    receiver.setVariantDiscretionaryLigatures(discretionary);
-    receiver.setVariantHistoricalLigatures(historical);
-    receiver.setVariantContextualAlternates(contextualAlternates);
-}
</del><ins>+Ref&lt;CSSValue&gt; computeFontVariant(const FontVariantSettings&amp;);
</ins><span class="cx"> 
</span><del>-template &lt;typename T&gt;
-inline void applyValueFontVariantNumeric(T&amp; receiver, CSSValue&amp; value)
-{
-    FontVariantNumericFigure figure = FontVariantNumericFigure::Normal;
-    FontVariantNumericSpacing spacing = FontVariantNumericSpacing::Normal;
-    FontVariantNumericFraction fraction = FontVariantNumericFraction::Normal;
-    FontVariantNumericOrdinal ordinal = FontVariantNumericOrdinal::Normal;
-    FontVariantNumericSlashedZero slashedZero = FontVariantNumericSlashedZero::Normal;
-
-    if (is&lt;CSSValueList&gt;(value)) {
-        for (auto&amp; item : downcast&lt;CSSValueList&gt;(value)) {
-            switch (downcast&lt;CSSPrimitiveValue&gt;(item.get()).getValueID()) {
-            case CSSValueLiningNums:
-                figure = FontVariantNumericFigure::LiningNumbers;
-                break;
-            case CSSValueOldstyleNums:
-                figure = FontVariantNumericFigure::OldStyleNumbers;
-                break;
-            case CSSValueProportionalNums:
-                spacing = FontVariantNumericSpacing::ProportionalNumbers;
-                break;
-            case CSSValueTabularNums:
-                spacing = FontVariantNumericSpacing::TabularNumbers;
-                break;
-            case CSSValueDiagonalFractions:
-                fraction = FontVariantNumericFraction::DiagonalFractions;
-                break;
-            case CSSValueStackedFractions:
-                fraction = FontVariantNumericFraction::StackedFractions;
-                break;
-            case CSSValueOrdinal:
-                ordinal = FontVariantNumericOrdinal::Yes;
-                break;
-            case CSSValueSlashedZero:
-                slashedZero = FontVariantNumericSlashedZero::Yes;
-                break;
-            default:
-                ASSERT_NOT_REACHED();
-                break;
-            }
-        }
-    } else if (is&lt;CSSPrimitiveValue&gt;(value))
-        ASSERT(downcast&lt;CSSPrimitiveValue&gt;(value).getValueID() == CSSValueNormal);
-
-    receiver.setVariantNumericFigure(figure);
-    receiver.setVariantNumericSpacing(spacing);
-    receiver.setVariantNumericFraction(fraction);
-    receiver.setVariantNumericOrdinal(ordinal);
-    receiver.setVariantNumericSlashedZero(slashedZero);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;typename T&gt;
-inline void applyValueFontVariantEastAsian(T&amp; receiver, CSSValue&amp; value)
-{
-    FontVariantEastAsianVariant variant = FontVariantEastAsianVariant::Normal;
-    FontVariantEastAsianWidth width = FontVariantEastAsianWidth::Normal;
-    FontVariantEastAsianRuby ruby = FontVariantEastAsianRuby::Normal;
-
-    if (is&lt;CSSValueList&gt;(value)) {
-        for (auto&amp; item : downcast&lt;CSSValueList&gt;(value)) {
-            switch (downcast&lt;CSSPrimitiveValue&gt;(item.get()).getValueID()) {
-            case CSSValueJis78:
-                variant = FontVariantEastAsianVariant::Jis78;
-                break;
-            case CSSValueJis83:
-                variant = FontVariantEastAsianVariant::Jis83;
-                break;
-            case CSSValueJis90:
-                variant = FontVariantEastAsianVariant::Jis90;
-                break;
-            case CSSValueJis04:
-                variant = FontVariantEastAsianVariant::Jis04;
-                break;
-            case CSSValueSimplified:
-                variant = FontVariantEastAsianVariant::Simplified;
-                break;
-            case CSSValueTraditional:
-                variant = FontVariantEastAsianVariant::Traditional;
-                break;
-            case CSSValueFullWidth:
-                width = FontVariantEastAsianWidth::Full;
-                break;
-            case CSSValueProportionalWidth:
-                width = FontVariantEastAsianWidth::Proportional;
-                break;
-            case CSSValueRuby:
-                ruby = FontVariantEastAsianRuby::Yes;
-                break;
-            default:
-                ASSERT_NOT_REACHED();
-                break;
-            }
-        }
-    } else if (is&lt;CSSPrimitiveValue&gt;(value))
-        ASSERT(downcast&lt;CSSPrimitiveValue&gt;(value).getValueID() == CSSValueNormal);
-
-    receiver.setVariantEastAsianVariant(variant);
-    receiver.setVariantEastAsianWidth(width);
-    receiver.setVariantEastAsianRuby(ruby);
-}
-
-}
-
</del><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleBuilderCustomh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleBuilderCustom.h (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleBuilderCustom.h        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/css/StyleBuilderCustom.h        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -1407,7 +1407,11 @@
</span><span class="cx"> inline void StyleBuilderCustom::applyValueFontVariantLigatures(StyleResolver&amp; styleResolver, CSSValue&amp; value)
</span><span class="cx"> {
</span><span class="cx">     auto fontDescription = styleResolver.fontDescription();
</span><del>-    WebCore::applyValueFontVariantLigatures(fontDescription, value);
</del><ins>+    auto variantLigatures = extractFontVariantLigatures(value);
+    fontDescription.setVariantCommonLigatures(variantLigatures.commonLigatures);
+    fontDescription.setVariantDiscretionaryLigatures(variantLigatures.discretionaryLigatures);
+    fontDescription.setVariantHistoricalLigatures(variantLigatures.historicalLigatures);
+    fontDescription.setVariantContextualAlternates(variantLigatures.contextualAlternates);
</ins><span class="cx">     styleResolver.setFontDescription(fontDescription);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1436,7 +1440,12 @@
</span><span class="cx"> inline void StyleBuilderCustom::applyValueFontVariantNumeric(StyleResolver&amp; styleResolver, CSSValue&amp; value)
</span><span class="cx"> {
</span><span class="cx">     auto fontDescription = styleResolver.fontDescription();
</span><del>-    WebCore::applyValueFontVariantNumeric(fontDescription, value);
</del><ins>+    auto variantNumeric = extractFontVariantNumeric(value);
+    fontDescription.setVariantNumericFigure(variantNumeric.figure);
+    fontDescription.setVariantNumericSpacing(variantNumeric.spacing);
+    fontDescription.setVariantNumericFraction(variantNumeric.fraction);
+    fontDescription.setVariantNumericOrdinal(variantNumeric.ordinal);
+    fontDescription.setVariantNumericSlashedZero(variantNumeric.slashedZero);
</ins><span class="cx">     styleResolver.setFontDescription(fontDescription);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1461,7 +1470,10 @@
</span><span class="cx"> inline void StyleBuilderCustom::applyValueFontVariantEastAsian(StyleResolver&amp; styleResolver, CSSValue&amp; value)
</span><span class="cx"> {
</span><span class="cx">     auto fontDescription = styleResolver.fontDescription();
</span><del>-    WebCore::applyValueFontVariantEastAsian(fontDescription, value);
</del><ins>+    auto variantEastAsian = extractFontVariantEastAsian(value);
+    fontDescription.setVariantEastAsianVariant(variantEastAsian.variant);
+    fontDescription.setVariantEastAsianWidth(variantEastAsian.width);
+    fontDescription.setVariantEastAsianRuby(variantEastAsian.ruby);
</ins><span class="cx">     styleResolver.setFontDescription(fontDescription);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformtextTextFlagsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/text/TextFlags.h (196509 => 196510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/text/TextFlags.h        2016-02-12 22:17:30 UTC (rev 196509)
+++ trunk/Source/WebCore/platform/text/TextFlags.h        2016-02-12 22:22:20 UTC (rev 196510)
</span><span class="lines">@@ -248,6 +248,63 @@
</span><span class="cx">     FontVariantEastAsianRuby eastAsianRuby;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+struct FontVariantLigaturesValues {
+    FontVariantLigaturesValues(
+        FontVariantLigatures commonLigatures,
+        FontVariantLigatures discretionaryLigatures,
+        FontVariantLigatures historicalLigatures,
+        FontVariantLigatures contextualAlternates)
+            : commonLigatures(commonLigatures)
+            , discretionaryLigatures(discretionaryLigatures)
+            , historicalLigatures(historicalLigatures)
+            , contextualAlternates(contextualAlternates)
+    {
+    }
+
+    FontVariantLigatures commonLigatures;
+    FontVariantLigatures discretionaryLigatures;
+    FontVariantLigatures historicalLigatures;
+    FontVariantLigatures contextualAlternates;
+};
+
+struct FontVariantNumericValues {
+    FontVariantNumericValues(
+        FontVariantNumericFigure figure,
+        FontVariantNumericSpacing spacing,
+        FontVariantNumericFraction fraction,
+        FontVariantNumericOrdinal ordinal,
+        FontVariantNumericSlashedZero slashedZero)
+            : figure(figure)
+            , spacing(spacing)
+            , fraction(fraction)
+            , ordinal(ordinal)
+            , slashedZero(slashedZero)
+    {
+    }
+
+    FontVariantNumericFigure figure;
+    FontVariantNumericSpacing spacing;
+    FontVariantNumericFraction fraction;
+    FontVariantNumericOrdinal ordinal;
+    FontVariantNumericSlashedZero slashedZero;
+};
+
+struct FontVariantEastAsianValues {
+    FontVariantEastAsianValues(
+        FontVariantEastAsianVariant variant,
+        FontVariantEastAsianWidth width,
+        FontVariantEastAsianRuby ruby)
+            : variant(variant)
+            , width(width)
+            , ruby(ruby)
+    {
+    }
+
+    FontVariantEastAsianVariant variant;
+    FontVariantEastAsianWidth width;
+    FontVariantEastAsianRuby ruby;
+};
+
</ins><span class="cx"> enum FontWidthVariant {
</span><span class="cx">     RegularWidth,
</span><span class="cx">     HalfWidth,
</span></span></pre>
</div>
</div>

</body>
</html>