Index: Source/core/inspector/InspectorOverlay.cpp |
diff --git a/Source/core/inspector/InspectorOverlay.cpp b/Source/core/inspector/InspectorOverlay.cpp |
index f1b4876f36734da4a305f7c6e8b79bf2f3202c36..aa1c6a02471222a18c4f073b9486c030933ddbd7 100644 |
--- a/Source/core/inspector/InspectorOverlay.cpp |
+++ b/Source/core/inspector/InspectorOverlay.cpp |
@@ -64,11 +64,58 @@ namespace blink { |
namespace { |
-struct PathApplyInfo { |
- FrameView* view; |
- TypeBuilder::Array<JSONValue>* array; |
- RenderObject* renderer; |
- const ShapeOutsideInfo* shapeOutsideInfo; |
+class PathBuilder { |
+ WTF_MAKE_NONCOPYABLE(PathBuilder); |
+public: |
+ PathBuilder() : m_path(TypeBuilder::Array<JSONValue>::create()) { } |
+ virtual ~PathBuilder() { } |
+ |
+ PassRefPtr<TypeBuilder::Array<JSONValue> > path() const { return m_path; } |
+ void appendPath(const Path& path) |
+ { |
+ path.apply(this, &PathBuilder::appendPathElement); |
+ } |
+ |
+protected: |
+ virtual FloatPoint translatePoint(const FloatPoint& point) { return point; } |
+ |
+private: |
+ static void appendPathElement(void* pathBuilder, const PathElement* pathElement) |
+ { |
+ static_cast<PathBuilder*>(pathBuilder)->appendPathElement(pathElement); |
+ } |
+ |
+ void appendPathElement(const PathElement*); |
+ void appendPathCommandAndPoints(const char* command, const FloatPoint points[], size_t length); |
+ |
+ RefPtr<TypeBuilder::Array<JSONValue> > m_path; |
+}; |
+ |
+class ShapePathBuilder : public PathBuilder { |
+public: |
+ ShapePathBuilder(FrameView& view, RenderObject& renderer, const ShapeOutsideInfo& shapeOutsideInfo) |
+ : m_view(view) |
+ , m_renderer(renderer) |
+ , m_shapeOutsideInfo(shapeOutsideInfo) { } |
+ |
+ static PassRefPtr<TypeBuilder::Array<JSONValue> > buildPath(FrameView& view, RenderObject& renderer, const ShapeOutsideInfo& shapeOutsideInfo, const Path& path) |
+ { |
+ ShapePathBuilder builder(view, renderer, shapeOutsideInfo); |
+ builder.appendPath(path); |
+ return builder.path(); |
+ } |
+ |
+protected: |
+ virtual FloatPoint translatePoint(const FloatPoint& point) |
+ { |
+ FloatPoint rendererPoint = m_shapeOutsideInfo.shapeToRendererPoint(point); |
+ return m_view.contentsToRootView(roundedIntPoint(m_renderer.localToAbsolute(rendererPoint))); |
+ } |
+ |
+private: |
+ FrameView& m_view; |
+ RenderObject& m_renderer; |
+ const ShapeOutsideInfo& m_shapeOutsideInfo; |
}; |
class InspectorOverlayChromeClient FINAL: public EmptyChromeClient { |
@@ -103,7 +150,7 @@ private: |
InspectorOverlay* m_overlay; |
}; |
-Path quadToPath(const FloatQuad& quad) |
+static Path quadToPath(const FloatQuad& quad) |
{ |
Path quadPath; |
quadPath.moveTo(quad.p1()); |
@@ -138,6 +185,61 @@ void drawOutlinedQuad(GraphicsContext* context, const FloatQuad& quad, const Col |
context->fillPath(quadPath); |
} |
+class Highlight { |
+public: |
+ Highlight() |
+ : m_showRulers(false) |
+ , m_showExtensionLines(false) |
+ , m_highlightPaths(JSONArray::create()) |
+ { } |
+ |
+ void setDataFromConfig(const HighlightConfig& highlightConfig) |
+ { |
+ m_showRulers = highlightConfig.showRulers; |
+ m_showExtensionLines = highlightConfig.showExtensionLines; |
+ } |
+ |
+ void setElementInfo(PassRefPtr<JSONObject> elementInfo) |
+ { |
+ m_elementInfo = elementInfo; |
+ } |
+ |
+ void appendQuad(const FloatQuad& quad, const Color& fillColor, const Color& outlineColor = Color::transparent) |
+ { |
+ Path path = quadToPath(quad); |
+ PathBuilder builder; |
+ builder.appendPath(path); |
+ appendPath(builder.path(), fillColor, outlineColor); |
+ } |
+ |
+ void appendPath(PassRefPtr<JSONArrayBase> path, const Color& fillColor, const Color& outlineColor) |
+ { |
+ RefPtr<JSONObject> object = JSONObject::create(); |
+ object->setValue("path", path); |
+ object->setString("fillColor", fillColor.serialized()); |
+ if (outlineColor != Color::transparent) |
+ object->setString("outlineColor", outlineColor.serialized()); |
+ m_highlightPaths->pushObject(object.release()); |
+ } |
+ |
+ PassRefPtr<JSONObject> asJSONObject() const |
+ { |
+ RefPtr<JSONObject> object = JSONObject::create(); |
+ object->setArray("paths", m_highlightPaths); |
+ object->setBoolean("showRulers", m_showRulers); |
+ object->setBoolean("showExtensionLines", m_showExtensionLines); |
+ if (m_elementInfo) |
+ object->setObject("elementInfo", m_elementInfo); |
+ return object.release(); |
+ } |
+ |
+private: |
+ bool m_showRulers; |
+ bool m_showExtensionLines; |
+ RefPtr<JSONObject> m_elementInfo; |
+ RefPtr<JSONArray> m_highlightPaths; |
+}; |
+ |
static void contentsQuadToScreen(const FrameView* view, FloatQuad& quad) |
{ |
quad.setP1(view->contentsToRootView(roundedIntPoint(quad.p1()))); |
@@ -146,24 +248,11 @@ static void contentsQuadToScreen(const FrameView* view, FloatQuad& quad) |
quad.setP4(view->contentsToRootView(roundedIntPoint(quad.p4()))); |
} |
-static bool buildNodeQuads(Node* node, Vector<FloatQuad>& quads) |
+static bool buildNodeQuads(RenderObject* renderer, FloatQuad* content, FloatQuad* padding, FloatQuad* border, FloatQuad* margin) |
{ |
- RenderObject* renderer = node->renderer(); |
- LocalFrame* containingFrame = node->document().frame(); |
- |
- if (!renderer || !containingFrame) |
+ FrameView* containingView = renderer->frameView(); |
+ if (!containingView) |
return false; |
- |
- FrameView* containingView = containingFrame->view(); |
- |
- // RenderSVGRoot should be highlighted through the isBox() code path, all other SVG elements should just dump their absoluteQuads(). |
- if (renderer->node() && renderer->node()->isSVGElement() && !renderer->isSVGRoot()) { |
- renderer->absoluteQuads(quads); |
- for (size_t i = 0; i < quads.size(); ++i) |
- contentsQuadToScreen(containingView, quads[i]); |
- return false; |
- } |
- |
if (!renderer->isBox() && !renderer->isRenderInline()) |
return false; |
@@ -200,49 +289,43 @@ static bool buildNodeQuads(Node* node, Vector<FloatQuad>& quads) |
borderBox.width() + renderInline->marginWidth(), borderBox.height()); |
} |
- FloatQuad absContentQuad = renderer->localToAbsoluteQuad(FloatRect(contentBox)); |
- FloatQuad absPaddingQuad = renderer->localToAbsoluteQuad(FloatRect(paddingBox)); |
- FloatQuad absBorderQuad = renderer->localToAbsoluteQuad(FloatRect(borderBox)); |
- FloatQuad absMarginQuad = renderer->localToAbsoluteQuad(FloatRect(marginBox)); |
- |
- contentsQuadToScreen(containingView, absContentQuad); |
- contentsQuadToScreen(containingView, absPaddingQuad); |
- contentsQuadToScreen(containingView, absBorderQuad); |
- contentsQuadToScreen(containingView, absMarginQuad); |
+ *content = renderer->localToAbsoluteQuad(FloatRect(contentBox)); |
+ *padding = renderer->localToAbsoluteQuad(FloatRect(paddingBox)); |
+ *border = renderer->localToAbsoluteQuad(FloatRect(borderBox)); |
+ *margin = renderer->localToAbsoluteQuad(FloatRect(marginBox)); |
- quads.append(absMarginQuad); |
- quads.append(absBorderQuad); |
- quads.append(absPaddingQuad); |
- quads.append(absContentQuad); |
+ contentsQuadToScreen(containingView, *content); |
+ contentsQuadToScreen(containingView, *padding); |
+ contentsQuadToScreen(containingView, *border); |
+ contentsQuadToScreen(containingView, *margin); |
return true; |
} |
-static void buildNodeHighlight(Node* node, const HighlightConfig& highlightConfig, Highlight* highlight) |
+static void buildNodeHighlight(Node& node, const HighlightConfig& highlightConfig, Highlight* highlight) |
{ |
- RenderObject* renderer = node->renderer(); |
- LocalFrame* containingFrame = node->document().frame(); |
- |
- if (!renderer || !containingFrame) |
+ RenderObject* renderer = node.renderer(); |
+ if (!renderer) |
return; |
highlight->setDataFromConfig(highlightConfig); |
// RenderSVGRoot should be highlighted through the isBox() code path, all other SVG elements should just dump their absoluteQuads(). |
- if (renderer->node() && renderer->node()->isSVGElement() && !renderer->isSVGRoot()) |
- highlight->type = HighlightTypeRects; |
- else if (renderer->isBox() || renderer->isRenderInline()) |
- highlight->type = HighlightTypeNode; |
- buildNodeQuads(node, highlight->quads); |
-} |
+ if (renderer->node() && renderer->node()->isSVGElement() && !renderer->isSVGRoot()) { |
+ Vector<FloatQuad> quads; |
+ renderer->absoluteQuads(quads); |
+ for (size_t i = 0; i < quads.size(); ++i) |
+ highlight->appendQuad(quads[i], highlightConfig.content, highlightConfig.contentOutline); |
+ return; |
+ } |
-static void buildQuadHighlight(Page* page, const FloatQuad& quad, const HighlightConfig& highlightConfig, Highlight *highlight) |
-{ |
- if (!page) |
+ FloatQuad content, padding, border, margin; |
+ if (!buildNodeQuads(renderer, &content, &padding, &border, &margin)) |
return; |
- highlight->setDataFromConfig(highlightConfig); |
- highlight->type = HighlightTypeRects; |
- highlight->quads.append(quad); |
+ highlight->appendQuad(content, highlightConfig.content, highlightConfig.contentOutline); |
+ highlight->appendQuad(padding, highlightConfig.padding); |
+ highlight->appendQuad(border, highlightConfig.border); |
+ highlight->appendQuad(margin, highlightConfig.margin); |
} |
} // anonymous namespace |
@@ -439,42 +522,6 @@ void InspectorOverlay::hide() |
update(); |
} |
-static PassRefPtr<JSONObject> buildObjectForPoint(const FloatPoint& point) |
-{ |
- RefPtr<JSONObject> object = JSONObject::create(); |
- object->setNumber("x", point.x()); |
- object->setNumber("y", point.y()); |
- return object.release(); |
-} |
- |
-static PassRefPtr<JSONArray> buildArrayForQuad(const FloatQuad& quad) |
-{ |
- RefPtr<JSONArray> array = JSONArray::create(); |
- array->pushObject(buildObjectForPoint(quad.p1())); |
- array->pushObject(buildObjectForPoint(quad.p2())); |
- array->pushObject(buildObjectForPoint(quad.p3())); |
- array->pushObject(buildObjectForPoint(quad.p4())); |
- return array.release(); |
-} |
- |
-static PassRefPtr<JSONObject> buildObjectForHighlight(const Highlight& highlight) |
-{ |
- RefPtr<JSONObject> object = JSONObject::create(); |
- RefPtr<JSONArray> array = JSONArray::create(); |
- for (size_t i = 0; i < highlight.quads.size(); ++i) |
- array->pushArray(buildArrayForQuad(highlight.quads[i])); |
- object->setArray("quads", array.release()); |
- object->setBoolean("showRulers", highlight.showRulers); |
- object->setBoolean("showExtensionLines", highlight.showExtensionLines); |
- object->setString("contentColor", highlight.contentColor.serialized()); |
- object->setString("contentOutlineColor", highlight.contentOutlineColor.serialized()); |
- object->setString("paddingColor", highlight.paddingColor.serialized()); |
- object->setString("borderColor", highlight.borderColor.serialized()); |
- object->setString("marginColor", highlight.marginColor.serialized()); |
- object->setString("eventTargetColor", highlight.eventTargetColor.serialized()); |
- return object.release(); |
-} |
- |
static PassRefPtr<JSONObject> buildObjectForSize(const IntSize& size) |
{ |
RefPtr<JSONObject> result = JSONObject::create(); |
@@ -483,48 +530,43 @@ static PassRefPtr<JSONObject> buildObjectForSize(const IntSize& size) |
return result.release(); |
} |
-// CSS shapes |
-static void appendPathCommandAndPoints(PathApplyInfo* info, const String& command, const FloatPoint points[], unsigned length) |
+void PathBuilder::appendPathCommandAndPoints(const char* command, const FloatPoint points[], size_t length) |
{ |
- FloatPoint point; |
- info->array->addItem(JSONString::create(command)); |
- for (unsigned i = 0; i < length; i++) { |
- point = info->shapeOutsideInfo->shapeToRendererPoint(points[i]); |
- point = info->view->contentsToRootView(roundedIntPoint(info->renderer->localToAbsolute(point))); |
- info->array->addItem(JSONBasicValue::create(point.x())); |
- info->array->addItem(JSONBasicValue::create(point.y())); |
+ m_path->addItem(JSONString::create(command)); |
+ for (size_t i = 0; i < length; i++) { |
+ FloatPoint point = translatePoint(points[i]); |
+ m_path->addItem(JSONBasicValue::create(point.x())); |
+ m_path->addItem(JSONBasicValue::create(point.y())); |
} |
} |
-static void appendPathSegment(void* info, const PathElement* pathElement) |
+void PathBuilder::appendPathElement(const PathElement* pathElement) |
{ |
- PathApplyInfo* pathApplyInfo = static_cast<PathApplyInfo*>(info); |
- FloatPoint point; |
switch (pathElement->type) { |
// The points member will contain 1 value. |
case PathElementMoveToPoint: |
- appendPathCommandAndPoints(pathApplyInfo, "M", pathElement->points, 1); |
+ appendPathCommandAndPoints("M", pathElement->points, 1); |
break; |
// The points member will contain 1 value. |
case PathElementAddLineToPoint: |
- appendPathCommandAndPoints(pathApplyInfo, "L", pathElement->points, 1); |
+ appendPathCommandAndPoints("L", pathElement->points, 1); |
break; |
// The points member will contain 3 values. |
case PathElementAddCurveToPoint: |
- appendPathCommandAndPoints(pathApplyInfo, "C", pathElement->points, 3); |
+ appendPathCommandAndPoints("C", pathElement->points, 3); |
break; |
// The points member will contain 2 values. |
case PathElementAddQuadCurveToPoint: |
- appendPathCommandAndPoints(pathApplyInfo, "Q", pathElement->points, 2); |
+ appendPathCommandAndPoints("Q", pathElement->points, 2); |
break; |
// The points member will contain no values. |
case PathElementCloseSubpath: |
- appendPathCommandAndPoints(pathApplyInfo, "Z", 0, 0); |
+ appendPathCommandAndPoints("Z", 0, 0); |
break; |
} |
} |
-static RefPtr<TypeBuilder::Array<double> > buildArrayForQuadTypeBuilder(const FloatQuad& quad) |
+static RefPtr<TypeBuilder::Array<double> > buildArrayForQuad(const FloatQuad& quad) |
{ |
RefPtr<TypeBuilder::Array<double> > array = TypeBuilder::Array<double>::create(); |
array->addItem(quad.p1().x()); |
@@ -538,51 +580,47 @@ static RefPtr<TypeBuilder::Array<double> > buildArrayForQuadTypeBuilder(const Fl |
return array.release(); |
} |
-PassRefPtr<TypeBuilder::DOM::ShapeOutsideInfo> InspectorOverlay::buildObjectForShapeOutside(Node* node) |
+static const ShapeOutsideInfo* shapeOutsideInfoForNode(Node* node, Shape::DisplayPaths* paths, FloatQuad* bounds) |
{ |
RenderObject* renderer = node->renderer(); |
if (!renderer || !renderer->isBox() || !toRenderBox(renderer)->shapeOutsideInfo()) |
- return nullptr; |
+ return 0; |
- LocalFrame* containingFrame = node->document().frame(); |
+ FrameView* containingView = node->document().view(); |
RenderBox* renderBox = toRenderBox(renderer); |
const ShapeOutsideInfo* shapeOutsideInfo = renderBox->shapeOutsideInfo(); |
+ shapeOutsideInfo->computedShape().buildDisplayPaths(*paths); |
+ |
LayoutRect shapeBounds = shapeOutsideInfo->computedShapePhysicalBoundingBox(); |
- FloatQuad shapeQuad = renderBox->localToAbsoluteQuad(FloatRect(shapeBounds)); |
- FrameView* containingView = containingFrame->view(); |
- contentsQuadToScreen(containingView, shapeQuad); |
+ *bounds = renderBox->localToAbsoluteQuad(FloatRect(shapeBounds)); |
+ contentsQuadToScreen(containingView, *bounds); |
+ return shapeOutsideInfo; |
+} |
+ |
+static void appendPathsForShapeOutside(Highlight& highlight, const HighlightConfig& config, Node* node) |
+{ |
Shape::DisplayPaths paths; |
- shapeOutsideInfo->computedShape().buildDisplayPaths(paths); |
- RefPtr<TypeBuilder::Array<JSONValue> > shapePath = TypeBuilder::Array<JSONValue>::create(); |
- RefPtr<TypeBuilder::Array<JSONValue> > marginShapePath = TypeBuilder::Array<JSONValue>::create(); |
- |
- if (paths.shape.length()) { |
- PathApplyInfo info; |
- info.view = containingView; |
- info.array = shapePath.get(); |
- info.renderer = renderBox; |
- info.shapeOutsideInfo = shapeOutsideInfo; |
- paths.shape.apply(&info, &appendPathSegment); |
- |
- if (paths.marginShape.length()) { |
- info.array = marginShapePath.get(); |
- paths.marginShape.apply(&info, &appendPathSegment); |
- } |
+ FloatQuad boundsQuad; |
+ |
+ const ShapeOutsideInfo* shapeOutsideInfo = shapeOutsideInfoForNode(node, &paths, &boundsQuad); |
+ if (!shapeOutsideInfo) |
+ return; |
+ |
+ if (!paths.shape.length()) { |
+ highlight.appendQuad(boundsQuad, config.shape); |
+ return; |
} |
- RefPtr<TypeBuilder::DOM::ShapeOutsideInfo> shapeTypeBuilder = TypeBuilder::DOM::ShapeOutsideInfo::create() |
- .setBounds(buildArrayForQuadTypeBuilder(shapeQuad)) |
- .setShape(shapePath) |
- .setMarginShape(marginShapePath); |
- return shapeTypeBuilder.release(); |
+ highlight.appendPath(ShapePathBuilder::buildPath(*node->document().view(), *node->renderer(), *shapeOutsideInfo, paths.shape), config.shape, Color::transparent); |
+ if (paths.marginShape.length()) |
+ highlight.appendPath(ShapePathBuilder::buildPath(*node->document().view(), *node->renderer(), *shapeOutsideInfo, paths.marginShape), config.shapeMargin, Color::transparent); |
} |
-static void setElementInfo(RefPtr<JSONObject>& highlightObject, RefPtr<JSONObject>& shapeObject, Node* node) |
+PassRefPtr<JSONObject> buildElementInfo(Element* element) |
{ |
RefPtr<JSONObject> elementInfo = JSONObject::create(); |
- Element* element = toElement(node); |
Element* realElement = element; |
PseudoElement* pseudoElement = 0; |
if (element->isPseudoElement()) { |
@@ -614,16 +652,17 @@ static void setElementInfo(RefPtr<JSONObject>& highlightObject, RefPtr<JSONObjec |
if (!classNames.isEmpty()) |
elementInfo->setString("className", classNames.toString()); |
- RenderObject* renderer = node->renderer(); |
- LocalFrame* containingFrame = node->document().frame(); |
- FrameView* containingView = containingFrame->view(); |
+ RenderObject* renderer = element->renderer(); |
+ FrameView* containingView = element->document().view(); |
+ if (!renderer || !containingView) |
+ return elementInfo; |
+ |
IntRect boundingBox = pixelSnappedIntRect(containingView->contentsToRootView(renderer->absoluteBoundingBoxRect())); |
RenderBoxModelObject* modelObject = renderer->isBoxModelObject() ? toRenderBoxModelObject(renderer) : 0; |
elementInfo->setString("nodeWidth", String::number(modelObject ? adjustForAbsoluteZoom(modelObject->pixelSnappedOffsetWidth(), modelObject) : boundingBox.width())); |
elementInfo->setString("nodeHeight", String::number(modelObject ? adjustForAbsoluteZoom(modelObject->pixelSnappedOffsetHeight(), modelObject) : boundingBox.height())); |
- if (renderer->isBox() && shapeObject) |
- elementInfo->setObject("shapeOutsideInfo", shapeObject.release()); |
- highlightObject->setObject("elementInfo", elementInfo.release()); |
+ |
+ return elementInfo; |
} |
void InspectorOverlay::drawNodeHighlight() |
@@ -632,20 +671,19 @@ void InspectorOverlay::drawNodeHighlight() |
return; |
Highlight highlight; |
- buildNodeHighlight(m_highlightNode.get(), m_nodeHighlightConfig, &highlight); |
- if (m_eventTargetNode) { |
- Highlight eventTargetHighlight; |
- buildNodeHighlight(m_eventTargetNode.get(), m_nodeHighlightConfig, &eventTargetHighlight); |
- highlight.quads.append(eventTargetHighlight.quads[1]); // Add border from eventTargetNode to highlight. |
+ buildNodeHighlight(*m_highlightNode, m_nodeHighlightConfig, &highlight); |
+ appendPathsForShapeOutside(highlight, m_nodeHighlightConfig, m_highlightNode.get()); |
+ |
+ if (m_eventTargetNode && m_eventTargetNode->renderer()) { |
+ FloatQuad border, unused; |
+ if (buildNodeQuads(m_eventTargetNode->renderer(), &unused, &unused, &border, &unused)) |
+ highlight.appendQuad(border, m_nodeHighlightConfig.eventTarget); |
} |
- RefPtr<JSONObject> highlightObject = buildObjectForHighlight(highlight); |
- Node* node = m_highlightNode.get(); |
- RefPtr<TypeBuilder::DOM::ShapeOutsideInfo> shapeObject = buildObjectForShapeOutside(node); |
- RefPtr<JSONObject> shapeObjectJSON = shapeObject ? shapeObject->asObject() : nullptr; |
- if (node->isElementNode() && !m_omitTooltip && m_nodeHighlightConfig.showInfo && node->renderer() && node->document().frame()) |
- setElementInfo(highlightObject, shapeObjectJSON, node); |
- evaluateInOverlay("drawNodeHighlight", highlightObject); |
+ if (m_highlightNode->isElementNode() && !m_omitTooltip && m_nodeHighlightConfig.showInfo && m_highlightNode->renderer() && m_highlightNode->document().frame()) |
+ highlight.setElementInfo(buildElementInfo(toElement(m_highlightNode.get()))); |
+ |
+ evaluateInOverlay("drawHighlight", highlight.asJSONObject()); |
} |
void InspectorOverlay::drawQuadHighlight() |
@@ -654,8 +692,8 @@ void InspectorOverlay::drawQuadHighlight() |
return; |
Highlight highlight; |
- buildQuadHighlight(m_page, *m_highlightQuad, m_quadHighlightConfig, &highlight); |
- evaluateInOverlay("drawQuadHighlight", buildObjectForHighlight(highlight)); |
+ highlight.appendQuad(*m_highlightQuad, m_quadHighlightConfig.content, m_quadHighlightConfig.contentOutline); |
+ evaluateInOverlay("drawHighlight", highlight.asJSONObject()); |
} |
void InspectorOverlay::drawPausedInDebuggerMessage() |
@@ -769,9 +807,39 @@ void InspectorOverlay::onTimer(Timer<InspectorOverlay>*) |
update(); |
} |
-bool InspectorOverlay::getBoxModel(Node* node, Vector<FloatQuad>* quads) |
+bool InspectorOverlay::getBoxModel(Node* node, RefPtr<TypeBuilder::DOM::BoxModel>& model) |
{ |
- return buildNodeQuads(node, *quads); |
+ RenderObject* renderer = node->renderer(); |
+ FrameView* view = node->document().view(); |
+ if (!renderer || !view) |
+ return false; |
+ |
+ FloatQuad content, padding, border, margin; |
+ if (!buildNodeQuads(node->renderer(), &content, &padding, &border, &margin)) |
+ return false; |
+ |
+ IntRect boundingBox = pixelSnappedIntRect(view->contentsToRootView(renderer->absoluteBoundingBoxRect())); |
+ RenderBoxModelObject* modelObject = renderer->isBoxModelObject() ? toRenderBoxModelObject(renderer) : 0; |
+ |
+ model = TypeBuilder::DOM::BoxModel::create() |
+ .setContent(buildArrayForQuad(content)) |
+ .setPadding(buildArrayForQuad(padding)) |
+ .setBorder(buildArrayForQuad(border)) |
+ .setMargin(buildArrayForQuad(margin)) |
+ .setWidth(modelObject ? adjustForAbsoluteZoom(modelObject->pixelSnappedOffsetWidth(), modelObject) : boundingBox.width()) |
+ .setHeight(modelObject ? adjustForAbsoluteZoom(modelObject->pixelSnappedOffsetHeight(), modelObject) : boundingBox.height()); |
+ |
+ Shape::DisplayPaths paths; |
+ FloatQuad boundsQuad; |
+ if (const ShapeOutsideInfo* shapeOutsideInfo = shapeOutsideInfoForNode(node, &paths, &boundsQuad)) { |
+ RefPtr<TypeBuilder::DOM::ShapeOutsideInfo> shapeTypeBuilder = TypeBuilder::DOM::ShapeOutsideInfo::create() |
+ .setBounds(buildArrayForQuad(boundsQuad)) |
+ .setShape(ShapePathBuilder::buildPath(*view, *renderer, *shapeOutsideInfo, paths.shape)) |
+ .setMarginShape(ShapePathBuilder::buildPath(*view, *renderer, *shapeOutsideInfo, paths.marginShape)); |
+ model->setShapeOutside(shapeTypeBuilder); |
+ } |
+ |
+ return true; |
} |
void InspectorOverlay::freePage() |