#ifndef FontFace_h
#define FontFace_h
#include "CSSPropertyNames.h"
#include "bindings/v8/ScriptPromise.h"
#include "core/css/CSSValue.h"
#include "core/dom/DOMError.h"
#include "platform/fonts/FontTraits.h"
#include "wtf/PassRefPtr.h"
#include "wtf/RefCounted.h"
#include "wtf/text/WTFString.h"
namespace WebCore {
class CSSFontFace;
class CSSValueList;
class Dictionary;
class Document;
class ExceptionState;
class FontFaceReadyPromiseResolver;
class StylePropertySet;
class StyleRuleFontFace;
class FontFace : public RefCountedWillBeRefCountedGarbageCollected<FontFace> {
public:
enum LoadStatus { Unloaded, Loading, Loaded, Error };
static PassRefPtr<FontFace> create(ExecutionContext*, const AtomicString& family, PassRefPtr<ArrayBuffer> source, const Dictionary&, ExceptionState&);
static PassRefPtr<FontFace> create(ExecutionContext*, const AtomicString& family, PassRefPtr<ArrayBufferView>, const Dictionary&, ExceptionState&);
static PassRefPtr<FontFace> create(ExecutionContext*, const AtomicString& family, const String& source, const Dictionary&, ExceptionState&);
static PassRefPtr<FontFace> create(Document*, const StyleRuleFontFace*);
~FontFace();
const AtomicString& family() const { return m_family; }
String style() const;
String weight() const;
String stretch() const;
String unicodeRange() const;
String variant() const;
String featureSettings() const;
void setFamily(ExecutionContext*, const AtomicString& s, ExceptionState&) { m_family = s; }
void setStyle(ExecutionContext*, const String&, ExceptionState&);
void setWeight(ExecutionContext*, const String&, ExceptionState&);
void setStretch(ExecutionContext*, const String&, ExceptionState&);
void setUnicodeRange(ExecutionContext*, const String&, ExceptionState&);
void setVariant(ExecutionContext*, const String&, ExceptionState&);
void setFeatureSettings(ExecutionContext*, const String&, ExceptionState&);
String status() const;
ScriptPromise load(ExecutionContext*);
LoadStatus loadStatus() const { return m_status; }
void setLoadStatus(LoadStatus);
DOMError* error() const { return m_error.get(); }
FontTraits traits() const;
CSSFontFace* cssFontFace() { return m_cssFontFace.get(); }
void trace(Visitor*);
bool hadBlankText() const;
class LoadFontCallback : public RefCounted<LoadFontCallback> {
public:
virtual ~LoadFontCallback() { }
virtual void notifyLoaded(FontFace*) = 0;
virtual void notifyError(FontFace*) = 0;
};
void loadWithCallback(PassRefPtr<LoadFontCallback>, ExecutionContext*);
private:
FontFace();
void initCSSFontFace(Document*, PassRefPtrWillBeRawPtr<CSSValue> src);
void initCSSFontFace(const unsigned char* data, unsigned size);
void setPropertyFromString(const Document*, const String&, CSSPropertyID, ExceptionState&);
bool setPropertyFromStyle(const StylePropertySet&, CSSPropertyID);
bool setPropertyValue(PassRefPtrWillBeRawPtr<CSSValue>, CSSPropertyID);
bool setFamilyValue(CSSValueList*);
void resolveReadyPromises();
void loadInternal(ExecutionContext*);
AtomicString m_family;
RefPtrWillBeMember<CSSValue> m_src;
RefPtrWillBeMember<CSSValue> m_style;
RefPtrWillBeMember<CSSValue> m_weight;
RefPtrWillBeMember<CSSValue> m_stretch;
RefPtrWillBeMember<CSSValue> m_unicodeRange;
RefPtrWillBeMember<CSSValue> m_variant;
RefPtrWillBeMember<CSSValue> m_featureSettings;
LoadStatus m_status;
RefPtrWillBeMember<DOMError> m_error;
Vector<OwnPtr<FontFaceReadyPromiseResolver> > m_readyResolvers;
OwnPtr<CSSFontFace> m_cssFontFace;
Vector<RefPtr<LoadFontCallback> > m_callbacks;
};
typedef Vector<RefPtr<FontFace> > FontFaceArray;
}
#endif