2 * Copyright (C) 2016 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include "ActiveDOMObject.h"
30 #include "CSSFontFaceSet.h"
31 #include "DOMCoreException.h"
32 #include "EventTarget.h"
33 #include "JSDOMPromise.h"
34 #include <wtf/Optional.h>
36 #include <wtf/RefCounted.h>
37 #include <wtf/RefPtr.h>
38 #include <wtf/Vector.h>
39 #include <wtf/text/WTFString.h>
46 class FontFaceSet final : public RefCounted<FontFaceSet>, public CSSFontFaceSetClient, public EventTargetWithInlineData, public ActiveDOMObject {
48 static Ref<FontFaceSet> create(JSC::ExecState& execState, Document& document, const Vector<RefPtr<FontFace>>& initialFaces)
50 Ref<FontFaceSet> result = adoptRef(*new FontFaceSet(execState, document, initialFaces));
51 result->suspendIfNeeded();
54 virtual ~FontFaceSet();
56 bool has(FontFace*) const;
58 FontFaceSet& add(FontFace*);
59 bool remove(FontFace*);
62 void load(const String& font, DeferredWrapper&& promise, ExceptionCode& ec) { load(font, String(" ", String::ConstructFromLiteral), WTFMove(promise), ec); }
63 void load(const String& font, const String& text, DeferredWrapper&& promise, ExceptionCode&);
64 bool check(const String& font, ExceptionCode& ec) { return check(font, String(" ", String::ConstructFromLiteral), ec); }
65 bool check(const String& font, const String& text, ExceptionCode&);
67 String status() const;
69 typedef DOMPromise<FontFaceSet&, DOMCoreException&> Promise;
70 Promise& promise(JSC::ExecState&);
74 explicit Iterator(FontFaceSet&);
75 bool next(FontFace*& nextKey, FontFace*& nextValue);
78 Ref<FontFaceSet> m_target;
81 Iterator createIterator() { return Iterator(*this); }
83 using RefCounted<FontFaceSet>::ref;
84 using RefCounted<FontFaceSet>::deref;
87 struct PendingPromise : public RefCounted<PendingPromise> {
88 typedef DOMPromise<Vector<RefPtr<FontFace>>&, DOMCoreException&> Promise;
89 static Ref<PendingPromise> create(Promise&& promise)
91 return adoptRef(*new PendingPromise(WTFMove(promise)));
96 PendingPromise(Promise&&);
99 Vector<RefPtr<FontFace>> faces;
103 FontFaceSet(JSC::ExecState&, Document&, const Vector<RefPtr<FontFace>>&);
105 void fulfillPromise();
107 // CSSFontFaceSetClient
108 virtual void startedLoading() override;
109 virtual void completedLoading() override;
110 virtual void faceFinished(CSSFontFace&, CSSFontFace::Status) override;
113 virtual const char* activeDOMObjectName() const override { return "FontFaceSet"; }
114 virtual bool canSuspendForDocumentSuspension() const override;
117 virtual EventTargetInterface eventTargetInterface() const override { return FontFaceSetEventTargetInterfaceType; }
118 virtual ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
119 virtual void refEventTarget() override { ref(); }
120 virtual void derefEventTarget() override { deref(); }
122 CSSFontFaceSet m_backing;
123 HashMap<RefPtr<FontFace>, Vector<Ref<PendingPromise>>> m_pendingPromises;
124 Optional<Promise> m_promise;