<!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 <mmaxfield@apple.com>
+
+ [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 <jer.noble@apple.com>
</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"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>
</span><span class="cx"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
</span><span class="cx"> </ClCompile>
</span><ins>+ <ClCompile Include="..\css\FontFace.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
+ </ClCompile>
</ins><span class="cx"> <ClCompile Include="..\css\CSSFontFace.cpp">
</span><span class="cx"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</span><span class="cx"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
</span><span class="lines">@@ -10242,6 +10256,20 @@
</span><span class="cx"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>
</span><span class="cx"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
</span><span class="cx"> </ClCompile>
</span><ins>+ <ClCompile Include="..\css\FontVariantBuilder.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|x64'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
+ </ClCompile>
</ins><span class="cx"> <ClCompile Include="..\css\FontLoader.cpp">
</span><span class="cx"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</span><span class="cx"> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
</span><span class="lines">@@ -21630,6 +21658,7 @@
</span><span class="cx"> <ClInclude Include="..\css\CSSCursorImageValue.h" />
</span><span class="cx"> <ClInclude Include="..\css\CSSFilterImageValue.h" />
</span><span class="cx"> <ClInclude Include="..\css\CSSFontFace.h" />
</span><ins>+ <ClInclude Include="..\css\FontFace.h" />
</ins><span class="cx"> <ClInclude Include="..\css\CSSFontFaceLoadEvent.h" />
</span><span class="cx"> <ClInclude Include="..\css\CSSFontFaceRule.h" />
</span><span class="cx"> <ClInclude Include="..\css\CSSFontFaceSource.h" />
</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"> <ClCompile Include="..\css\CSSCursorImageValue.cpp">
</span><span class="cx"> <Filter>css</Filter>
</span><span class="cx"> </ClCompile>
</span><ins>+ <ClCompile Include="..\css\FontFace.cpp">
+ <Filter>css</Filter>
+ </ClCompile>
</ins><span class="cx"> <ClCompile Include="..\css\CSSFontFace.cpp">
</span><span class="cx"> <Filter>css</Filter>
</span><span class="cx"> </ClCompile>
</span><span class="lines">@@ -2222,6 +2225,9 @@
</span><span class="cx"> <ClCompile Include="..\css\CSSVariableValue.cpp">
</span><span class="cx"> <Filter>css</Filter>
</span><span class="cx"> </ClCompile>
</span><ins>+ <ClCompile Include="..\css\FontVariantBuilder.cpp">
+ <Filter>css</Filter>
+ </ClCompile>
</ins><span class="cx"> <ClCompile Include="..\css\FontLoader.cpp">
</span><span class="cx"> <Filter>css</Filter>
</span><span class="cx"> </ClCompile>
</span><span class="lines">@@ -9052,6 +9058,9 @@
</span><span class="cx"> <ClInclude Include="..\css\CSSCursorImageValue.h">
</span><span class="cx"> <Filter>css</Filter>
</span><span class="cx"> </ClInclude>
</span><ins>+ <ClInclude Include="..\css\FontFace.h">
+ <Filter>css</Filter>
+ </ClInclude>
</ins><span class="cx"> <ClInclude Include="..\css\CSSFontFace.h">
</span><span class="cx"> <Filter>css</Filter>
</span><span class="cx"> </ClInclude>
</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 = "<group>"; };
</span><span class="cx">                 1C2417B91992C04100EF9938 /* SpellingDot@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "SpellingDot@3x.png"; sourceTree = "<group>"; };
</span><span class="cx">                 1C2649790D7E248A00BD10F2 /* DocumentLoaderMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DocumentLoaderMac.cpp; sourceTree = "<group>"; };
</span><ins>+                1C3249101C6D6A3B007EDB32 /* FontVariantBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontVariantBuilder.cpp; sourceTree = "<group>"; };
</ins><span class="cx">                 1C3969CF1B74211E002BCFA7 /* FontCacheCoreText.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontCacheCoreText.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 1C5E980F1A02CEFA002DB55F /* CoreTextSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoreTextSPI.h; sourceTree = "<group>"; };
</span><span class="cx">                 1C6466271A12C3F90094603C /* NSFontSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSFontSPI.h; sourceTree = "<group>"; };
</span><ins>+                1C66260E1C6E7CA600AB527C /* FontFace.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontFace.cpp; sourceTree = "<group>"; };
+                1C66260F1C6E7CA600AB527C /* FontFace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FontFace.h; sourceTree = "<group>"; };
</ins><span class="cx">                 1C81B9560E97330800266E07 /* InspectorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorController.h; sourceTree = "<group>"; };
</span><span class="cx">                 1C81B9570E97330800266E07 /* InspectorController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorController.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 1C81B9580E97330800266E07 /* InspectorClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorClient.h; sourceTree = "<group>"; };
</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 = "<group>";
</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 "DOMWindowCSS.cpp"
</span><span class="cx"> #include "DocumentRuleSets.cpp"
</span><span class="cx"> #include "ElementRuleCollector.cpp"
</span><ins>+#include "FontFace.cpp"
</ins><span class="cx"> #include "FontLoader.cpp"
</span><ins>+#include "FontVariantBuilder.cpp"
</ins><span class="cx"> #include "InspectorCSSOMWrappers.cpp"
</span><span class="cx"> #include "LengthFunctions.cpp"
</span><span class="cx"> #include "MediaList.cpp"
</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 "CSSFontFace.h"
</span><span class="cx">
</span><span class="cx"> #include "CSSFontFaceSource.h"
</span><ins>+#include "CSSFontFamily.h"
+#include "CSSFontFeatureValue.h"
</ins><span class="cx"> #include "CSSFontSelector.h"
</span><ins>+#include "CSSPrimitiveValueMappings.h"
</ins><span class="cx"> #include "CSSSegmentedFontFace.h"
</span><ins>+#include "CSSUnicodeRangeValue.h"
+#include "CSSValue.h"
+#include "CSSValueList.h"
</ins><span class="cx"> #include "Document.h"
</span><span class="cx"> #include "Font.h"
</span><span class="cx"> #include "FontDescription.h"
</span><span class="cx"> #include "FontLoader.h"
</span><ins>+#include "FontVariantBuilder.h"
</ins><span class="cx"> #include "RuntimeEnabledFeatures.h"
</span><ins>+#include "StyleProperties.h"
</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& family)
+{
+ if (!is<CSSValueList>(family))
+ return false;
+
+ CSSValueList& familyList = downcast<CSSValueList>(family);
+ if (!familyList.length())
+ return false;
+
+ m_families = &familyList;
+ return true;
+}
+
+bool CSSFontFace::setStyle(CSSValue& style)
+{
+ if (!is<CSSPrimitiveValue>(style))
+ return false;
+
+ unsigned styleMask = 0;
+ switch (downcast<CSSPrimitiveValue>(style).getValueID()) {
+ case CSSValueNormal:
+ styleMask = FontStyleNormalMask;
+ break;
+ case CSSValueItalic:
+ case CSSValueOblique:
+ styleMask = FontStyleItalicMask;
+ break;
+ default:
+ return false;
+ }
+
+ m_traitsMask = static_cast<FontTraitsMask>((static_cast<unsigned>(m_traitsMask) & (~FontStyleMask)) | styleMask);
+ return true;
+}
+
+bool CSSFontFace::setWeight(CSSValue& weight)
+{
+ if (!is<CSSPrimitiveValue>(weight))
+ return false;
+
+ unsigned weightMask = 0;
+ switch (downcast<CSSPrimitiveValue>(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<FontTraitsMask>((static_cast<unsigned>(m_traitsMask) & (~FontWeightMask)) | weightMask);
+ return true;
+}
+
+bool CSSFontFace::setUnicodeRange(CSSValue& unicodeRange)
+{
+ if (!is<CSSValueList>(unicodeRange))
+ return false;
+
+ m_ranges.clear();
+ auto& list = downcast<CSSValueList>(unicodeRange);
+ for (auto& rangeValue : list) {
+ CSSUnicodeRangeValue& range = downcast<CSSUnicodeRangeValue>(rangeValue.get());
+ m_ranges.append(UnicodeRange(range.from(), range.to()));
+ }
+ return true;
+}
+
+bool CSSFontFace::setVariantLigatures(CSSValue& 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& variantPosition)
+{
+ if (!is<CSSPrimitiveValue>(variantPosition))
+ return false;
+ m_variantSettings.position = downcast<CSSPrimitiveValue>(variantPosition);
+ return true;
+}
+
+bool CSSFontFace::setVariantCaps(CSSValue& variantCaps)
+{
+ if (!is<CSSPrimitiveValue>(variantCaps))
+ return false;
+ m_variantSettings.caps = downcast<CSSPrimitiveValue>(variantCaps);
+ return true;
+}
+
+bool CSSFontFace::setVariantNumeric(CSSValue& 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& variantAlternates)
+{
+ if (!is<CSSPrimitiveValue>(variantAlternates))
+ return false;
+ m_variantSettings.alternates = downcast<CSSPrimitiveValue>(variantAlternates);
+ return true;
+}
+
+bool CSSFontFace::setVariantEastAsian(CSSValue& 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& featureSettings)
+{
+ if (!is<CSSValueList>(featureSettings))
+ return false;
+
+ m_featureSettings = FontFeatureSettings();
+ auto& list = downcast<CSSValueList>(featureSettings);
+ for (auto& rangeValue : list) {
+ CSSFontFeatureValue& feature = downcast<CSSFontFeatureValue>(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& 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<CSSFontFace> {
</span><span class="cx"> public:
</span><del>- static Ref<CSSFontFace> create(FontTraitsMask traitsMask, bool isLocalFallback = false) { return adoptRef(*new CSSFontFace(traitsMask, isLocalFallback)); }
</del><ins>+ static Ref<CSSFontFace> 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&);
+ bool setStyle(CSSValue&);
+ bool setWeight(CSSValue&);
+ bool setUnicodeRange(CSSValue&);
+ bool setVariantLigatures(CSSValue&);
+ bool setVariantPosition(CSSValue&);
+ bool setVariantCaps(CSSValue&);
+ bool setVariantNumeric(CSSValue&);
+ bool setVariantAlternates(CSSValue&);
+ bool setVariantEastAsian(CSSValue&);
+ bool setFeatureSettings(CSSValue&);
</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<UnicodeRange>& ranges() const { return m_ranges; }
</span><ins>+ const FontFeatureSettings& featureSettings() const { return m_featureSettings; }
+ const FontVariantSettings& variantSettings() const { return m_variantSettings; }
+ void setVariantSettings(const FontVariantSettings& 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&& 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&);
</span><span class="cx"> void removedFromSegmentedFontFace(CSSSegmentedFontFace&);
</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<CSSFontFaceSource>&&);
</span><span class="cx">
</span><span class="cx"> void fontLoaded(CSSFontFaceSource&);
</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<CSSValueList> m_families;
</ins><span class="cx"> FontTraitsMask m_traitsMask;
</span><span class="cx"> Vector<UnicodeRange> m_ranges;
</span><span class="cx"> HashSet<CSSSegmentedFontFace*> 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 "CSSUnicodeRangeValue.h"
</span><span class="cx"> #include "CSSValueKeywords.h"
</span><span class="cx"> #include "CSSValueList.h"
</span><ins>+#include "CSSValuePool.h"
</ins><span class="cx"> #include "CachedResourceLoader.h"
</span><span class="cx"> #include "Document.h"
</span><span class="cx"> #include "Font.h"
</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<FontTraitsMask> computeTraitsMask(const StyleProperties& style)
</del><ins>+static void appendSources(CSSFontFace& fontFace, CSSValueList& srcList, Document* document, bool isInitiatingElementInUserAgentShadowTree)
</ins><span class="cx"> {
</span><del>- unsigned traitsMask = 0;
-
- if (RefPtr<CSSValue> fontStyle = style.getPropertyCSSValue(CSSPropertyFontStyle)) {
- if (!is<CSSPrimitiveValue>(*fontStyle))
- return Nullopt;
-
- switch (downcast<CSSPrimitiveValue>(*fontStyle).getValueID()) {
- case CSSValueNormal:
- traitsMask |= FontStyleNormalMask;
- break;
- case CSSValueItalic:
- case CSSValueOblique:
- traitsMask |= FontStyleItalicMask;
- break;
- default:
- break;
- }
- } else
- traitsMask |= FontStyleNormalMask;
-
- if (RefPtr<CSSValue> fontWeight = style.getPropertyCSSValue(CSSPropertyFontWeight)) {
- if (!is<CSSPrimitiveValue>(*fontWeight))
- return Nullopt;
-
- switch (downcast<CSSPrimitiveValue>(*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<FontTraitsMask>(traitsMask);
-}
-
-static Ref<CSSFontFace> createFontFace(CSSValueList& srcList, FontTraitsMask traitsMask, Document* document, bool isInitiatingElementInUserAgentShadowTree)
-{
- Ref<CSSFontFace> fontFace = CSSFontFace::create(traitsMask);
-
</del><span class="cx"> for (auto& 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& item = downcast<CSSFontFaceSrcValue>(src.get());
</span><span class="lines">@@ -172,16 +106,14 @@
</span><span class="cx"> bool allowDownloading = foundSVGFont || (settings && settings->downloadableBinaryFontsEnabled());
</span><span class="cx"> if (allowDownloading && item.isSupportedFormat() && document) {
</span><span class="cx"> if (CachedFont* cachedFont = item.cachedFont(document, foundSVGFont, isInitiatingElementInUserAgentShadowTree))
</span><del>- source = std::make_unique<CSSFontFaceSource>(fontFace.get(), item.resource(), cachedFont);
</del><ins>+ source = std::make_unique<CSSFontFaceSource>(fontFace, item.resource(), cachedFont);
</ins><span class="cx"> }
</span><span class="cx"> } else
</span><del>- source = std::make_unique<CSSFontFaceSource>(fontFace.get(), item.resource(), nullptr, fontFaceElement);
</del><ins>+ source = std::make_unique<CSSFontFaceSource>(fontFace, item.resource(), nullptr, fontFaceElement);
</ins><span class="cx">
</span><span class="cx"> if (source)
</span><del>- fontFace->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& value)
</span><span class="lines">@@ -221,7 +153,8 @@
</span><span class="cx">
</span><span class="cx"> Vector<Ref<CSSFontFace>> faces = { };
</span><span class="cx"> for (auto mask : traitsMasks) {
</span><del>- Ref<CSSFontFace> face = CSSFontFace::create(mask, true);
</del><ins>+ Ref<CSSFontFace> face = CSSFontFace::create(true);
+ face->setTraitsMask(mask);
</ins><span class="cx"> face->adoptSource(std::make_unique<CSSFontFaceSource>(face.get(), familyName));
</span><span class="cx"> ASSERT(!face->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& style = fontFaceRule.properties();
</span><span class="cx"> RefPtr<CSSValue> fontFamily = style.getPropertyCSSValue(CSSPropertyFontFamily);
</span><ins>+ RefPtr<CSSValue> fontStyle = style.getPropertyCSSValue(CSSPropertyFontStyle);
+ RefPtr<CSSValue> fontWeight = style.getPropertyCSSValue(CSSPropertyFontWeight);
</ins><span class="cx"> RefPtr<CSSValue> src = style.getPropertyCSSValue(CSSPropertySrc);
</span><span class="cx"> RefPtr<CSSValue> unicodeRange = style.getPropertyCSSValue(CSSPropertyUnicodeRange);
</span><span class="cx"> RefPtr<CSSValue> 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<CSSValueList>(unicodeRange.get());
+
</ins><span class="cx"> CSSValueList& srcList = downcast<CSSValueList>(*src);
</span><span class="cx"> if (!srcList.length())
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- CSSValueList* rangeList = downcast<CSSValueList>(unicodeRange.get());
</del><ins>+ Ref<CSSFontFace> fontFace = CSSFontFace::create();
</ins><span class="cx">
</span><del>- auto computedTraitsMask = computeTraitsMask(style);
- if (!computedTraitsMask)
</del><ins>+ if (!fontFace->setFamilies(*fontFamily))
</ins><span class="cx"> return;
</span><del>- auto traitsMask = computedTraitsMask.value();
</del><ins>+ if (!fontFace->setStyle(*fontStyle))
+ return;
+ if (!fontFace->setWeight(*fontWeight))
+ return;
+ if (rangeList && !fontFace->setUnicodeRange(*rangeList))
+ return;
+ if (variantLigatures && !fontFace->setVariantLigatures(*variantLigatures))
+ return;
+ if (variantPosition && !fontFace->setVariantPosition(*variantPosition))
+ return;
+ if (variantCaps && !fontFace->setVariantCaps(*variantCaps))
+ return;
+ if (variantNumeric && !fontFace->setVariantNumeric(*variantNumeric))
+ return;
+ if (variantAlternates && !fontFace->setVariantAlternates(*variantAlternates))
+ return;
+ if (variantEastAsian && !fontFace->setVariantEastAsian(*variantEastAsian))
+ return;
+ if (featureSettings && !fontFace->setFeatureSettings(*featureSettings))
+ return;
</ins><span class="cx">
</span><del>- Ref<CSSFontFace> fontFace = createFontFace(srcList, traitsMask, m_document, isInitiatingElementInUserAgentShadowTree);
</del><ins>+ appendSources(fontFace, srcList, m_document, isInitiatingElementInUserAgentShadowTree);
</ins><span class="cx"> if (fontFace->allSourcesFailed())
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- if (rangeList) {
- unsigned numRanges = rangeList->length();
- for (unsigned i = 0; i < numRanges; i++) {
- CSSUnicodeRangeValue& range = downcast<CSSUnicodeRangeValue>(*rangeList->itemWithoutBoundsCheck(i));
- fontFace->addRange(range.from(), range.to());
- }
- }
-
- if (featureSettings) {
- for (auto& item : downcast<CSSValueList>(*featureSettings)) {
- auto& feature = downcast<CSSFontFeatureValue>(item.get());
- fontFace->insertFeature(FontFeature(feature.tag(), feature.value()));
- }
- }
-
- if (variantLigatures)
- applyValueFontVariantLigatures(fontFace.get(), *variantLigatures);
-
- if (variantPosition && is<CSSPrimitiveValue>(*variantPosition))
- fontFace->setVariantPosition(downcast<CSSPrimitiveValue>(*variantPosition));
-
- if (variantCaps && is<CSSPrimitiveValue>(*variantCaps))
- fontFace->setVariantCaps(downcast<CSSPrimitiveValue>(*variantCaps));
-
- if (variantNumeric)
- applyValueFontVariantNumeric(fontFace.get(), *variantNumeric);
-
- if (variantAlternates && is<CSSPrimitiveValue>(*variantAlternates))
- fontFace->setVariantAlternates(downcast<CSSPrimitiveValue>(*variantAlternates));
-
- if (variantEastAsian)
- applyValueFontVariantEastAsian(fontFace.get(), *variantEastAsian);
-
</del><span class="cx"> for (auto& item : familyList) {
</span><span class="cx"> String familyName = familyNameFromPrimitive(downcast<CSSPrimitiveValue>(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 "config.h"
+#include "FontFace.h"
+
+#include "CSSFontFace.h"
+#include "CSSFontFeatureValue.h"
+#include "CSSUnicodeRangeValue.h"
+#include "CSSValue.h"
+#include "FontVariantBuilder.h"
+#include "StyleProperties.h"
+#include <wtf/text/StringBuilder.h>
+
+namespace WebCore {
+
+FontFace::FontFace()
+ : m_backing(CSSFontFace::create())
+{
+}
+
+FontFace::~FontFace()
+{
+}
+
+static inline RefPtr<CSSValue> parseString(const String& string, CSSPropertyID propertyID)
+{
+ Ref<MutableStyleProperties> style = MutableStyleProperties::create();
+ auto result = CSSParser::parseValue(style.ptr(), propertyID, string, true, CSSStrictMode, nullptr);
+ if (result == CSSParser::ParseResult::Error)
+ return nullptr;
+ return style->getPropertyCSSValue(propertyID);
+}
+
+void FontFace::setFamily(const String& family, ExceptionCode& ec)
+{
+ bool success = false;
+ if (auto value = parseString(family, CSSPropertyFontFamily))
+ success = m_backing->setFamilies(*value);
+ if (!success)
+ ec = SYNTAX_ERR;
+}
+
+void FontFace::setStyle(const String& style, ExceptionCode& ec)
+{
+ bool success = false;
+ if (auto value = parseString(style, CSSPropertyFontStyle))
+ success = m_backing->setStyle(*value);
+ if (!success)
+ ec = SYNTAX_ERR;
+}
+
+void FontFace::setWeight(const String& weight, ExceptionCode& ec)
+{
+ bool success = false;
+ if (auto value = parseString(weight, CSSPropertyFontWeight))
+ success = m_backing->setWeight(*value);
+ if (!success)
+ ec = SYNTAX_ERR;
+}
+
+void FontFace::setStretch(const String&, ExceptionCode&)
+{
+ // We don't support font-stretch. Swallow the call.
+}
+
+void FontFace::setUnicodeRange(const String& unicodeRange, ExceptionCode& ec)
+{
+ bool success = false;
+ if (auto value = parseString(unicodeRange, CSSPropertyUnicodeRange))
+ success = m_backing->setUnicodeRange(*value);
+ if (!success)
+ ec = SYNTAX_ERR;
+}
+
+void FontFace::setVariant(const String& variant, ExceptionCode& ec)
+{
+ Ref<MutableStyleProperties> style = MutableStyleProperties::create();
+ auto result = CSSParser::parseValue(style.ptr(), CSSPropertyFontVariant, variant, true, CSSStrictMode, nullptr);
+ if (result != CSSParser::ParseResult::Error) {
+ FontVariantSettings backup = m_backing->variantSettings();
+ bool success = true;
+ if (auto value = style->getPropertyCSSValue(CSSPropertyFontVariantLigatures))
+ success &= m_backing->setVariantLigatures(*value);
+ if (auto value = style->getPropertyCSSValue(CSSPropertyFontVariantPosition))
+ success &= m_backing->setVariantPosition(*value);
+ if (auto value = style->getPropertyCSSValue(CSSPropertyFontVariantCaps))
+ success &= m_backing->setVariantCaps(*value);
+ if (auto value = style->getPropertyCSSValue(CSSPropertyFontVariantNumeric))
+ success &= m_backing->setVariantNumeric(*value);
+ if (auto value = style->getPropertyCSSValue(CSSPropertyFontVariantAlternates))
+ success &= m_backing->setVariantAlternates(*value);
+ if (auto value = style->getPropertyCSSValue(CSSPropertyFontVariantEastAsian))
+ success &= m_backing->setVariantEastAsian(*value);
+ if (success)
+ return;
+ m_backing->setVariantSettings(backup);
+ }
+ ec = SYNTAX_ERR;
+}
+
+void FontFace::setFeatureSettings(const String& featureSettings, ExceptionCode& ec)
+{
+ bool success = false;
+ if (auto value = parseString(featureSettings, CSSPropertyFontFeatureSettings))
+ success = m_backing->setFeatureSettings(*value);
+ if (!success)
+ ec = SYNTAX_ERR;
+}
+
+String FontFace::family() const
+{
+ return m_backing->families()->cssText();
+}
+
+String FontFace::style() const
+{
+ switch (m_backing->traitsMask() & FontStyleMask) {
+ case FontStyleNormalMask:
+ return String("normal", String::ConstructFromLiteral);
+ case FontStyleItalicMask:
+ return String("italic", String::ConstructFromLiteral);
+ }
+ ASSERT_NOT_REACHED();
+ return String("normal", String::ConstructFromLiteral);
+}
+
+String FontFace::weight() const
+{
+ switch (m_backing->traitsMask() & FontWeightMask) {
+ case FontWeight100Mask:
+ return String("100", String::ConstructFromLiteral);
+ case FontWeight200Mask:
+ return String("200", String::ConstructFromLiteral);
+ case FontWeight300Mask:
+ return String("300", String::ConstructFromLiteral);
+ case FontWeight400Mask:
+ return String("normal", String::ConstructFromLiteral);
+ case FontWeight500Mask:
+ return String("500", String::ConstructFromLiteral);
+ case FontWeight600Mask:
+ return String("600", String::ConstructFromLiteral);
+ case FontWeight700Mask:
+ return String("bold", String::ConstructFromLiteral);
+ case FontWeight800Mask:
+ return String("800", String::ConstructFromLiteral);
+ case FontWeight900Mask:
+ return String("900", String::ConstructFromLiteral);
+ }
+ ASSERT_NOT_REACHED();
+ return String("normal", String::ConstructFromLiteral);
+}
+
+String FontFace::stretch() const
+{
+ return "normal";
+}
+
+String FontFace::unicodeRange() const
+{
+ RefPtr<CSSValueList> values = CSSValueList::createCommaSeparated();
+ for (auto& range : m_backing->ranges())
+ values->append(CSSUnicodeRangeValue::create(range.from(), range.to()));
+ return values->cssText();
+}
+
+String FontFace::variant() const
+{
+ return computeFontVariant(m_backing->variantSettings())->cssText();
+}
+
+String FontFace::featureSettings() const
+{
+ if (!m_backing->featureSettings().size())
+ return "normal";
+ RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
+ for (auto& feature : m_backing->featureSettings())
+ list->append(CSSFontFeatureValue::create(FontFeatureTag(feature.tag()), feature.value()));
+ return list->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 "ExceptionCode.h"
+#include <wtf/RefCounted.h>
+#include <wtf/RefPtr.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebCore {
+
+class CSSFontFace;
+
+class FontFace : public RefCounted<FontFace> {
+public:
+ static Ref<FontFace> create() { return adoptRef(*new FontFace()); }
+ virtual ~FontFace();
+
+ void setFamily(const String&, ExceptionCode&);
+ void setStyle(const String&, ExceptionCode&);
+ void setWeight(const String&, ExceptionCode&);
+ void setStretch(const String&, ExceptionCode&);
+ void setUnicodeRange(const String&, ExceptionCode&);
+ void setVariant(const String&, ExceptionCode&);
+ void setFeatureSettings(const String&, ExceptionCode&);
+
+ String family() const;
+ String style() const;
+ String weight() const;
+ String stretch() const;
+ String unicodeRange() const;
+ String variant() const;
+ String featureSettings() const;
+
+private:
+ FontFace();
+
+ Ref<CSSFontFace> 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 "config.h"
+#include "FontVariantBuilder.h"
+
+#include "CSSPrimitiveValue.h"
+#include "CSSValueList.h"
+#include "CSSValuePool.h"
+#include "TextFlags.h"
+
+namespace WebCore {
+
+FontVariantLigaturesValues extractFontVariantLigatures(CSSValue& value)
+{
+ FontVariantLigatures common = FontVariantLigatures::Normal;
+ FontVariantLigatures discretionary = FontVariantLigatures::Normal;
+ FontVariantLigatures historical = FontVariantLigatures::Normal;
+ FontVariantLigatures contextualAlternates = FontVariantLigatures::Normal;
+
+ if (is<CSSValueList>(value)) {
+ for (auto& item : downcast<CSSValueList>(value)) {
+ switch (downcast<CSSPrimitiveValue>(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<CSSPrimitiveValue>(value)) {
+ switch (downcast<CSSPrimitiveValue>(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& value)
+{
+ FontVariantNumericFigure figure = FontVariantNumericFigure::Normal;
+ FontVariantNumericSpacing spacing = FontVariantNumericSpacing::Normal;
+ FontVariantNumericFraction fraction = FontVariantNumericFraction::Normal;
+ FontVariantNumericOrdinal ordinal = FontVariantNumericOrdinal::Normal;
+ FontVariantNumericSlashedZero slashedZero = FontVariantNumericSlashedZero::Normal;
+
+ if (is<CSSValueList>(value)) {
+ for (auto& item : downcast<CSSValueList>(value)) {
+ switch (downcast<CSSPrimitiveValue>(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<CSSPrimitiveValue>(value))
+ ASSERT(downcast<CSSPrimitiveValue>(value).getValueID() == CSSValueNormal);
+
+ return FontVariantNumericValues(figure, spacing, fraction, ordinal, slashedZero);
+}
+
+FontVariantEastAsianValues extractFontVariantEastAsian(CSSValue& value)
+{
+ FontVariantEastAsianVariant variant = FontVariantEastAsianVariant::Normal;
+ FontVariantEastAsianWidth width = FontVariantEastAsianWidth::Normal;
+ FontVariantEastAsianRuby ruby = FontVariantEastAsianRuby::Normal;
+
+ if (is<CSSValueList>(value)) {
+ for (auto& item : downcast<CSSValueList>(value)) {
+ switch (downcast<CSSPrimitiveValue>(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<CSSPrimitiveValue>(value))
+ ASSERT(downcast<CSSPrimitiveValue>(value).getValueID() == CSSValueNormal);
+
+ return FontVariantEastAsianValues(variant, width, ruby);
+}
+
+Ref<CSSValue> computeFontVariant(const FontVariantSettings& 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 <wtf/Ref.h>
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-template <typename T>
-inline void applyValueFontVariantLigatures(T& receiver, CSSValue& 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<CSSValueList>(value)) {
- for (auto& item : downcast<CSSValueList>(value)) {
- switch (downcast<CSSPrimitiveValue>(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<CSSPrimitiveValue>(value)) {
- switch (downcast<CSSPrimitiveValue>(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&);
+FontVariantNumericValues extractFontVariantNumeric(CSSValue&);
+FontVariantEastAsianValues extractFontVariantEastAsian(CSSValue&);
</ins><span class="cx">
</span><del>- receiver.setVariantCommonLigatures(common);
- receiver.setVariantDiscretionaryLigatures(discretionary);
- receiver.setVariantHistoricalLigatures(historical);
- receiver.setVariantContextualAlternates(contextualAlternates);
-}
</del><ins>+Ref<CSSValue> computeFontVariant(const FontVariantSettings&);
</ins><span class="cx">
</span><del>-template <typename T>
-inline void applyValueFontVariantNumeric(T& receiver, CSSValue& value)
-{
- FontVariantNumericFigure figure = FontVariantNumericFigure::Normal;
- FontVariantNumericSpacing spacing = FontVariantNumericSpacing::Normal;
- FontVariantNumericFraction fraction = FontVariantNumericFraction::Normal;
- FontVariantNumericOrdinal ordinal = FontVariantNumericOrdinal::Normal;
- FontVariantNumericSlashedZero slashedZero = FontVariantNumericSlashedZero::Normal;
-
- if (is<CSSValueList>(value)) {
- for (auto& item : downcast<CSSValueList>(value)) {
- switch (downcast<CSSPrimitiveValue>(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<CSSPrimitiveValue>(value))
- ASSERT(downcast<CSSPrimitiveValue>(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 <typename T>
-inline void applyValueFontVariantEastAsian(T& receiver, CSSValue& value)
-{
- FontVariantEastAsianVariant variant = FontVariantEastAsianVariant::Normal;
- FontVariantEastAsianWidth width = FontVariantEastAsianWidth::Normal;
- FontVariantEastAsianRuby ruby = FontVariantEastAsianRuby::Normal;
-
- if (is<CSSValueList>(value)) {
- for (auto& item : downcast<CSSValueList>(value)) {
- switch (downcast<CSSPrimitiveValue>(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<CSSPrimitiveValue>(value))
- ASSERT(downcast<CSSPrimitiveValue>(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& styleResolver, CSSValue& 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& styleResolver, CSSValue& 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& styleResolver, CSSValue& 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>