| Index: Source/core/inspector/InspectorCSSAgent.cpp
|
| diff --git a/Source/core/inspector/InspectorCSSAgent.cpp b/Source/core/inspector/InspectorCSSAgent.cpp
|
| index a12ad408b2044808e2aed3c58776af7eea60730a..031693af7d1b9daca0dd7995aafacd47a6cbb4ba 100644
|
| --- a/Source/core/inspector/InspectorCSSAgent.cpp
|
| +++ b/Source/core/inspector/InspectorCSSAgent.cpp
|
| @@ -58,7 +58,15 @@
|
| #include "core/loader/DocumentLoader.h"
|
| #include "core/page/ContentSecurityPolicy.h"
|
| #include "core/platform/JSONValues.h"
|
| +#include "core/platform/graphics/Font.h"
|
| +#include "core/platform/graphics/GlyphBuffer.h"
|
| +#include "core/platform/graphics/TextRun.h"
|
| +#include "core/platform/graphics/WidthIterator.h"
|
| +#include "core/rendering/InlineTextBox.h"
|
| +#include "core/rendering/RenderObject.h"
|
| #include "core/rendering/RenderRegion.h"
|
| +#include "core/rendering/RenderText.h"
|
| +#include "core/rendering/RenderTextFragment.h"
|
| #include "wtf/CurrentTime.h"
|
| #include "wtf/HashSet.h"
|
| #include "wtf/Vector.h"
|
| @@ -1039,6 +1047,65 @@ void InspectorCSSAgent::getComputedStyleForNode(ErrorString* errorString, int no
|
| style = inspectorStyle->buildArrayForComputedStyle();
|
| }
|
|
|
| +void InspectorCSSAgent::collectPlatformFontsForRenderer(RenderText* renderer, HashMap<String, int>* fontStats)
|
| +{
|
| + for (InlineTextBox* box = renderer->firstTextBox(); box; box = box->nextTextBox()) {
|
| + RenderStyle* style = renderer->style(box->isFirstLineStyle());
|
| + const Font& font = style->font();
|
| + TextRun run = box->constructTextRunForInspector(style, font);
|
| + WidthIterator it(&font, run, 0, false);
|
| + GlyphBuffer glyphBuffer;
|
| + it.advance(run.length(), &glyphBuffer);
|
| + for (int i = 0; i < glyphBuffer.size(); ++i) {
|
| + String familyName = glyphBuffer.fontDataAt(i)->platformData().fontFamilyName();
|
| + int value = fontStats->contains(familyName) ? fontStats->get(familyName) : 0;
|
| + fontStats->set(familyName, value + 1);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void InspectorCSSAgent::getPlatformFontsForNode(ErrorString* errorString, int nodeId,
|
| + RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PlatformFontUsage> >& platformFontUsage)
|
| +{
|
| + Node* node = m_domAgent->assertNode(errorString, nodeId);
|
| + if (!node)
|
| + return;
|
| + Vector<Node*> textNodes;
|
| + if (node->nodeType() == Node::TEXT_NODE) {
|
| + if (node->renderer())
|
| + textNodes.append(node);
|
| + } else {
|
| + for (Node* child = node->firstChild(); child; child = child->nextSibling()) {
|
| + if (child->nodeType() == Node::TEXT_NODE && child->renderer())
|
| + textNodes.append(child);
|
| + }
|
| + }
|
| +
|
| + HashMap<String, int> fontStats;
|
| + for (size_t i = 0; i < textNodes.size(); ++i) {
|
| + RenderText* renderer = toRenderText(textNodes[i]->renderer());
|
| + collectPlatformFontsForRenderer(renderer, &fontStats);
|
| + if (renderer->isTextFragment()) {
|
| + RenderTextFragment* textFragment = toRenderTextFragment(renderer);
|
| + if (textFragment->firstLetter()) {
|
| + RenderObject* firstLetter = textFragment->firstLetter();
|
| + for (RenderObject* current = firstLetter->firstChild(); current; current = current->nextSibling()) {
|
| + if (current->isText())
|
| + collectPlatformFontsForRenderer(toRenderText(current), &fontStats);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + platformFontUsage = TypeBuilder::Array<TypeBuilder::CSS::PlatformFontUsage>::create();
|
| + for (HashMap<String, int>::iterator it = fontStats.begin(), end = fontStats.end(); it != end; ++it) {
|
| + RefPtr<TypeBuilder::CSS::PlatformFontUsage> platformFont = TypeBuilder::CSS::PlatformFontUsage::create()
|
| + .setFamilyName(it->key)
|
| + .setGlyphCount(it->value);
|
| + platformFontUsage->addItem(platformFont);
|
| + }
|
| +}
|
| +
|
| void InspectorCSSAgent::getAllStyleSheets(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader> >& styleInfos)
|
| {
|
| styleInfos = TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader>::create();
|
|
|