Merge from Chromium at DEPS revision 273901

This commit was generated by merge_to_master.py.

Change-Id: Idef4504912b9dc019659369f57e1623ca2a481a8
diff --git a/Source/core/css/FontLoader.cpp b/Source/core/css/FontLoader.cpp
new file mode 100644
index 0000000..20528ea
--- /dev/null
+++ b/Source/core/css/FontLoader.cpp
@@ -0,0 +1,85 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "config.h"
+#include "core/css/FontLoader.h"
+
+#include "core/fetch/FontResource.h"
+#include "core/fetch/ResourceFetcher.h"
+
+namespace WebCore {
+
+FontLoader::FontLoader(ResourceFetcher* resourceFetcher)
+    : m_beginLoadingTimer(this, &FontLoader::beginLoadTimerFired)
+    , m_resourceFetcher(resourceFetcher)
+{
+}
+
+FontLoader::~FontLoader()
+{
+#if ENABLE(OILPAN)
+    if (!m_resourceFetcher) {
+        ASSERT(m_fontsToBeginLoading.isEmpty());
+        return;
+    }
+    m_beginLoadingTimer.stop();
+
+    // When the m_fontsToBeginLoading vector is destroyed it will decrement the
+    // request counts on the ResourceFetcher for all the fonts that were pending
+    // at the time the FontLoader dies.
+#endif
+}
+
+void FontLoader::addFontToBeginLoading(FontResource* fontResource)
+{
+    if (!m_resourceFetcher || !fontResource->stillNeedsLoad())
+        return;
+
+    m_fontsToBeginLoading.append(
+        std::make_pair(fontResource, ResourceLoader::RequestCountTracker(m_resourceFetcher, fontResource)));
+    if (!m_beginLoadingTimer.isActive())
+        m_beginLoadingTimer.startOneShot(0, FROM_HERE);
+}
+
+void FontLoader::beginLoadTimerFired(Timer<WebCore::FontLoader>*)
+{
+    loadPendingFonts();
+}
+
+void FontLoader::loadPendingFonts()
+{
+    ASSERT(m_resourceFetcher);
+
+    FontsToLoadVector fontsToBeginLoading;
+    fontsToBeginLoading.swap(m_fontsToBeginLoading);
+    for (FontsToLoadVector::iterator it = fontsToBeginLoading.begin(); it != fontsToBeginLoading.end(); ++it) {
+        FontResource* fontResource = it->first.get();
+        fontResource->beginLoadIfNeeded(m_resourceFetcher);
+    }
+
+    // When the local fontsToBeginLoading vector goes out of scope it will
+    // decrement the request counts on the ResourceFetcher for all the fonts
+    // that were just loaded.
+}
+
+#if !ENABLE(OILPAN)
+void FontLoader::clearResourceFetcher()
+{
+    if (!m_resourceFetcher) {
+        ASSERT(m_fontsToBeginLoading.isEmpty());
+        return;
+    }
+
+    m_beginLoadingTimer.stop();
+    m_fontsToBeginLoading.clear();
+    m_resourceFetcher = nullptr;
+}
+#endif
+
+void FontLoader::trace(Visitor* visitor)
+{
+    visitor->trace(m_resourceFetcher);
+}
+
+} // namespace WebCore