Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(515)

Unified Diff: Source/core/css/FontFaceSet.cpp

Issue 137253005: [Font Load Events] Partial implementation of SetClass operations for FontFaceSet (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix callback arguments Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/css/FontFaceSet.h ('k') | Source/core/css/FontFaceSet.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/css/FontFaceSet.cpp
diff --git a/Source/core/css/FontFaceSet.cpp b/Source/core/css/FontFaceSet.cpp
index b0c11b4dace76e76b3830a8b6bdb5c4905808b86..8d6ce530065a559f341e7f9abc41fd6e26bee2d2 100644
--- a/Source/core/css/FontFaceSet.cpp
+++ b/Source/core/css/FontFaceSet.cpp
@@ -31,11 +31,13 @@
#include "bindings/v8/ScriptPromiseResolver.h"
#include "bindings/v8/ScriptScope.h"
#include "bindings/v8/ScriptState.h"
+#include "core/css/CSSFontFace.h"
#include "core/css/CSSFontFaceLoadEvent.h"
#include "core/css/CSSFontFaceSource.h"
#include "core/css/CSSFontSelector.h"
#include "core/css/parser/BisonCSSParser.h"
#include "core/css/CSSSegmentedFontFace.h"
+#include "core/css/CSSSegmentedFontFaceCache.h"
#include "core/css/StylePropertySet.h"
#include "core/css/resolver/StyleResolver.h"
#include "core/dom/Document.h"
@@ -118,6 +120,11 @@ private:
RefPtr<ScriptPromiseResolver> m_resolver;
};
+static void flushPendingStyleChanges(Document* document)
+{
+ document->ensureStyleResolver();
+}
+
FontFaceSet::FontFaceSet(Document* document)
: ActiveDOMObject(document)
, m_loadingCount(0)
@@ -247,6 +254,50 @@ ScriptPromise FontFaceSet::ready()
return promise;
}
+bool FontFaceSet::has(FontFace* fontFace, ExceptionState& exceptionState) const
+{
+ if (!fontFace) {
+ exceptionState.throwTypeError("The argument is not a FontFace.");
+ return false;
+ }
+ flushPendingStyleChanges(document());
+ return document()->styleEngine()->fontSelector()->cssSegmentedFontFaceCache()->cssFontFaceList().contains(fontFace->cssFontFace());
+}
+
+void FontFaceSet::forEach(PassOwnPtr<FontFaceSetForEachCallback> callback, ScriptValue& thisArg) const
+{
+ forEachInternal(callback, &thisArg);
+}
+
+void FontFaceSet::forEach(PassOwnPtr<FontFaceSetForEachCallback> callback) const
+{
+ forEachInternal(callback, 0);
+}
+
+void FontFaceSet::forEachInternal(PassOwnPtr<FontFaceSetForEachCallback> callback, ScriptValue* thisArg) const
+{
+ flushPendingStyleChanges(document());
+ const ListHashSet<RefPtr<CSSFontFace> >& faces = document()->styleEngine()->fontSelector()->cssSegmentedFontFaceCache()->cssFontFaceList();
+ Vector<RefPtr<FontFace> > fontFaces;
+ fontFaces.reserveInitialCapacity(faces.size());
+ for (ListHashSet<RefPtr<CSSFontFace> >::const_iterator it = faces.begin(); it != faces.end(); ++it)
+ fontFaces.append((*it)->fontFace());
+
+ for (size_t i = 0; i < fontFaces.size(); ++i) {
+ FontFace* face = fontFaces[i].get();
+ if (thisArg)
+ callback->handleItem(*thisArg, face, face, const_cast<FontFaceSet*>(this));
+ else
+ callback->handleItem(face, face, const_cast<FontFaceSet*>(this));
+ }
+}
+
+unsigned long FontFaceSet::size() const
+{
+ flushPendingStyleChanges(document());
+ return document()->styleEngine()->fontSelector()->cssSegmentedFontFaceCache()->cssFontFaceList().size();
+}
+
void FontFaceSet::fireDoneEventIfPossible()
{
if (m_shouldFireLoadingEvent)
@@ -299,8 +350,9 @@ Vector<RefPtr<FontFace> > FontFaceSet::match(const String& fontString, const Str
return matchedFonts;
}
+ CSSSegmentedFontFaceCache* cssSegmentedFontFaceCache = document()->styleEngine()->fontSelector()->cssSegmentedFontFaceCache();
for (const FontFamily* f = &font.family(); f; f = f->next()) {
- CSSSegmentedFontFace* face = document()->styleEngine()->fontSelector()->getFontFace(font.fontDescription(), f->family());
+ CSSSegmentedFontFace* face = cssSegmentedFontFaceCache->get(font.fontDescription(), f->family());
if (face)
matchedFonts.append(face->fontFaces(nullToSpace(text)));
}
@@ -315,11 +367,11 @@ ScriptPromise FontFaceSet::load(const String& fontString, const String& text, Ex
return ScriptPromise();
}
- Document* d = document();
+ CSSSegmentedFontFaceCache* cssSegmentedFontFaceCache = document()->styleEngine()->fontSelector()->cssSegmentedFontFaceCache();
ScriptPromise promise = ScriptPromise::createPending(executionContext());
RefPtr<LoadFontPromiseResolver> resolver = LoadFontPromiseResolver::create(font.family(), promise, executionContext());
for (const FontFamily* f = &font.family(); f; f = f->next()) {
- CSSSegmentedFontFace* face = d->styleEngine()->fontSelector()->getFontFace(font.fontDescription(), f->family());
+ CSSSegmentedFontFace* face = cssSegmentedFontFaceCache->get(font.fontDescription(), f->family());
if (!face) {
resolver->error();
continue;
@@ -337,8 +389,9 @@ bool FontFaceSet::check(const String& fontString, const String& text, ExceptionS
return false;
}
+ CSSSegmentedFontFaceCache* cssSegmentedFontFaceCache = document()->styleEngine()->fontSelector()->cssSegmentedFontFaceCache();
for (const FontFamily* f = &font.family(); f; f = f->next()) {
- CSSSegmentedFontFace* face = document()->styleEngine()->fontSelector()->getFontFace(font.fontDescription(), f->family());
+ CSSSegmentedFontFace* face = cssSegmentedFontFaceCache->get(font.fontDescription(), f->family());
if (!face || !face->checkFont(nullToSpace(text)))
return false;
}
« no previous file with comments | « Source/core/css/FontFaceSet.h ('k') | Source/core/css/FontFaceSet.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698