Implement FontLoader interface
https://bugs.webkit.org/show_bug.cgi?id=98395

Patch by Kunihiko Sakamoto <ksakamoto@chromium.org> on 2013-03-13
Reviewed by Eric Seidel.

Source/WebCore:

This patch implements the FontLoader interface defined in CSS Font
Load Events Module Level 3.[1] It adds fontloader attribute to
Document, and adds two interfaces, FontLoader and
CSSFontFaceLoadEvent to WebCore.

[1]: http://dev.w3.org/csswg/css-font-load-events-3/

This feature is guarded by FONT_LOAD_EVENTS compiler flag and
RuntimeEnabledFeatures::fontLoadEventsEnabled() runtime flag.

Tests: fast/css/fontloader-download-error.html
       fast/css/fontloader-events.html
       fast/css/fontloader-loadingdone.html
       fast/css/fontloader-multiple-faces-download-error.html
       fast/css/fontloader-multiple-faces.html
       fast/css/fontloader-multiple-families.html
       http/tests/webfont/fontloader-loading-attribute.html

* CMakeLists.txt: Adding FontLoader/CSSFontFaceLoadEvent files.
* DerivedSources.cpp: Ditto.
* DerivedSources.make: Ditto.
* DerivedSources.pri: Ditto.
* GNUmakefile.list.am: Ditto.
* Target.pri: Ditto.
* WebCore.gypi: Ditto.
* WebCore.vcproj/WebCore.vcproj: Ditto.
* WebCore.vcxproj/WebCore.vcxproj: Ditto.
* WebCore.vcxproj/WebCore.vcxproj.filters: Ditto.
* WebCore.xcodeproj/project.pbxproj: Ditto.
* bindings/js/JSDictionary.cpp:
(WebCore::JSDictionary::convertValue): Add convertValue() for CSSFontFaceRule, DOMError, and VoidCallback.
* bindings/js/JSDictionary.h: Ditto.
* bindings/v8/Dictionary.cpp: Add get() for CSSFontFaceRule, DOMError, and VoidCallback.
(WebCore::Dictionary::get):
* bindings/v8/Dictionary.h: Ditto.
(Dictionary):
* css/CSSFontFace.cpp: Notifies FontLoader as load progresses.
(WebCore::CSSFontFace::fontLoaded):
(WebCore::CSSFontFace::getFontData):
(WebCore::CSSFontFace::notifyFontLoader):
(WebCore::CSSFontFace::notifyLoadingDone):
* css/CSSFontFace.h: Add two member variables. m_rule stores CSSFontFaceRule for the fontface. m_loadState holds current state of the fontface in terms of FontLoader.
(WebCore::CSSFontFace::create): Takes additional parameter of type CSSFontFaceRule.
(WebCore::CSSFontFace::loadState):
(WebCore::CSSFontFace::CSSFontFace):
* css/CSSFontFaceLoadEvent.cpp: Added.
(WebCore::CSSFontFaceLoadEvent::CSSFontFaceLoadEvent):
(WebCore::CSSFontFaceLoadEvent::~CSSFontFaceLoadEvent):
(WebCore::CSSFontFaceLoadEvent::interfaceName):
* css/CSSFontFaceLoadEvent.h: Added.
(CSSFontFaceLoadEventInit):
(CSSFontFaceLoadEvent):
(WebCore::CSSFontFaceLoadEvent::create):
(WebCore::CSSFontFaceLoadEvent::createForFontFaceRule):
(WebCore::CSSFontFaceLoadEvent::createForError):
(WebCore::CSSFontFaceLoadEvent::fontface):
(WebCore::CSSFontFaceLoadEvent::error):
* css/CSSFontFaceLoadEvent.idl: Added.
* css/CSSFontFaceRule.idl: Add JSGenerateToJSObject and JSGenerateToNativeObject as JSC binding needs them.
* css/CSSFontFaceSource.cpp:
(WebCore::CSSFontFaceSource::isDecodeError): Added.
(WebCore::CSSFontFaceSource::ensureFontData): Added.
* css/CSSFontFaceSource.h:
(CSSFontFaceSource):
* css/CSSFontSelector.cpp:
(WebCore::CSSFontSelector::addFontFaceRule): Pass a CSSFontFaceRule to CSSFontFace::create().
(WebCore::CSSFontSelector::getFontData): Moved logic for creating a CSSSegmentedFontFace to a helper function getFontFace().
(WebCore::CSSFontSelector::getFontFace): Added.
* css/CSSFontSelector.h:
* css/CSSSegmentedFontFace.cpp:
(WebCore::CSSSegmentedFontFace::fontLoaded): Fires callbacks when load is completed.
(WebCore::CSSSegmentedFontFace::isLoading): Returns true if any fonts are still loading.
(WebCore::CSSSegmentedFontFace::checkFont): Returns true if all fonts are loaded.
(WebCore::CSSSegmentedFontFace::loadFont): Starts load by calling getFontData().
* css/CSSSegmentedFontFace.h:
(CSSSegmentedFontFace): Declares new functions and a vector to store callbacks.
(LoadFontCallback):
(WebCore::CSSSegmentedFontFace::LoadFontCallback::~LoadFontCallback):
* css/FontLoader.cpp: Added.
(LoadFontCallback): Holds callback functions of FontLoader.loadFont().
(WebCore::LoadFontCallback::create):
(WebCore::LoadFontCallback::createFromParams):
(WebCore::LoadFontCallback::LoadFontCallback):
(WebCore::LoadFontCallback::notifyLoaded):
(WebCore::LoadFontCallback::notifyError):
(WebCore::FontLoader::FontLoader):
(WebCore::FontLoader::~FontLoader):
(WebCore::FontLoader::eventTargetData):
(WebCore::FontLoader::ensureEventTargetData):
(WebCore::FontLoader::interfaceName):
(WebCore::FontLoader::scriptExecutionContext):
(WebCore::FontLoader::didLayout): Fires pending events and callbacks. This is called when layout have completed.
(WebCore::FontLoader::scheduleEvent): Defers event dispatching until layout completes.
(WebCore::FontLoader::firePendingEvents): Dispatches pending events.
(WebCore::FontLoader::beginFontLoading): Schedules loading/loadstart events. This is called from CSSFontFace.
(WebCore::FontLoader::fontLoaded): Schedules load/loadingdone events. This is called from CSSFontFace.
(WebCore::FontLoader::loadError): Schedules error/loadingdone events. This is called from CSSFontFace.
(WebCore::FontLoader::notifyWhenFontsReady): Implements fontloader.notifyWhenFontsReady().
(WebCore::FontLoader::loadingDone): Fires callbacks of notifyWhenFontsReady.
(WebCore::FontLoader::loadFont): Implements fontloader.loadFont().
(WebCore::FontLoader::checkFont): Implements fontloader.checkFont().
(WebCore::FontLoader::resolveFontStyle): Parses the given font parameter using the syntax of CSS 'font' property and creates Font object. The logic is taken from CanvasRenderingContext2D::setFont().
* css/FontLoader.h: Added.
(FontLoader):
(WebCore::FontLoader::create):
(WebCore::FontLoader::loading):
(WebCore::FontLoader::document):
(WebCore::FontLoader::refEventTarget):
(WebCore::FontLoader::derefEventTarget):
* css/FontLoader.idl: Added.
* dom/Document.cpp:
(WebCore::Document::Document):
(WebCore::Document::fontloader): Added.
* dom/Document.h:
(Document): Add m_fontloader and fontloader().
* dom/Document.idl: Add fontloader attribute.
* dom/EventNames.h: Add loading and loadingdone events.
* dom/EventNames.in: Add CSSFontFaceLoadEvent.
* dom/EventTargetFactory.in: Add FontLoader.
* page/FrameView.cpp:
(WebCore::FrameView::performPostLayoutTasks): Calls FontLoader::didLayout().

