<!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>[176453] 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/176453">176453</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-11-21 10:43:21 -0800 (Fri, 21 Nov 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[CSS Font Loading] Switch to dispatching events asynchronously
https://bugs.webkit.org/show_bug.cgi?id=138755

Patch by Bear Travis &lt;betravis@gmail.com&gt; on 2014-11-21
Reviewed by Simon Fraser.

Source/WebCore:

Moving FontLoader to dispatch events and notify callbacks similarly
to EventSender or the GenericEventQueue. Several bugs have popped
up in the past because FontLoader has been sending events during
layout, and there is no need for that to be the case.

Covered by existing font loader event tests. Added an additional
test for the svg case, fontloader-svg-select.

* css/FontLoader.cpp:
(WebCore::FontLoader::didLayout):
(WebCore::FontLoader::timerFired): Adding asynchronous callback.
(WebCore::FontLoader::scheduleEvent): Add an event to the dispatch
queue.
(WebCore::FontLoader::firePendingEvents): Modified to handle the
loading done event and callbacks.
(WebCore::FontLoader::loadingDone): Modified to spin up the timer
rather than immediately dispatching events.
* css/FontLoader.h:

LayoutTests:

Refactoring tests to check for all events only after the FontLoader
itself has completed. Tests were previously checking after a specific font
had loaded, at which point some of the events may have yet to fire.

