#ifndef CSSSegmentedFontFace_h
#define CSSSegmentedFontFace_h
-#include "platform/fonts/FontTraitsMask.h"
+#include "platform/fonts/FontTraits.h"
+#include "platform/heap/Handle.h"
#include "wtf/HashMap.h"
+#include "wtf/ListHashSet.h"
#include "wtf/PassRefPtr.h"
#include "wtf/RefCounted.h"
#include "wtf/Vector.h"
#include "wtf/text/WTFString.h"
-namespace WebCore {
+namespace blink {
class CSSFontFace;
class CSSFontSelector;
class FontFace;
class SegmentedFontData;
-class CSSSegmentedFontFace : public RefCounted<CSSSegmentedFontFace> {
+class CSSSegmentedFontFace final : public RefCountedWillBeGarbageCollectedFinalized<CSSSegmentedFontFace> {
public:
- static PassRefPtr<CSSSegmentedFontFace> create(CSSFontSelector* selector, FontTraitsMask traitsMask, bool isLocalFallback) { return adoptRef(new CSSSegmentedFontFace(selector, traitsMask, isLocalFallback)); }
+ static PassRefPtrWillBeRawPtr<CSSSegmentedFontFace> create(CSSFontSelector* selector, FontTraits traits)
+ {
+ return adoptRefWillBeNoop(new CSSSegmentedFontFace(selector, traits));
+ }
~CSSSegmentedFontFace();
CSSFontSelector* fontSelector() const { return m_fontSelector; }
- FontTraitsMask traitsMask() const { return m_traitsMask; }
- bool isLocalFallback() const { return m_isLocalFallback; }
+ FontTraits traits() const { return m_traits; }
void fontLoaded(CSSFontFace*);
+ void fontLoadWaitLimitExceeded(CSSFontFace*);
- void appendFontFace(PassRefPtr<CSSFontFace>);
+ void addFontFace(PassRefPtrWillBeRawPtr<FontFace>, bool cssConnected);
+ void removeFontFace(PassRefPtrWillBeRawPtr<FontFace>);
+ bool isEmpty() const { return m_fontFaces.isEmpty(); }
PassRefPtr<FontData> getFontData(const FontDescription&);
- class LoadFontCallback : public RefCounted<LoadFontCallback> {
- public:
- virtual ~LoadFontCallback() { }
- virtual void notifyLoaded(CSSSegmentedFontFace*) = 0;
- virtual void notifyError(CSSSegmentedFontFace*) = 0;
- };
-
bool checkFont(const String&) const;
- void loadFont(const FontDescription&, const String&, PassRefPtr<LoadFontCallback>);
- Vector<RefPtr<FontFace> > fontFaces(const String& text) const;
- void willUseFontData(const FontDescription&);
+ void match(const String&, WillBeHeapVector<RefPtrWillBeMember<FontFace> >&) const;
+ void willUseFontData(const FontDescription&, UChar32);
+
+ void trace(Visitor*);
private:
- CSSSegmentedFontFace(CSSFontSelector*, FontTraitsMask, bool isLocalFallback);
+ CSSSegmentedFontFace(CSSFontSelector*, FontTraits);
void pruneTable();
bool isValid() const;
bool isLoading() const;
bool isLoaded() const;
- CSSFontSelector* m_fontSelector;
- FontTraitsMask m_traitsMask;
- bool m_isLocalFallback;
+ typedef WillBeHeapListHashSet<RefPtrWillBeMember<FontFace> > FontFaceList;
+
+ RawPtrWillBeMember<CSSFontSelector> m_fontSelector;
+ FontTraits m_traits;
HashMap<unsigned, RefPtr<SegmentedFontData> > m_fontDataTable;
- Vector<RefPtr<CSSFontFace>, 1> m_fontFaces;
- Vector<RefPtr<LoadFontCallback> > m_callbacks;
+ // All non-CSS-connected FontFaces are stored after the CSS-connected ones.
+ FontFaceList m_fontFaces;
+ FontFaceList::iterator m_firstNonCssConnectedFace;
};
-} // namespace WebCore
+} // namespace blink
#endif // CSSSegmentedFontFace_h