Clean up some includes to make the build a bit faster: DOMPromise
[WebKit-https.git] / Source / WebCore / css / FontFaceSet.h
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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.
24  */
25
26 #pragma once
27
28 #include "ActiveDOMObject.h"
29 #include "CSSFontFaceSet.h"
30 #include "EventTarget.h"
31 #include "SuspendableTaskQueue.h"
32
33 namespace WebCore {
34
35 template<typename IDLType> class DOMPromiseDeferred;
36 template<typename IDLType> class DOMPromiseProxyWithResolveCallback;
37
38 class DOMException;
39
40 class FontFaceSet final : public RefCounted<FontFaceSet>, private CSSFontFaceSetClient, public EventTargetWithInlineData, private  ActiveDOMObject {
41     WTF_MAKE_ISO_ALLOCATED(FontFaceSet);
42 public:
43     static Ref<FontFaceSet> create(Document&, const Vector<RefPtr<FontFace>>& initialFaces);
44     static Ref<FontFaceSet> create(Document&, CSSFontFaceSet& backing);
45     virtual ~FontFaceSet();
46
47     bool has(FontFace&) const;
48     size_t size() const;
49     FontFaceSet& add(FontFace&);
50     bool remove(FontFace&);
51     void clear();
52
53     using LoadPromise = DOMPromiseDeferred<IDLSequence<IDLInterface<FontFace>>>;
54     void load(const String& font, const String& text, LoadPromise&&);
55     ExceptionOr<bool> check(const String& font, const String& text);
56
57     enum class LoadStatus { Loading, Loaded };
58     LoadStatus status() const;
59
60     using ReadyPromise = DOMPromiseProxyWithResolveCallback<IDLInterface<FontFaceSet>>;
61     ReadyPromise& ready() { return m_readyPromise.get(); }
62     void didFirstLayout();
63
64     CSSFontFaceSet& backing() { return m_backing; }
65
66     class Iterator {
67     public:
68         explicit Iterator(FontFaceSet&);
69         RefPtr<FontFace> next();
70
71     private:
72         Ref<FontFaceSet> m_target;
73         size_t m_index { 0 }; // FIXME: There needs to be a mechanism to handle when fonts are added or removed from the middle of the FontFaceSet.
74     };
75     Iterator createIterator() { return Iterator(*this); }
76
77     using RefCounted::ref;
78     using RefCounted::deref;
79
80 private:
81     struct PendingPromise : RefCounted<PendingPromise> {
82         static Ref<PendingPromise> create(LoadPromise&& promise)
83         {
84             return adoptRef(*new PendingPromise(WTFMove(promise)));
85         }
86         ~PendingPromise();
87
88     private:
89         PendingPromise(LoadPromise&&);
90
91     public:
92         Vector<Ref<FontFace>> faces;
93         UniqueRef<LoadPromise> promise;
94         bool hasReachedTerminalState { false };
95     };
96
97     FontFaceSet(Document&, const Vector<RefPtr<FontFace>>&);
98     FontFaceSet(Document&, CSSFontFaceSet&);
99
100     // CSSFontFaceSetClient
101     void startedLoading() final;
102     void completedLoading() final;
103     void faceFinished(CSSFontFace&, CSSFontFace::Status) final;
104
105     // ActiveDOMObject
106     const char* activeDOMObjectName() const final { return "FontFaceSet"; }
107     bool canSuspendForDocumentSuspension() const final;
108
109     // EventTarget
110     EventTargetInterface eventTargetInterface() const final { return FontFaceSetEventTargetInterfaceType; }
111     ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
112     void refEventTarget() final { ref(); }
113     void derefEventTarget() final { deref(); }
114
115     // Callback for ReadyPromise.
116     FontFaceSet& readyPromiseResolve();
117
118     Ref<CSSFontFaceSet> m_backing;
119     HashMap<RefPtr<FontFace>, Vector<Ref<PendingPromise>>> m_pendingPromises;
120     UniqueRef<ReadyPromise> m_readyPromise;
121     UniqueRef<SuspendableTaskQueue> m_taskQueue;
122     bool m_isFirstLayoutDone { true };
123 };
124
125 }