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

Unified Diff: Source/core/inspector/InspectorDOMAgent.cpp

Issue 22923010: DevTools: Add CSS.getPlatformFontsForNode in protocol.json (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 4 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
Index: Source/core/inspector/InspectorDOMAgent.cpp
diff --git a/Source/core/inspector/InspectorDOMAgent.cpp b/Source/core/inspector/InspectorDOMAgent.cpp
index 39976bdf5485d436e02522a607c575de526e17dc..30176c90064ace04d980aebd25d87a28b02a7da5 100644
--- a/Source/core/inspector/InspectorDOMAgent.cpp
+++ b/Source/core/inspector/InspectorDOMAgent.cpp
@@ -33,6 +33,7 @@
#include "HTMLNames.h"
#include "InspectorFrontend.h"
+#include "SkTypeface.h"
#include "bindings/v8/ExceptionState.h"
#include "bindings/v8/ScriptEventListener.h"
#include "core/dom/Attr.h"
@@ -73,8 +74,17 @@
#include "core/platform/PlatformGestureEvent.h"
#include "core/platform/PlatformMouseEvent.h"
#include "core/platform/PlatformTouchEvent.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/HitTestResult.h"
+#include "core/rendering/InlineTextBox.h"
+#include "core/rendering/RenderObject.h"
+#include "core/rendering/RenderText.h"
+#include "core/rendering/RenderTextFragment.h"
#include "core/rendering/RenderView.h"
+#include "core/rendering/style/RenderStyle.h"
#include "core/xml/DocumentXPathEvaluator.h"
#include "core/xml/XPathResult.h"
#include "wtf/HashSet.h"
@@ -1225,6 +1235,74 @@ void InspectorDOMAgent::highlightFrame(
}
}
+String InspectorDOMAgent::familyNameFromSimpleFontData(const SimpleFontData* fontData)
pfeldman 2013/08/16 08:16:48 make it static
+{
+ FontPlatformData platformData = fontData->platformData();
+ SkTypeface::LocalizedStrings* fontFamilyIterator = platformData.typeface()->createFamilyNameIterator();
pfeldman 2013/08/16 08:16:48 No, you can't use Sk here.
+ SkTypeface::LocalizedString localizedString;
+ while (fontFamilyIterator->next(&localizedString) && !localizedString.fString.size()) { }
+ fontFamilyIterator->unref();
+ return String(localizedString.fString.c_str());
+}
+
+void InspectorDOMAgent::platformFontsForRenderer(RenderText* renderer, StringBuilder& fontChars, RefPtr<TypeBuilder::Array<String> >& fonts)
+{
+ 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) {
+ fonts->addItem(familyNameFromSimpleFontData(glyphBuffer.fontDataAt(i)));
+ fontChars.append(run[i]);
+ }
+ }
+}
+
+void InspectorDOMAgent::getPlatformFontsForNode(WebCore::ErrorString* errorString, int nodeId,
+ WTF::RefPtr<WebCore::TypeBuilder::Array<WebCore::TypeBuilder::DOM::TextNodePlatformFonts> >& textNodeList)
+{
+ Node* node = 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);
+ }
+ }
+
+ textNodeList = TypeBuilder::Array<WebCore::TypeBuilder::DOM::TextNodePlatformFonts>::create();
+ for (int i = 0; i < textNodes.size(); ++i) {
+ StringBuilder fontChars;
+ RefPtr<TypeBuilder::Array<String> > fonts = TypeBuilder::Array<String>::create();
+ RenderText* renderer = static_cast<RenderText*>(textNodes[i]->renderer());
pfeldman 2013/08/16 08:16:48 toRenderText
+ if (renderer->isTextFragment()) {
+ RenderTextFragment* textFragment = static_cast<RenderTextFragment*>(renderer);
pfeldman 2013/08/16 08:16:48 ditto
+ if (textFragment->firstLetter()) {
+ RenderObject* firstLetter = textFragment->firstLetter();
+ for (RenderObject* current = firstLetter->firstChild(); current; current = current->nextSibling()) {
+ if (current->isText())
+ platformFontsForRenderer(static_cast<RenderText*>(current), fontChars, fonts);
pfeldman 2013/08/16 08:16:48 collectFontsForRenderer
+ }
+ }
+ }
+ platformFontsForRenderer(renderer, fontChars, fonts);
pfeldman 2013/08/16 08:16:48 drop fontChars
+ if (!fonts->length())
+ continue;
+ RefPtr<TypeBuilder::DOM::TextNodePlatformFonts> textNodePlatformFonts = TypeBuilder::DOM::TextNodePlatformFonts::create()
+ .setText(fontChars.toString())
+ .setFonts(fonts);
+ textNodeList->addItem(textNodePlatformFonts);
+ }
+}
+
void InspectorDOMAgent::hideHighlight(ErrorString*)
{
m_overlay->hideHighlight();

Powered by Google App Engine
This is Rietveld 408576698