* fast/css/fontloader-multiple-faces-download-error-expected.txt:
* fast/css/fontloader-multiple-faces-download-error.html:
* fast/css/fontloader-multiple-faces-expected.txt:
* fast/css/fontloader-multiple-faces.html:
* fast/css/fontloader-multiple-families-expected.txt:
* fast/css/fontloader-multiple-families.html:
* fast/css/fontloader-svg-select-expected.txt: Added
* fast/css/fontloader-svg-select.svg: Added</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastcssfontloadermultiplefacesdownloaderrorexpectedtxt">trunk/LayoutTests/fast/css/fontloader-multiple-faces-download-error-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcssfontloadermultiplefacesdownloaderrorhtml">trunk/LayoutTests/fast/css/fontloader-multiple-faces-download-error.html</a></li>
<li><a href="#trunkLayoutTestsfastcssfontloadermultiplefacesexpectedtxt">trunk/LayoutTests/fast/css/fontloader-multiple-faces-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcssfontloadermultiplefaceshtml">trunk/LayoutTests/fast/css/fontloader-multiple-faces.html</a></li>
<li><a href="#trunkLayoutTestsfastcssfontloadermultiplefamiliesexpectedtxt">trunk/LayoutTests/fast/css/fontloader-multiple-families-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcssfontloadermultiplefamilieshtml">trunk/LayoutTests/fast/css/fontloader-multiple-families.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssFontLoadercpp">trunk/Source/WebCore/css/FontLoader.cpp</a></li>
<li><a href="#trunkSourceWebCorecssFontLoaderh">trunk/Source/WebCore/css/FontLoader.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastcssfontloadersvgselectexpectedtxt">trunk/LayoutTests/fast/css/fontloader-svg-select-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcssfontloadersvgselectsvg">trunk/LayoutTests/fast/css/fontloader-svg-select.svg</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (176452 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-11-21 17:40:50 UTC (rev 176452)
+++ trunk/LayoutTests/ChangeLog        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2014-11-21  Bear Travis  &lt;betravis@gmail.com&gt;
+
+        [CSS Font Loading] Switch to dispatching events asynchronously
+        https://bugs.webkit.org/show_bug.cgi?id=138755
+
+        Reviewed by Simon Fraser.
+
+        Refactoring tests to check for all events only after the FontLoader
+        itself has completed. Tests were previously checking after a specific font
+        had loaded, at which point some of the events may have yet to fire.
+
+        * fast/css/fontloader-multiple-faces-download-error-expected.txt:
+        * fast/css/fontloader-multiple-faces-download-error.html:
+        * fast/css/fontloader-multiple-faces-expected.txt:
+        * fast/css/fontloader-multiple-faces.html:
+        * fast/css/fontloader-multiple-families-expected.txt:
+        * fast/css/fontloader-multiple-families.html:
+        * fast/css/fontloader-svg-select-expected.txt: Added
+        * fast/css/fontloader-svg-select.svg: Added
+
</ins><span class="cx"> 2014-11-21  Chris Fleizach  &lt;cfleizach@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         AX: MathML expressions are misread by VoiceOver
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssfontloadermultiplefacesdownloaderrorexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css/fontloader-multiple-faces-download-error-expected.txt (176452 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/fontloader-multiple-faces-download-error-expected.txt        2014-11-21 17:40:50 UTC (rev 176452)
+++ trunk/LayoutTests/fast/css/fontloader-multiple-faces-download-error-expected.txt        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -7,9 +7,8 @@
</span><span class="cx"> PASS events['loadstart'] is 2
</span><span class="cx"> PASS events['load'] is 1
</span><span class="cx"> PASS events['error'] is 1
</span><del>-PASS events['loadingdone'] is undefined
-PASS document.fonts.checkFont('10px TestFont') is false
</del><span class="cx"> PASS events['loadingdone'] is 1
</span><ins>+PASS document.fonts.checkFont('10px TestFont') is false
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssfontloadermultiplefacesdownloaderrorhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css/fontloader-multiple-faces-download-error.html (176452 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/fontloader-multiple-faces-download-error.html        2014-11-21 17:40:50 UTC (rev 176452)
+++ trunk/LayoutTests/fast/css/fontloader-multiple-faces-download-error.html        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -43,16 +43,15 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function onerror() {
</span><ins>+}
+
+function verify() {
</ins><span class="cx">     shouldBe(&quot;events['loading']&quot;, &quot;1&quot;);
</span><span class="cx">     shouldBe(&quot;events['loadstart']&quot;, &quot;2&quot;);
</span><span class="cx">     shouldBe(&quot;events['load']&quot;, &quot;1&quot;);
</span><span class="cx">     shouldBe(&quot;events['error']&quot;, &quot;1&quot;);
</span><del>-    shouldBe(&quot;events['loadingdone']&quot;, &quot;undefined&quot;);
-    shouldBe(&quot;document.fonts.checkFont('10px TestFont')&quot;, &quot;false&quot;);
-}
-
-function verify() {
</del><span class="cx">     shouldBe(&quot;events['loadingdone']&quot;, &quot;1&quot;);
</span><ins>+    shouldBe(&quot;document.fonts.checkFont('10px TestFont')&quot;, &quot;false&quot;);
</ins><span class="cx">     finishJSTest();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssfontloadermultiplefacesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css/fontloader-multiple-faces-expected.txt (176452 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/fontloader-multiple-faces-expected.txt        2014-11-21 17:40:50 UTC (rev 176452)
+++ trunk/LayoutTests/fast/css/fontloader-multiple-faces-expected.txt        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -7,9 +7,8 @@
</span><span class="cx"> PASS events['loadstart'] is 2
</span><span class="cx"> PASS events['load'] is 2
</span><span class="cx"> PASS events['error'] is undefined
</span><del>-PASS events['loadingdone'] is undefined
-PASS document.fonts.checkFont('10px TestFont') is true
</del><span class="cx"> PASS events['loadingdone'] is 1
</span><ins>+PASS document.fonts.checkFont('10px TestFont') is true
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssfontloadermultiplefaceshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css/fontloader-multiple-faces.html (176452 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/fontloader-multiple-faces.html        2014-11-21 17:40:50 UTC (rev 176452)
+++ trunk/LayoutTests/fast/css/fontloader-multiple-faces.html        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -38,12 +38,6 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function onsuccess() {
</span><del>-    shouldBe(&quot;events['loading']&quot;, &quot;1&quot;);
-    shouldBe(&quot;events['loadstart']&quot;, &quot;2&quot;);
-    shouldBe(&quot;events['load']&quot;, &quot;2&quot;);
-    shouldBe(&quot;events['error']&quot;, &quot;undefined&quot;);
-    shouldBe(&quot;events['loadingdone']&quot;, &quot;undefined&quot;);
-    shouldBe(&quot;document.fonts.checkFont('10px TestFont')&quot;, &quot;true&quot;);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function onerror() {
</span><span class="lines">@@ -52,7 +46,12 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function verify() {
</span><ins>+    shouldBe(&quot;events['loading']&quot;, &quot;1&quot;);
+    shouldBe(&quot;events['loadstart']&quot;, &quot;2&quot;);
+    shouldBe(&quot;events['load']&quot;, &quot;2&quot;);
+    shouldBe(&quot;events['error']&quot;, &quot;undefined&quot;);
</ins><span class="cx">     shouldBe(&quot;events['loadingdone']&quot;, &quot;1&quot;);
</span><ins>+    shouldBe(&quot;document.fonts.checkFont('10px TestFont')&quot;, &quot;true&quot;);
</ins><span class="cx">     finishJSTest();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssfontloadermultiplefamiliesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css/fontloader-multiple-families-expected.txt (176452 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/fontloader-multiple-families-expected.txt        2014-11-21 17:40:50 UTC (rev 176452)
+++ trunk/LayoutTests/fast/css/fontloader-multiple-families-expected.txt        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -7,9 +7,8 @@
</span><span class="cx"> PASS events['loadstart'] is 2
</span><span class="cx"> PASS events['load'] is 2
</span><span class="cx"> PASS events['error'] is undefined
</span><del>-PASS events['loadingdone'] is undefined
-PASS document.fonts.checkFont('10px TestFont1, TestFont2') is true
</del><span class="cx"> PASS events['loadingdone'] is 1
</span><ins>+PASS document.fonts.checkFont('10px TestFont1, TestFont2') is true
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssfontloadermultiplefamilieshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css/fontloader-multiple-families.html (176452 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/fontloader-multiple-families.html        2014-11-21 17:40:50 UTC (rev 176452)
+++ trunk/LayoutTests/fast/css/fontloader-multiple-families.html        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -38,12 +38,6 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function onsuccess() {
</span><del>-    shouldBe(&quot;events['loading']&quot;, &quot;1&quot;);
-    shouldBe(&quot;events['loadstart']&quot;, &quot;2&quot;);
-    shouldBe(&quot;events['load']&quot;, &quot;2&quot;);
-    shouldBe(&quot;events['error']&quot;, &quot;undefined&quot;);
-    shouldBe(&quot;events['loadingdone']&quot;, &quot;undefined&quot;);
-    shouldBe(&quot;document.fonts.checkFont('10px TestFont1, TestFont2')&quot;, &quot;true&quot;);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function onerror() {
</span><span class="lines">@@ -51,7 +45,12 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function verify() {
</span><ins>+    shouldBe(&quot;events['loading']&quot;, &quot;1&quot;);
+    shouldBe(&quot;events['loadstart']&quot;, &quot;2&quot;);
+    shouldBe(&quot;events['load']&quot;, &quot;2&quot;);
+    shouldBe(&quot;events['error']&quot;, &quot;undefined&quot;);
</ins><span class="cx">     shouldBe(&quot;events['loadingdone']&quot;, &quot;1&quot;);
</span><ins>+    shouldBe(&quot;document.fonts.checkFont('10px TestFont1, TestFont2')&quot;, &quot;true&quot;);
</ins><span class="cx">     finishJSTest();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssfontloadersvgselectexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/fontloader-svg-select-expected.txt (0 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/fontloader-svg-select-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/css/fontloader-svg-select-expected.txt        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+abc
+--
+$
</ins></span></pre></div>
<a id="trunkLayoutTestsfastcssfontloadersvgselectsvg"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/fontloader-svg-select.svg (0 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/fontloader-svg-select.svg                                (rev 0)
+++ trunk/LayoutTests/fast/css/fontloader-svg-select.svg        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -0,0 +1,41 @@
</span><ins>+&lt;svg viewBox=&quot;0 0 480 360&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; 
+ xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; onload=&quot;doSelection(0,0);&quot;&gt;
+  &lt;g id=&quot;test-body-content&quot;&gt;
+    &lt;defs&gt;
+        &lt;script xlink:href=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+        &lt;script&gt;
+        description('Test that the event handlers do not run during layout of SVG.');
+        window.jsTestIsAsync = true;
+
+        var startIndex = 0;
+        var numChars = 9;
+        function doSelection(indexDelta, numCharsDelta)
+        {
+                document.getElementById('text').selectSubString(startIndex+indexDelta, numChars+numCharsDelta);
+                finishJSTest();
+        }
+        &lt;/script&gt;
+    &lt;/defs&gt;
+    &lt;g transform=&quot;translate(0,60)&quot;&gt;
+        &lt;text id=&quot;text&quot; font-size=&quot;48&quot; y=&quot;128&quot; x=&quot;10&quot;&gt;
+            abc
+        &lt;/text&gt;
+        &lt;g id=&quot;buttons&quot;&gt;
+            &lt;text x=&quot;390&quot; y=&quot;175&quot; text-anchor=&quot;middle&quot; font-size=&quot;16&quot;&gt;--&lt;/text&gt; 
+        &lt;/g&gt;
+    &lt;/g&gt;
+  &lt;/g&gt;
+  &lt;text id=&quot;revision&quot; x=&quot;10&quot; y=&quot;340&quot; font-size=&quot;40&quot; stroke=&quot;none&quot; fill=&quot;black&quot;&gt;$&lt;/text&gt;
+  &lt;script&gt;
+    document.execCommand(&quot;SelectAll&quot;);
+    var x = document.fonts;
+    x.onloading = doSelection;
+  &lt;/script&gt;
+  &lt;style&gt;&lt;![CDATA[
+  @font-face {
+    font-family: 'times';
+    src: local('Lucida Grande');
+  }
+  ]]&gt;&lt;/style&gt;
+  &lt;script xlink:href=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/svg&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (176452 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-11-21 17:40:50 UTC (rev 176452)
+++ trunk/Source/WebCore/ChangeLog        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2014-11-21  Bear Travis  &lt;betravis@gmail.com&gt;
+
+        [CSS Font Loading] Switch to dispatching events asynchronously
+        https://bugs.webkit.org/show_bug.cgi?id=138755
+
+        Reviewed by Simon Fraser.
+
+        Moving FontLoader to dispatch events and notify callbacks similarly
+        to EventSender or the GenericEventQueue. Several bugs have popped
+        up in the past because FontLoader has been sending events during
+        layout, and there is no need for that to be the case.
+
+        Covered by existing font loader event tests. Added an additional
+        test for the svg case, fontloader-svg-select.
+
+        * css/FontLoader.cpp:
+        (WebCore::FontLoader::didLayout):
+        (WebCore::FontLoader::timerFired): Adding asynchronous callback.
+        (WebCore::FontLoader::scheduleEvent): Add an event to the dispatch
+        queue.
+        (WebCore::FontLoader::firePendingEvents): Modified to handle the
+        loading done event and callbacks.
+        (WebCore::FontLoader::loadingDone): Modified to spin up the timer
+        rather than immediately dispatching events.
+        * css/FontLoader.h:
+
</ins><span class="cx"> 2014-11-21  Daniel Bates  &lt;dabates@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Attempt to fix the internal Apple Mavericks build after &lt;https://trac.webkit.org/changeset/176448&gt;
</span></span></pre></div>
<a id="trunkSourceWebCorecssFontLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/FontLoader.cpp (176452 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontLoader.cpp        2014-11-21 17:40:50 UTC (rev 176452)
+++ trunk/Source/WebCore/css/FontLoader.cpp        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -122,6 +122,7 @@
</span><span class="cx">     , m_document(document)
</span><span class="cx">     , m_numLoadingFromCSS(0)
</span><span class="cx">     , m_numLoadingFromJS(0)
</span><ins>+    , m_pendingEventsTimer(this, &amp;FontLoader::pendingEventsTimerFired)
</ins><span class="cx"> {
</span><span class="cx">     suspendIfNeeded();
</span><span class="cx"> }
</span><span class="lines">@@ -152,31 +153,39 @@
</span><span class="cx"> 
</span><span class="cx"> void FontLoader::didLayout()
</span><span class="cx"> {
</span><del>-    firePendingEvents();
</del><span class="cx">     loadingDone();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FontLoader::scheduleEvent(PassRefPtr&lt;Event&gt; event)
</span><span class="cx"> {
</span><del>-    if (FrameView* view = m_document-&gt;view()) {
-        if (view-&gt;isInLayout()) {
-            m_pendingEvents.append(event);
-            return;
-        }
-    }
-    firePendingEvents();
-    dispatchEvent(event);
</del><ins>+    m_pendingEvents.append(event);
+    if (!m_pendingEventsTimer.isActive())
+        m_pendingEventsTimer.startOneShot(0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FontLoader::firePendingEvents()
</span><span class="cx"> {
</span><del>-    if (m_pendingEvents.isEmpty())
</del><ins>+    if (m_pendingEvents.isEmpty() &amp;&amp; !m_loadingDoneEvent &amp;&amp; !m_callbacks.isEmpty())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;Event&gt; &gt; pendingEvents;
</del><ins>+    Vector&lt;RefPtr&lt;Event&gt;&gt; pendingEvents;
</ins><span class="cx">     m_pendingEvents.swap(pendingEvents);
</span><ins>+
+    bool loadingDone = false;
+    if (m_loadingDoneEvent) {
+        pendingEvents.append(m_loadingDoneEvent.release());
+        loadingDone = true;
+    }
+
</ins><span class="cx">     for (size_t index = 0; index &lt; pendingEvents.size(); ++index)
</span><span class="cx">         dispatchEvent(pendingEvents[index].release());
</span><ins>+
+    if (loadingDone &amp;&amp; !m_callbacks.isEmpty()) {
+        Vector&lt;RefPtr&lt;VoidCallback&gt;&gt; callbacks;
+        m_callbacks.swap(callbacks);
+        for (size_t index = 0; index &lt; callbacks.size(); ++index)
+            callbacks[index]-&gt;handleEvent();
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FontLoader::beginFontLoading(CSSFontFaceRule* rule)
</span><span class="lines">@@ -218,7 +227,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (loading() || !m_document-&gt;haveStylesheetsLoaded())
</span><span class="cx">         return;
</span><del>-    if (!m_loadingDoneEvent &amp;&amp; m_callbacks.isEmpty())
</del><ins>+    if (!m_loadingDoneEvent &amp;&amp; m_callbacks.isEmpty() &amp;&amp; m_pendingEvents.isEmpty())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (FrameView* view = m_document-&gt;view()) {
</span><span class="lines">@@ -226,15 +235,8 @@
</span><span class="cx">             return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (m_loadingDoneEvent)
-        dispatchEvent(m_loadingDoneEvent.release());
-
-    if (!m_callbacks.isEmpty()) {
-        Vector&lt;RefPtr&lt;VoidCallback&gt; &gt; callbacks;
-        m_callbacks.swap(callbacks);
-        for (size_t index = 0; index &lt; callbacks.size(); ++index)
-            callbacks[index]-&gt;handleEvent();
-    }
</del><ins>+    if (!m_pendingEventsTimer.isActive())
+        m_pendingEventsTimer.startOneShot(0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FontLoader::loadFont(const Dictionary&amp; params)
</span></span></pre></div>
<a id="trunkSourceWebCorecssFontLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/FontLoader.h (176452 => 176453)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontLoader.h        2014-11-21 17:40:50 UTC (rev 176452)
+++ trunk/Source/WebCore/css/FontLoader.h        2014-11-21 18:43:21 UTC (rev 176453)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;ActiveDOMObject.h&quot;
</span><span class="cx"> #include &quot;EventListener.h&quot;
</span><span class="cx"> #include &quot;EventTarget.h&quot;
</span><ins>+#include &quot;Timer.h&quot;
</ins><span class="cx"> #include &quot;VoidCallback.h&quot;
</span><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="lines">@@ -94,6 +95,7 @@
</span><span class="cx">     virtual EventTargetData* eventTargetData() override;
</span><span class="cx">     virtual EventTargetData&amp; ensureEventTargetData() override;
</span><span class="cx"> 
</span><ins>+    void pendingEventsTimerFired(Timer&amp;) { firePendingEvents(); }
</ins><span class="cx">     void scheduleEvent(PassRefPtr&lt;Event&gt;);
</span><span class="cx">     void firePendingEvents();
</span><span class="cx">     bool resolveFontStyle(const String&amp;, Font&amp;);
</span><span class="lines">@@ -105,6 +107,7 @@
</span><span class="cx">     Vector&lt;RefPtr&lt;Event&gt;&gt; m_pendingEvents;
</span><span class="cx">     Vector&lt;RefPtr&lt;VoidCallback&gt;&gt; m_callbacks;
</span><span class="cx">     RefPtr&lt;Event&gt; m_loadingDoneEvent;
</span><ins>+    Timer m_pendingEventsTimer;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>