Extract UTI mapping and allow for additions
[WebKit-https.git] / Source / WebCore / css / FontFaceSet.cpp
index 189e5bd..1aaffe5 100644 (file)
 #include "FontFaceSet.h"
 
 #include "Document.h"
-#include "ExceptionCodeDescription.h"
 #include "FontFace.h"
 #include "JSDOMBinding.h"
-#include "JSDOMCoreException.h"
 #include "JSFontFace.h"
 #include "JSFontFaceSet.h"
+#include <wtf/IsoMallocInlines.h>
 
 namespace WebCore {
 
+WTF_MAKE_ISO_ALLOCATED_IMPL(FontFaceSet);
+
 Ref<FontFaceSet> FontFaceSet::create(Document& document, const Vector<RefPtr<FontFace>>& initialFaces)
 {
     Ref<FontFaceSet> result = adoptRef(*new FontFaceSet(document, initialFaces));
@@ -51,8 +52,9 @@ Ref<FontFaceSet> FontFaceSet::create(Document& document, CSSFontFaceSet& backing
 }
 
 FontFaceSet::FontFaceSet(Document& document, const Vector<RefPtr<FontFace>>& initialFaces)
-    : ActiveDOMObject(&document)
+    : ActiveDOMObject(document)
     , m_backing(CSSFontFaceSet::create())
+    , m_readyPromise(*this, &FontFaceSet::readyPromiseResolve)
 {
     m_backing->addClient(*this);
     for (auto& face : initialFaces)
@@ -60,9 +62,12 @@ FontFaceSet::FontFaceSet(Document& document, const Vector<RefPtr<FontFace>>& ini
 }
 
 FontFaceSet::FontFaceSet(Document& document, CSSFontFaceSet& backing)
-    : ActiveDOMObject(&document)
+    : ActiveDOMObject(document)
     , m_backing(backing)
+    , m_readyPromise(*this, &FontFaceSet::readyPromiseResolve)
 {
+    if (!backing.hasActiveFontFaces())
+        m_readyPromise.resolve(*this);
     m_backing->addClient(*this);
 }
 
@@ -88,9 +93,7 @@ FontFaceSet::PendingPromise::PendingPromise(LoadPromise&& promise)
 {
 }
 
-FontFaceSet::PendingPromise::~PendingPromise()
-{
-}
+FontFaceSet::PendingPromise::~PendingPromise() = default;
 
 bool FontFaceSet::has(FontFace& face) const
 {
@@ -125,15 +128,15 @@ void FontFaceSet::clear()
 
 void FontFaceSet::load(const String& font, const String& text, LoadPromise&& promise)
 {
-    ExceptionCode ec = 0;
-    auto matchingFaces = m_backing->matchingFaces(font, text, ec);
-    if (ec) {
-        promise.reject(ec);
+    auto matchingFacesResult = m_backing->matchingFacesExcludingPreinstalledFonts(font, text);
+    if (matchingFacesResult.hasException()) {
+        promise.reject(matchingFacesResult.releaseException());
         return;
     }
+    auto matchingFaces = matchingFacesResult.releaseReturnValue();
 
     if (matchingFaces.isEmpty()) {
-        promise.resolve(Vector<RefPtr<FontFace>>());
+        promise.resolve({ });
         return;
     }
 
@@ -142,7 +145,7 @@ void FontFaceSet::load(const String& font, const String& text, LoadPromise&& pro
 
     for (auto& face : matchingFaces) {
         if (face.get().status() == CSSFontFace::Status::Failure) {
-            promise.reject(DOMCoreException::create(ExceptionCodeDescription(NETWORK_ERR)));
+            promise.reject(NetworkError);
             return;
         }
     }
@@ -155,26 +158,17 @@ void FontFaceSet::load(const String& font, const String& text, LoadPromise&& pro
         if (face.get().status() == CSSFontFace::Status::Success)
             continue;
         waiting = true;
-        m_pendingPromises.add(&face.get(), Vector<Ref<PendingPromise>>()).iterator->value.append(pendingPromise.copyRef());
+        ASSERT(face.get().existingWrapper());
+        m_pendingPromises.add(face.get().existingWrapper(), Vector<Ref<PendingPromise>>()).iterator->value.append(pendingPromise.copyRef());
     }
 
     if (!waiting)
         pendingPromise->promise.resolve(pendingPromise->faces);
 }
 
-bool FontFaceSet::check(const String& family, const String& text, ExceptionCode& ec)
+ExceptionOr<bool> FontFaceSet::check(const String& family, const String& text)
 {
-    return m_backing->check(family, text, ec);
-}
-
-void FontFaceSet::registerReady(ReadyPromise&& promise)
-{
-    ASSERT(!m_promise);
-    if (m_isReady) {
-        promise.resolve(*this);
-        return;
-    }
-    m_promise = WTFMove(promise);
+    return m_backing->check(family, text);
 }
     
 auto FontFaceSet::status() const -> LoadStatus
@@ -197,18 +191,20 @@ bool FontFaceSet::canSuspendForDocumentSuspension() const
 void FontFaceSet::startedLoading()
 {
     // FIXME: Fire a "loading" event asynchronously.
+    m_readyPromise.clear();
 }
 
 void FontFaceSet::completedLoading()
 {
-    if (m_promise)
-        std::exchange(m_promise, Nullopt)->resolve(*this);
-    m_isReady = true;
+    m_readyPromise.resolve(*this);
 }
 
 void FontFaceSet::faceFinished(CSSFontFace& face, CSSFontFace::Status newStatus)
 {
-    auto iterator = m_pendingPromises.find(&face);
+    if (!face.existingWrapper())
+        return;
+
+    auto iterator = m_pendingPromises.find(face.existingWrapper());
     if (iterator == m_pendingPromises.end())
         return;
 
@@ -222,7 +218,7 @@ void FontFaceSet::faceFinished(CSSFontFace& face, CSSFontFace::Status newStatus)
             }
         } else {
             ASSERT(newStatus == CSSFontFace::Status::Failure);
-            pendingPromise->promise.reject(DOMCoreException::create(ExceptionCodeDescription(NETWORK_ERR)));
+            pendingPromise->promise.reject(NetworkError);
             pendingPromise->hasReachedTerminalState = true;
         }
     }
@@ -230,4 +226,9 @@ void FontFaceSet::faceFinished(CSSFontFace& face, CSSFontFace::Status newStatus)
     m_pendingPromises.remove(iterator);
 }
 
+FontFaceSet& FontFaceSet::readyPromiseResolve()
+{
+    return *this;
+}
+
 }