<!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>[200921] trunk</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/200921">200921</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2016-05-14 12:18:34 -0700 (Sat, 14 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Support ArrayBufferViews in the CSS Font Loading API
https://bugs.webkit.org/show_bug.cgi?id=157694
&lt;rdar://problem/25554267&gt;

Source/WebCore:

This patch adds a new mode to CSSFontFaceSource for immediate (ArrayBuffer) data.
Then, FontFace can simply be hooked up to this new mode.

Reviewed by Darin Adler.

Test: fast/text/css-font-loading-arraybuffer.html

* css/CSSFontFaceSource.cpp:
(WebCore::CSSFontFaceSource::CSSFontFaceSource):
(WebCore::CSSFontFaceSource::font):
* css/CSSFontFaceSource.h:
* css/FontFace.cpp:
(WebCore::FontFace::create):
* loader/cache/CachedFont.cpp:
(WebCore::CachedFont::ensureCustomFontData):
(WebCore::CachedFont::createCustomFontData):
(WebCore::CachedFont::createFont):
(WebCore::CachedFont::platformDataFromCustomData):
* loader/cache/CachedFont.h:

LayoutTests:

Reviewed by Darin Adler.

* fast/text/css-font-loading-arraybuffer-expected.txt: Added.
* fast/text/css-font-loading-arraybuffer.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSFontFaceSourcecpp">trunk/Source/WebCore/css/CSSFontFaceSource.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSFontFaceSourceh">trunk/Source/WebCore/css/CSSFontFaceSource.h</a></li>
<li><a href="#trunkSourceWebCorecssFontFacecpp">trunk/Source/WebCore/css/FontFace.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedFontcpp">trunk/Source/WebCore/loader/cache/CachedFont.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedFonth">trunk/Source/WebCore/loader/cache/CachedFont.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsWOFFFileFormatcpp">trunk/Source/WebCore/platform/graphics/WOFFFileFormat.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsWOFFFileFormath">trunk/Source/WebCore/platform/graphics/WOFFFileFormat.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasttextcssfontloadingarraybufferexpectedtxt">trunk/LayoutTests/fast/text/css-font-loading-arraybuffer-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasttextcssfontloadingarraybufferhtml">trunk/LayoutTests/fast/text/css-font-loading-arraybuffer.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (200920 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-05-14 17:56:01 UTC (rev 200920)
+++ trunk/LayoutTests/ChangeLog        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2016-05-14  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Support ArrayBufferViews in the CSS Font Loading API
+        https://bugs.webkit.org/show_bug.cgi?id=157694
+        &lt;rdar://problem/25554267&gt;
+
+        Reviewed by Darin Adler.
+
+        * fast/text/css-font-loading-arraybuffer-expected.txt: Added.
+        * fast/text/css-font-loading-arraybuffer.html: Added.
+
</ins><span class="cx"> 2016-05-13  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         All scrolling height/width values should be integral rounded.
</span></span></pre></div>
<a id="trunkLayoutTestsfasttextcssfontloadingarraybufferexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/css-font-loading-arraybuffer-expected.txt (0 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/css-font-loading-arraybuffer-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/text/css-font-loading-arraybuffer-expected.txt        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+This test makes sure that an ArrayBufferView can be successfully passed to the FontFace constructor.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS fontFace1.status is &quot;loaded&quot;
+PASS fontFace2.status is &quot;loaded&quot;
+PASS document.getElementById('probe1').getBoundingClientRect().width is 100
+PASS document.getElementById('probe2').getBoundingClientRect().width is 100
+PASS successfullyParsed is true
+
+TEST COMPLETE
+l l
</ins></span></pre></div>
<a id="trunkLayoutTestsfasttextcssfontloadingarraybufferhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/css-font-loading-arraybuffer.html (0 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/css-font-loading-arraybuffer.html                                (rev 0)
+++ trunk/LayoutTests/fast/text/css-font-loading-arraybuffer.html        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -0,0 +1,52 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;span id=&quot;probe1&quot; style=&quot;font-size: 100px;&quot;&gt;l&lt;/span&gt;
+&lt;span id=&quot;probe2&quot; style=&quot;font-size: 100px;&quot;&gt;l&lt;/span&gt;
+&lt;script&gt;
+description(&quot;This test makes sure that an ArrayBufferView can be successfully passed to the FontFace constructor.&quot;);
+window.jsTestIsAsync = true;
+
+var fontRequest = new XMLHttpRequest();
+fontRequest.open(&quot;GET&quot;, &quot;../../resources/Ahem.ttf&quot;);
+fontRequest.responseType = &quot;arraybuffer&quot;;
+var fontFace1;
+var fontFace2;
+fontRequest.addEventListener(&quot;load&quot;, function() {
+        var arrayBuffer = fontRequest.response;
+        if (arrayBuffer) {
+                var byteArray = new Uint8Array(arrayBuffer);
+                fontFace1 = new FontFace(&quot;WebFont1&quot;, arrayBuffer, {});
+                fontFace2 = new FontFace(&quot;WebFont2&quot;, byteArray, {});
+                shouldBeEqualToString(&quot;fontFace1.status&quot;, &quot;loaded&quot;);
+                shouldBeEqualToString(&quot;fontFace2.status&quot;, &quot;loaded&quot;);
+                document.fonts.add(fontFace1);
+                document.fonts.add(fontFace2);
+                document.getElementById(&quot;probe1&quot;).style.fontFamily = &quot;WebFont1&quot;;
+                document.getElementById(&quot;probe2&quot;).style.fontFamily = &quot;WebFont2&quot;;
+                shouldEvaluateTo(&quot;document.getElementById('probe1').getBoundingClientRect().width&quot;, 100);
+                shouldEvaluateTo(&quot;document.getElementById('probe2').getBoundingClientRect().width&quot;, 100);
+                fontFace1.loaded.then(function() {
+                        return fontFace2.loaded;
+                }, function() {
+                        testFailed(&quot;fontFace1's promise should be successful&quot;);
+                        finishJSTest();
+                }).then(function() {
+                        finishJSTest();
+                }, function() {
+                        testFailed(&quot;fontFace2's promise should be successful&quot;);
+                        finishJSTest();
+                });
+        } else {
+                testFailed(&quot;XHR'ing the font should be successful.&quot;);
+                finishJSTest();
+        }
+});
+fontRequest.send();
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (200920 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-14 17:56:01 UTC (rev 200920)
+++ trunk/Source/WebCore/ChangeLog        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2016-05-14  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Support ArrayBufferViews in the CSS Font Loading API
+        https://bugs.webkit.org/show_bug.cgi?id=157694
+        &lt;rdar://problem/25554267&gt;
+
+        This patch adds a new mode to CSSFontFaceSource for immediate (ArrayBuffer) data.
+        Then, FontFace can simply be hooked up to this new mode.
+
+        Reviewed by Darin Adler.
+
+        Test: fast/text/css-font-loading-arraybuffer.html
+
+        * css/CSSFontFaceSource.cpp:
+        (WebCore::CSSFontFaceSource::CSSFontFaceSource):
+        (WebCore::CSSFontFaceSource::font):
+        * css/CSSFontFaceSource.h:
+        * css/FontFace.cpp:
+        (WebCore::FontFace::create):
+        * loader/cache/CachedFont.cpp:
+        (WebCore::CachedFont::ensureCustomFontData):
+        (WebCore::CachedFont::createCustomFontData):
+        (WebCore::CachedFont::createFont):
+        (WebCore::CachedFont::platformDataFromCustomData):
+        * loader/cache/CachedFont.h:
+
</ins><span class="cx"> 2016-05-14  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebIDL] Add support for dictionary members of integer types
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontFaceSourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontFaceSource.cpp (200920 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontFaceSource.cpp        2016-05-14 17:56:01 UTC (rev 200920)
+++ trunk/Source/WebCore/css/CSSFontFaceSource.cpp        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -34,9 +34,8 @@
</span><span class="cx"> #include &quot;ElementIterator.h&quot;
</span><span class="cx"> #include &quot;Font.h&quot;
</span><span class="cx"> #include &quot;FontCache.h&quot;
</span><ins>+#include &quot;FontCustomPlatformData.h&quot;
</ins><span class="cx"> #include &quot;FontDescription.h&quot;
</span><del>-
-#include &quot;FontCustomPlatformData.h&quot;
</del><span class="cx"> #include &quot;SVGToOTFFontConversion.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(SVG_FONTS)
</span><span class="lines">@@ -69,10 +68,11 @@
</span><span class="cx">     m_status = newStatus;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CSSFontFaceSource::CSSFontFaceSource(CSSFontFace&amp; owner, const String&amp; familyNameOrURI, CachedFont* font, SVGFontFaceElement* fontFace)
</del><ins>+CSSFontFaceSource::CSSFontFaceSource(CSSFontFace&amp; owner, const String&amp; familyNameOrURI, CachedFont* font, SVGFontFaceElement* fontFace, RefPtr&lt;JSC::ArrayBufferView&gt;&amp;&amp; arrayBufferView)
</ins><span class="cx">     : m_familyNameOrURI(familyNameOrURI)
</span><span class="cx">     , m_font(font)
</span><span class="cx">     , m_face(owner)
</span><ins>+    , m_immediateSource(WTFMove(arrayBufferView))
</ins><span class="cx"> #if ENABLE(SVG_FONTS)
</span><span class="cx">     , m_svgFontFaceElement(fontFace)
</span><span class="cx"> #endif
</span><span class="lines">@@ -137,6 +137,17 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     if (!m_font &amp;&amp; !fontFaceElement) {
</span><ins>+        if (m_immediateSource) {
+            if (!m_immediateFontCustomPlatformData) {
+                bool wrapping;
+                RefPtr&lt;SharedBuffer&gt; buffer = SharedBuffer::create(static_cast&lt;const char*&gt;(m_immediateSource-&gt;baseAddress()), m_immediateSource-&gt;byteLength());
+                ASSERT(buffer);
+                m_immediateFontCustomPlatformData = CachedFont::createCustomFontData(*buffer, wrapping);
+            } if (!m_immediateFontCustomPlatformData)
+                return nullptr;
+            return Font::create(CachedFont::platformDataFromCustomData(*m_immediateFontCustomPlatformData, fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings), true);
+        }
+
</ins><span class="cx">         // We're local. Just return a Font from the normal cache.
</span><span class="cx">         // We don't want to check alternate font family names here, so pass true as the checkingAlternateName parameter.
</span><span class="cx">         return FontCache::singleton().fontForFamily(fontDescription, m_familyNameOrURI, &amp;fontFaceFeatures, &amp;fontFaceVariantSettings, true);
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSFontFaceSourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSFontFaceSource.h (200920 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSFontFaceSource.h        2016-05-14 17:56:01 UTC (rev 200920)
+++ trunk/Source/WebCore/css/CSSFontFaceSource.h        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CachedFontClient.h&quot;
</span><span class="cx"> #include &quot;CachedResourceHandle.h&quot;
</span><ins>+#include &lt;runtime/ArrayBufferView.h&gt;
</ins><span class="cx"> #include &lt;wtf/text/AtomicString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -45,7 +46,7 @@
</span><span class="cx"> class CSSFontFaceSource final : public CachedFontClient {
</span><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><del>-    CSSFontFaceSource(CSSFontFace&amp; owner, const String&amp; familyNameOrURI, CachedFont* = nullptr, SVGFontFaceElement* = nullptr);
</del><ins>+    CSSFontFaceSource(CSSFontFace&amp; owner, const String&amp; familyNameOrURI, CachedFont* = nullptr, SVGFontFaceElement* = nullptr, RefPtr&lt;JSC::ArrayBufferView&gt;&amp;&amp; = nullptr);
</ins><span class="cx">     virtual ~CSSFontFaceSource();
</span><span class="cx"> 
</span><span class="cx">     //                      =&gt; Success
</span><span class="lines">@@ -80,6 +81,8 @@
</span><span class="cx">     CSSFontFace&amp; m_face; // Our owning font face.
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;SharedBuffer&gt; m_generatedOTFBuffer;
</span><ins>+    RefPtr&lt;JSC::ArrayBufferView&gt; m_immediateSource;
+    std::unique_ptr&lt;FontCustomPlatformData&gt; m_immediateFontCustomPlatformData;
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(SVG_FONTS)
</span><span class="cx">     RefPtr&lt;SVGFontFaceElement&gt; m_svgFontFaceElement;
</span></span></pre></div>
<a id="trunkSourceWebCorecssFontFacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/FontFace.cpp (200920 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontFace.cpp        2016-05-14 17:56:01 UTC (rev 200920)
+++ trunk/Source/WebCore/css/FontFace.cpp        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;FontFace.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;CSSFontFaceSource.h&quot;
</ins><span class="cx"> #include &quot;CSSFontFeatureValue.h&quot;
</span><span class="cx"> #include &quot;CSSUnicodeRangeValue.h&quot;
</span><span class="cx"> #include &quot;CSSValuePool.h&quot;
</span><span class="lines">@@ -36,10 +37,19 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+static bool populateFontFaceWithArrayBuffer(CSSFontFace&amp; fontFace, Ref&lt;JSC::ArrayBufferView&gt;&amp;&amp; arrayBufferView)
+{
+    auto source = std::make_unique&lt;CSSFontFaceSource&gt;(fontFace, String(), nullptr, nullptr, WTFMove(arrayBufferView));
+    fontFace.adoptSource(WTFMove(source));
+    return false;
+}
+
</ins><span class="cx"> RefPtr&lt;FontFace&gt; FontFace::create(JSC::ExecState&amp; state, Document&amp; document, const String&amp; family, JSC::JSValue source, const Descriptors&amp; descriptors, ExceptionCode&amp; ec)
</span><span class="cx"> {
</span><span class="cx">     auto result = adoptRef(*new FontFace(document.fontSelector()));
</span><span class="cx"> 
</span><ins>+    bool dataRequiresAsynchronousLoading = true;
+
</ins><span class="cx">     ec = 0;
</span><span class="cx">     result-&gt;setFamily(family, ec);
</span><span class="cx">     if (ec)
</span><span class="lines">@@ -52,6 +62,11 @@
</span><span class="cx">             return nullptr;
</span><span class="cx">         }
</span><span class="cx">         CSSFontFace::appendSources(result-&gt;backing(), downcast&lt;CSSValueList&gt;(*value), &amp;document, false);
</span><ins>+    } else if (auto arrayBufferView = toArrayBufferView(source))
+        dataRequiresAsynchronousLoading = populateFontFaceWithArrayBuffer(result-&gt;backing(), arrayBufferView.releaseNonNull());
+    else if (auto arrayBuffer = toArrayBuffer(source)) {
+        auto arrayBufferView = JSC::Uint8Array::create(arrayBuffer, 0, arrayBuffer-&gt;byteLength());
+        dataRequiresAsynchronousLoading = populateFontFaceWithArrayBuffer(result-&gt;backing(), arrayBufferView.releaseNonNull());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     result-&gt;setStyle(descriptors.style, ec);
</span><span class="lines">@@ -73,6 +88,11 @@
</span><span class="cx">     if (ec)
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><ins>+    if (!dataRequiresAsynchronousLoading) {
+        result-&gt;backing().load();
+        ASSERT(result-&gt;backing().status() == CSSFontFace::Status::Success);
+    }
+
</ins><span class="cx">     return WTFMove(result);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedFontcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedFont.cpp (200920 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedFont.cpp        2016-05-14 17:56:01 UTC (rev 200920)
+++ trunk/Source/WebCore/loader/cache/CachedFont.cpp        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -92,19 +92,9 @@
</span><span class="cx"> {
</span><span class="cx">     if (!m_fontCustomPlatformData &amp;&amp; !errorOccurred() &amp;&amp; !isLoading() &amp;&amp; data) {
</span><span class="cx">         RefPtr&lt;SharedBuffer&gt; buffer(data);
</span><del>-
-#if !PLATFORM(COCOA)
-        if (isWOFF(buffer.get())) {
-            Vector&lt;char&gt; convertedFont;
-            if (!convertWOFFToSfnt(buffer.get(), convertedFont))
-                buffer = nullptr;
-            else
-                buffer = SharedBuffer::adoptVector(convertedFont);
-        }
-#endif
-
-        m_fontCustomPlatformData = buffer ? createFontCustomPlatformData(*buffer) : nullptr;
-        m_hasCreatedFontDataWrappingResource = m_fontCustomPlatformData &amp;&amp; (buffer == m_data);
</del><ins>+        bool wrapping;
+        m_fontCustomPlatformData = createCustomFontData(*buffer, wrapping);
+        m_hasCreatedFontDataWrappingResource = m_fontCustomPlatformData &amp;&amp; wrapping;
</ins><span class="cx">         if (!m_fontCustomPlatformData)
</span><span class="cx">             setStatus(DecodeError);
</span><span class="cx">     }
</span><span class="lines">@@ -112,20 +102,44 @@
</span><span class="cx">     return m_fontCustomPlatformData.get();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+std::unique_ptr&lt;FontCustomPlatformData&gt; CachedFont::createCustomFontData(SharedBuffer&amp; bytes, bool&amp; wrapping)
+{
+    RefPtr&lt;SharedBuffer&gt; buffer = &amp;bytes;
+    wrapping = true;
+
+#if !PLATFORM(COCOA)
+    if (isWOFF(*buffer)) {
+        Vector&lt;char&gt; convertedFont;
+        if (!convertWOFFToSfnt(*buffer, convertedFont))
+            buffer = nullptr;
+        else
+            buffer = SharedBuffer::adoptVector(convertedFont);
+        wrapping = false;
+    }
+#endif
+
+    return buffer ? createFontCustomPlatformData(*buffer) : nullptr;
+}
+
</ins><span class="cx"> RefPtr&lt;Font&gt; CachedFont::createFont(const FontDescription&amp; fontDescription, const AtomicString&amp;, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&amp; fontFaceFeatures, const FontVariantSettings&amp; fontFaceVariantSettings)
</span><span class="cx"> {
</span><del>-    return Font::create(platformDataFromCustomData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings), true, false);
</del><ins>+    return Font::create(platformDataFromCustomData(fontDescription, syntheticBold, syntheticItalic, fontFaceFeatures, fontFaceVariantSettings), true);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FontPlatformData CachedFont::platformDataFromCustomData(const FontDescription&amp; fontDescription, bool bold, bool italic, const FontFeatureSettings&amp; fontFaceFeatures, const FontVariantSettings&amp; fontFaceVariantSettings)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_fontCustomPlatformData);
</span><ins>+    return platformDataFromCustomData(*m_fontCustomPlatformData, fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings);
+}
+
+FontPlatformData CachedFont::platformDataFromCustomData(FontCustomPlatformData&amp; fontCustomPlatformData, const FontDescription&amp; fontDescription, bool bold, bool italic, const FontFeatureSettings&amp; fontFaceFeatures, const FontVariantSettings&amp; fontFaceVariantSettings)
+{
</ins><span class="cx"> #if PLATFORM(COCOA)
</span><del>-    return m_fontCustomPlatformData-&gt;fontPlatformData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings);
</del><ins>+    return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic, fontFaceFeatures, fontFaceVariantSettings);
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(fontFaceFeatures);
</span><span class="cx">     UNUSED_PARAM(fontFaceVariantSettings);
</span><del>-    return m_fontCustomPlatformData-&gt;fontPlatformData(fontDescription, bold, italic);
</del><ins>+    return fontCustomPlatformData.fontPlatformData(fontDescription, bold, italic);
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedFonth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedFont.h (200920 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedFont.h        2016-05-14 17:56:01 UTC (rev 200920)
+++ trunk/Source/WebCore/loader/cache/CachedFont.h        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -51,6 +51,9 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool ensureCustomFontData(const AtomicString&amp; remoteURI);
</span><span class="cx"> 
</span><ins>+    static std::unique_ptr&lt;FontCustomPlatformData&gt; createCustomFontData(SharedBuffer&amp;, bool&amp; wrapping);
+    static FontPlatformData platformDataFromCustomData(FontCustomPlatformData&amp;, const FontDescription&amp;, bool bold, bool italic, const FontFeatureSettings&amp;, const FontVariantSettings&amp;);
+
</ins><span class="cx">     virtual RefPtr&lt;Font&gt; createFont(const FontDescription&amp;, const AtomicString&amp; remoteURI, bool syntheticBold, bool syntheticItalic, const FontFeatureSettings&amp;, const FontVariantSettings&amp;);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsWOFFFileFormatcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/WOFFFileFormat.cpp (200920 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/WOFFFileFormat.cpp        2016-05-14 17:56:01 UTC (rev 200920)
+++ trunk/Source/WebCore/platform/graphics/WOFFFileFormat.cpp        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -37,25 +37,25 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-static bool readUInt32(SharedBuffer* buffer, size_t&amp; offset, uint32_t&amp; value)
</del><ins>+static bool readUInt32(SharedBuffer&amp; buffer, size_t&amp; offset, uint32_t&amp; value)
</ins><span class="cx"> {
</span><del>-    ASSERT_ARG(offset, offset &lt;= buffer-&gt;size());
-    if (buffer-&gt;size() - offset &lt; sizeof(value))
</del><ins>+    ASSERT_ARG(offset, offset &lt;= buffer.size());
+    if (buffer.size() - offset &lt; sizeof(value))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    value = ntohl(*reinterpret_cast_ptr&lt;const uint32_t*&gt;(buffer-&gt;data() + offset));
</del><ins>+    value = ntohl(*reinterpret_cast_ptr&lt;const uint32_t*&gt;(buffer.data() + offset));
</ins><span class="cx">     offset += sizeof(value);
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool readUInt16(SharedBuffer* buffer, size_t&amp; offset, uint16_t&amp; value)
</del><ins>+static bool readUInt16(SharedBuffer&amp; buffer, size_t&amp; offset, uint16_t&amp; value)
</ins><span class="cx"> {
</span><del>-    ASSERT_ARG(offset, offset &lt;= buffer-&gt;size());
-    if (buffer-&gt;size() - offset &lt; sizeof(value))
</del><ins>+    ASSERT_ARG(offset, offset &lt;= buffer.size());
+    if (buffer.size() - offset &lt; sizeof(value))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    value = ntohs(*reinterpret_cast_ptr&lt;const uint16_t*&gt;(buffer-&gt;data() + offset));
</del><ins>+    value = ntohs(*reinterpret_cast_ptr&lt;const uint16_t*&gt;(buffer.data() + offset));
</ins><span class="cx">     offset += sizeof(value);
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="lines">@@ -75,7 +75,7 @@
</span><span class="cx"> 
</span><span class="cx"> static const uint32_t woffSignature = 0x774f4646; /* 'wOFF' */
</span><span class="cx"> 
</span><del>-bool isWOFF(SharedBuffer* buffer)
</del><ins>+bool isWOFF(SharedBuffer&amp; buffer)
</ins><span class="cx"> {
</span><span class="cx">     size_t offset = 0;
</span><span class="cx">     uint32_t signature;
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool convertWOFFToSfnt(SharedBuffer* woff, Vector&lt;char&gt;&amp; sfnt)
</del><ins>+bool convertWOFFToSfnt(SharedBuffer&amp; woff, Vector&lt;char&gt;&amp; sfnt)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT_ARG(sfnt, sfnt.isEmpty());
</span><span class="cx"> 
</span><span class="lines">@@ -105,8 +105,8 @@
</span><span class="cx"> 
</span><span class="cx"> #if USE(WOFF2)
</span><span class="cx">     if (signature == woff2::kWoff2Signature) {
</span><del>-        const uint8_t* woffData = reinterpret_cast_ptr&lt;const uint8_t*&gt;(woff-&gt;data());
-        const size_t woffSize = woff-&gt;size();
</del><ins>+        const uint8_t* woffData = reinterpret_cast_ptr&lt;const uint8_t*&gt;(woff.data());
+        const size_t woffSize = woff.size();
</ins><span class="cx">         const size_t sfntSize = woff2::ComputeWOFF2FinalSize(woffData, woffSize);
</span><span class="cx"> 
</span><span class="cx">         if (!sfnt.tryReserveCapacity(sfntSize))
</span><span class="lines">@@ -127,7 +127,7 @@
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     uint32_t length;
</span><del>-    if (!readUInt32(woff, offset, length) || length != woff-&gt;size())
</del><ins>+    if (!readUInt32(woff, offset, length) || length != woff.size())
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     uint16_t numTables;
</span><span class="lines">@@ -145,7 +145,7 @@
</span><span class="cx">     if (!readUInt32(woff, offset, totalSfntSize))
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    if (woff-&gt;size() - offset &lt; sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t))
</del><ins>+    if (woff.size() - offset &lt; sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     offset += sizeof(uint16_t); // majorVersion
</span><span class="lines">@@ -157,7 +157,7 @@
</span><span class="cx">     offset += sizeof(uint32_t); // privLength
</span><span class="cx"> 
</span><span class="cx">     // Check if the WOFF can supply as many tables as it claims it has.
</span><del>-    if (woff-&gt;size() - offset &lt; numTables * 5 * sizeof(uint32_t))
</del><ins>+    if (woff.size() - offset &lt; numTables * 5 * sizeof(uint32_t))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     // Write the sfnt offset subtable.
</span><span class="lines">@@ -201,7 +201,7 @@
</span><span class="cx">         if (!readUInt32(woff, offset, tableCompLength))
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        if (tableOffset &gt; woff-&gt;size() || tableCompLength &gt; woff-&gt;size() - tableOffset)
</del><ins>+        if (tableOffset &gt; woff.size() || tableCompLength &gt; woff.size() - tableOffset)
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="cx">         uint32_t tableOrigLength;
</span><span class="lines">@@ -225,7 +225,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (tableCompLength == tableOrigLength) {
</span><span class="cx">             // The table is not compressed.
</span><del>-            if (!sfnt.tryAppend(woff-&gt;data() + tableOffset, tableCompLength))
</del><ins>+            if (!sfnt.tryAppend(woff.data() + tableOffset, tableCompLength))
</ins><span class="cx">                 return false;
</span><span class="cx">         } else {
</span><span class="cx">             uLongf destLen = tableOrigLength;
</span><span class="lines">@@ -233,7 +233,7 @@
</span><span class="cx">                 return false;
</span><span class="cx">             Bytef* dest = reinterpret_cast&lt;Bytef*&gt;(sfnt.end());
</span><span class="cx">             sfnt.grow(sfnt.size() + tableOrigLength);
</span><del>-            if (uncompress(dest, &amp;destLen, reinterpret_cast&lt;const Bytef*&gt;(woff-&gt;data() + tableOffset), tableCompLength) != Z_OK)
</del><ins>+            if (uncompress(dest, &amp;destLen, reinterpret_cast&lt;const Bytef*&gt;(woff.data() + tableOffset), tableCompLength) != Z_OK)
</ins><span class="cx">                 return false;
</span><span class="cx">             if (destLen != tableOrigLength)
</span><span class="cx">                 return false;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsWOFFFileFormath"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/WOFFFileFormat.h (200920 => 200921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/WOFFFileFormat.h        2016-05-14 17:56:01 UTC (rev 200920)
+++ trunk/Source/WebCore/platform/graphics/WOFFFileFormat.h        2016-05-14 19:18:34 UTC (rev 200921)
</span><span class="lines">@@ -33,11 +33,11 @@
</span><span class="cx"> class SharedBuffer;
</span><span class="cx"> 
</span><span class="cx"> // Returns whether the buffer is a WOFF file.
</span><del>-bool isWOFF(SharedBuffer* buffer);
</del><ins>+bool isWOFF(SharedBuffer&amp;);
</ins><span class="cx"> 
</span><span class="cx"> // Returns false if the WOFF file woff is invalid or could not be converted to sfnt (for example,
</span><span class="cx"> // if conversion ran out of memory). Otherwise returns true and writes the sfnt payload into sfnt.
</span><del>-bool convertWOFFToSfnt(SharedBuffer* woff, Vector&lt;char&gt;&amp; sfnt);
</del><ins>+bool convertWOFFToSfnt(SharedBuffer&amp; woff, Vector&lt;char&gt;&amp; sfnt);
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>