Next step on dictionary bindings, along with other bindings refinements
[WebKit-https.git] / Source / WebCore / css / CSSFontFace.h
1 /*
2  * Copyright (C) 2007, 2008, 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 "CSSFontFaceRule.h"
29 #include "FontFeatureSettings.h"
30 #include "TextFlags.h"
31 #include <memory>
32 #include <wtf/Forward.h>
33 #include <wtf/HashSet.h>
34 #include <wtf/PassRefPtr.h>
35 #include <wtf/RefCounted.h>
36 #include <wtf/Vector.h>
37 #include <wtf/WeakPtr.h>
38
39 namespace JSC {
40 class ExecState;
41 }
42
43 namespace WebCore {
44
45 class CSSFontFaceSource;
46 class CSSFontSelector;
47 class CSSSegmentedFontFace;
48 class CSSValue;
49 class CSSValueList;
50 class Document;
51 class FontDescription;
52 class Font;
53 class FontFace;
54
55 class CSSFontFace final : public RefCounted<CSSFontFace> {
56 public:
57     static Ref<CSSFontFace> create(CSSFontSelector* fontSelector, StyleRuleFontFace* cssConnection = nullptr, FontFace* wrapper = nullptr, bool isLocalFallback = false)
58     {
59         return adoptRef(*new CSSFontFace(fontSelector, cssConnection, wrapper, isLocalFallback));
60     }
61     virtual ~CSSFontFace();
62
63     // FIXME: These functions don't need to have boolean return values.
64     // Callers only call this with known-valid CSS values.
65     bool setFamilies(CSSValue&);
66     bool setStyle(CSSValue&);
67     bool setWeight(CSSValue&);
68     bool setUnicodeRange(CSSValue&);
69     bool setVariantLigatures(CSSValue&);
70     bool setVariantPosition(CSSValue&);
71     bool setVariantCaps(CSSValue&);
72     bool setVariantNumeric(CSSValue&);
73     bool setVariantAlternates(CSSValue&);
74     bool setVariantEastAsian(CSSValue&);
75     void setFeatureSettings(CSSValue&);
76
77     enum class Status;
78     struct UnicodeRange;
79     const CSSValueList* families() const { return m_families.get(); }
80     FontTraitsMask traitsMask() const { return m_traitsMask; }
81     const Vector<UnicodeRange>& ranges() const { return m_ranges; }
82     const FontFeatureSettings& featureSettings() const { return m_featureSettings; }
83     const FontVariantSettings& variantSettings() const { return m_variantSettings; }
84     void setVariantSettings(const FontVariantSettings& variantSettings) { m_variantSettings = variantSettings; }
85     void setTraitsMask(FontTraitsMask traitsMask) { m_traitsMask = traitsMask; }
86     bool isLocalFallback() const { return m_isLocalFallback; }
87     Status status() const { return m_status; }
88     StyleRuleFontFace* cssConnection() const { return m_cssConnection.get(); }
89
90     static Optional<FontTraitsMask> calculateStyleMask(CSSValue& style);
91     static Optional<FontTraitsMask> calculateWeightMask(CSSValue& weight);
92
93     class Client;
94     void addClient(Client&);
95     void removeClient(Client&);
96
97     bool allSourcesFailed() const;
98
99     void adoptSource(std::unique_ptr<CSSFontFaceSource>&&);
100     void sourcesPopulated() { m_sourcesPopulated = true; }
101
102     void fontLoaded(CSSFontFaceSource&);
103
104     void load();
105     RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic);
106
107     static void appendSources(CSSFontFace&, CSSValueList&, Document*, bool isInitiatingElementInUserAgentShadowTree);
108
109     class Client {
110     public:
111         virtual ~Client() { }
112         virtual void fontLoaded(CSSFontFace&) { }
113         virtual void fontStateChanged(CSSFontFace&, Status /*oldState*/, Status /*newState*/) { }
114         virtual void fontPropertyChanged(CSSFontFace&, CSSValueList* /*oldFamilies*/ = nullptr) { }
115         virtual void ref() = 0;
116         virtual void deref() = 0;
117     };
118
119     // Pending => Loading  => TimedOut
120     //              ||  \\    //  ||
121     //              ||   \\  //   ||
122     //              ||    \\//    ||
123     //              ||     //     ||
124     //              ||    //\\    ||
125     //              ||   //  \\   ||
126     //              \/  \/    \/  \/
127     //             Success    Failure
128     enum class Status { Pending, Loading, TimedOut, Success, Failure };
129
130     struct UnicodeRange {
131         UChar32 from;
132         UChar32 to;
133     };
134
135     // We don't guarantee that the FontFace wrapper will be the same every time you ask for it.
136     Ref<FontFace> wrapper();
137
138 #if ENABLE(SVG_FONTS)
139     bool hasSVGFontFaceSource() const;
140 #endif
141
142 private:
143     CSSFontFace(CSSFontSelector*, StyleRuleFontFace*, FontFace*, bool isLocalFallback);
144
145     size_t pump();
146     void setStatus(Status);
147     void notifyClientsOfFontPropertyChange();
148
149     RefPtr<CSSValueList> m_families;
150     FontTraitsMask m_traitsMask { static_cast<FontTraitsMask>(FontStyleNormalMask | FontWeight400Mask) };
151     Vector<UnicodeRange> m_ranges;
152     FontFeatureSettings m_featureSettings;
153     FontVariantSettings m_variantSettings;
154     Vector<std::unique_ptr<CSSFontFaceSource>> m_sources;
155     RefPtr<CSSFontSelector> m_fontSelector;
156     RefPtr<StyleRuleFontFace> m_cssConnection;
157     HashSet<Client*> m_clients;
158     WeakPtr<FontFace> m_wrapper;
159     Status m_status { Status::Pending };
160     bool m_isLocalFallback { false };
161     bool m_sourcesPopulated { false };
162 };
163
164 }