1/* 2 * Copyright (C) 2013 Google 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 are met: 6 * 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. AND ITS CONTRIBUTORS ``AS IS'' AND 14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE 17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 23 * DAMAGE. 24 */ 25 26#if ENABLE(FONT_LOAD_EVENTS) 27 28#ifndef FontLoader_h 29#define FontLoader_h 30 31#include "ActiveDOMObject.h" 32#include "EventListener.h" 33#include "EventNames.h" 34#include "EventTarget.h" 35#include "VoidCallback.h" 36#include <wtf/PassRefPtr.h> 37#include <wtf/RefCounted.h> 38#include <wtf/Vector.h> 39 40namespace WebCore { 41 42class CachedFont; 43class CSSFontFaceRule; 44class CSSFontFaceSource; 45class Dictionary; 46class Document; 47class Event; 48class Font; 49class ScriptExecutionContext; 50 51class FontLoader : public RefCounted<FontLoader>, public ActiveDOMObject, public EventTarget { 52public: 53 static PassRefPtr<FontLoader> create(Document* document) 54 { 55 return adoptRef<FontLoader>(new FontLoader(document)); 56 } 57 virtual ~FontLoader(); 58 59 DEFINE_ATTRIBUTE_EVENT_LISTENER(loading); 60 DEFINE_ATTRIBUTE_EVENT_LISTENER(loadingdone); 61 DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart); 62 DEFINE_ATTRIBUTE_EVENT_LISTENER(load); 63 DEFINE_ATTRIBUTE_EVENT_LISTENER(error); 64 65 bool checkFont(const String&, const String&); 66 void loadFont(const Dictionary&); 67 void notifyWhenFontsReady(PassRefPtr<VoidCallback>); 68 69 bool loading() const { return m_loadingCount > 0; } 70 71 virtual ScriptExecutionContext* scriptExecutionContext() const; 72 virtual const AtomicString& interfaceName() const; 73 74 using RefCounted<FontLoader>::ref; 75 using RefCounted<FontLoader>::deref; 76 77 Document* document() const { return m_document; } 78 79 void didLayout(); 80 void beginFontLoading(CSSFontFaceRule*); 81 void fontLoaded(CSSFontFaceRule*); 82 void loadError(CSSFontFaceRule*, CSSFontFaceSource*); 83 void loadingDone(); 84 85private: 86 FontLoader(Document*); 87 88 virtual void refEventTarget() { ref(); } 89 virtual void derefEventTarget() { deref(); } 90 virtual EventTargetData* eventTargetData(); 91 virtual EventTargetData* ensureEventTargetData(); 92 93 void scheduleEvent(PassRefPtr<Event>); 94 void firePendingEvents(); 95 bool resolveFontStyle(const String&, Font&); 96 97 Document* m_document; 98 EventTargetData m_eventTargetData; 99 unsigned m_loadingCount; 100 Vector<RefPtr<Event> > m_pendingEvents; 101 Vector<RefPtr<VoidCallback> > m_callbacks; 102 RefPtr<Event> m_loadingDoneEvent; 103}; 104 105} // namespace WebCore 106 107#endif // FontLoader_h 108#endif // ENABLE(FONT_LOAD_EVENTS) 109