Tools:

Enable FontLoadEvents runtime flag for TestShell.

* DumpRenderTree/chromium/TestRunner/src/TestInterfaces.cpp:
(WebTestRunner::TestInterfaces::TestInterfaces):

LayoutTests:

Add tests for document.fontloader. Since the feature is currently enabled
only for chromium, the tests are expected to fail on the other ports.

* fast/css/fontloader-download-error-expected.txt: Added.
* fast/css/fontloader-download-error.html: Added.
* fast/css/fontloader-events-expected.txt: Added.
* fast/css/fontloader-events.html: Added.
* fast/css/fontloader-loadingdone-expected.txt: Added.
* fast/css/fontloader-loadingdone.html: Added.
* fast/css/fontloader-multiple-faces-download-error-expected.txt: Added.
* fast/css/fontloader-multiple-faces-download-error.html: Added.
* fast/css/fontloader-multiple-faces-expected.txt: Added.
* fast/css/fontloader-multiple-faces.html: Added.
* fast/css/fontloader-multiple-families-expected.txt: Added.
* fast/css/fontloader-multiple-families.html: Added.
* http/tests/webfont/fontloader-loading-attribute-expected.txt: Added.
* http/tests/webfont/fontloader-loading-attribute.html: Added.
* platform/chromium/fast/css/fontloader-download-error-expected.txt: Added.
* platform/chromium/fast/css/fontloader-events-expected.txt: Added.
* platform/chromium/fast/css/fontloader-loadingdone-expected.txt: Added.
* platform/chromium/fast/css/fontloader-multiple-faces-download-error-expected.txt: Added.
* platform/chromium/fast/css/fontloader-multiple-faces-expected.txt: Added.
* platform/chromium/fast/css/fontloader-multiple-families-expected.txt: Added.
* platform/chromium/http/tests/webfont/fontloader-loading-attribute-expected.txt: Added.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@145787 268f45cc-cd09-0410-ab3c-d52691b4dbfc