// static bool InspectorHighlight::getBoxModel(Node* node, RefPtr<TypeBuilder::DOM::BoxModel>& model) { LayoutObject* layoutObject = node->layoutObject(); FrameView* view = node->document().view(); if (!layoutObject || !view) return false; FloatQuad content, padding, border, margin; if (!buildNodeQuads(node, &content, &padding, &border, &margin)) return false; IntRect boundingBox = view->contentsToRootFrame(layoutObject->absoluteBoundingBoxRect()); LayoutBoxModelObject* modelObject = layoutObject->isBoxModelObject() ? toLayoutBoxModelObject(layoutObject) : nullptr; 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, *layoutObject, *shapeOutsideInfo, paths.shape)) .setMarginShape(ShapePathBuilder::buildPath(*view, *layoutObject, *shapeOutsideInfo, paths.marginShape)); model->setShapeOutside(shapeTypeBuilder); } return true; }
static PassRefPtr<InspectorObject> buildObjectForHighlight(FrameView* mainView, const Highlight& highlight) { RefPtr<InspectorObject> object = InspectorObject::create(); RefPtr<InspectorArray> array = InspectorArray::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->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()); FloatRect visibleRect = mainView->visibleContentRect(); if (!mainView->delegatesScrolling()) { object->setNumber("scrollX", visibleRect.x()); object->setNumber("scrollY", visibleRect.y()); } else { object->setNumber("scrollX", 0); object->setNumber("scrollY", 0); } return object.release(); }
static PassRefPtr<InspectorObject> buildObjectForRegionHighlight(FrameView* mainView, RenderRegion* region) { FrameView* containingView = region->frame().view(); if (!containingView) return nullptr; RenderBlockFlow* regionContainer = toRenderBlockFlow(region->parent()); LayoutRect borderBox = regionContainer->borderBoxRect(); borderBox.setWidth(borderBox.width() + regionContainer->verticalScrollbarWidth()); borderBox.setHeight(borderBox.height() + regionContainer->horizontalScrollbarHeight()); // Create incoming and outgoing boxes that we use to chain the regions toghether. const LayoutSize linkBoxSize(10, 10); const LayoutSize linkBoxMidpoint(linkBoxSize.width() / 2, linkBoxSize.height() / 2); LayoutRect incomingRectBox = LayoutRect(borderBox.location() - linkBoxMidpoint, linkBoxSize); LayoutRect outgoingRectBox = LayoutRect(borderBox.location() - linkBoxMidpoint + borderBox.size(), linkBoxSize); // Move the link boxes slightly inside the region border box. LayoutUnit maxUsableHeight = std::max(LayoutUnit(), borderBox.height() - linkBoxMidpoint.height()); LayoutUnit linkBoxVerticalOffset = std::min(LayoutUnit::fromPixel(15), maxUsableHeight); incomingRectBox.move(0, linkBoxVerticalOffset); outgoingRectBox.move(0, -linkBoxVerticalOffset); FloatQuad borderRectQuad = regionContainer->localToAbsoluteQuad(FloatRect(borderBox)); FloatQuad incomingRectQuad = regionContainer->localToAbsoluteQuad(FloatRect(incomingRectBox)); FloatQuad outgoingRectQuad = regionContainer->localToAbsoluteQuad(FloatRect(outgoingRectBox)); contentsQuadToPage(mainView, containingView, borderRectQuad); contentsQuadToPage(mainView, containingView, incomingRectQuad); contentsQuadToPage(mainView, containingView, outgoingRectQuad); RefPtr<InspectorObject> regionObject = InspectorObject::create(); regionObject->setArray("borderQuad", buildArrayForQuad(borderRectQuad)); regionObject->setArray("incomingQuad", buildArrayForQuad(incomingRectQuad)); regionObject->setArray("outgoingQuad", buildArrayForQuad(outgoingRectQuad)); return regionObject.release(); }
static PassRefPtr<InspectorObject> buildObjectForHighlight(const Highlight& highlight) { RefPtr<InspectorObject> object = InspectorObject::create(); RefPtr<InspectorArray> array = InspectorArray::create(); for (size_t i = 0; i < highlight.quads.size(); ++i) array->pushArray(buildArrayForQuad(highlight.quads[i])); object->setArray("quads", array.release()); 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()); return object.release(); }
static PassRefPtr<InspectorObject> buildObjectForShapeOutside(Frame* containingFrame, RenderBox* renderer) { const ShapeOutsideInfo* shapeOutsideInfo = renderer->shapeOutsideInfo(); if (!shapeOutsideInfo) return nullptr; RefPtr<InspectorObject> shapeObject = InspectorObject::create(); LayoutRect shapeBounds = shapeOutsideInfo->computedShapePhysicalBoundingBox(); FloatQuad shapeQuad = renderer->localToAbsoluteQuad(FloatRect(shapeBounds)); contentsQuadToPage(containingFrame->page()->mainFrame().view(), containingFrame->view(), shapeQuad); shapeObject->setArray(ASCIILiteral("bounds"), buildArrayForQuad(shapeQuad)); Shape::DisplayPaths paths; shapeOutsideInfo->computedShape().buildDisplayPaths(paths); if (paths.shape.length()) { RefPtr<InspectorArray> shapePath = InspectorArray::create(); PathApplyInfo info; info.rootView = containingFrame->page()->mainFrame().view(); info.view = containingFrame->view(); info.array = shapePath.get(); info.renderer = renderer; info.shapeOutsideInfo = shapeOutsideInfo; paths.shape.apply(&info, &appendPathSegment); shapeObject->setArray(ASCIILiteral("shape"), shapePath.release()); if (paths.marginShape.length()) { shapePath = InspectorArray::create(); info.array = shapePath.get(); paths.marginShape.apply(&info, &appendPathSegment); shapeObject->setArray(ASCIILiteral("marginShape"), shapePath.release()); } } return shapeObject.release(); }
static PassRefPtr<InspectorObject> buildObjectForCSSRegionContentClip(RenderRegion* region) { Frame* containingFrame = region->document().frame(); if (!containingFrame) return nullptr; FrameView* containingView = containingFrame->view(); FrameView* mainView = containingFrame->page()->mainFrame().view(); RenderFlowThread* flowThread = region->flowThread(); // Get the clip box of the current region and covert it into an absolute quad. LayoutRect flippedRegionRect(region->flowThreadPortionOverflowRect()); flowThread->flipForWritingMode(flippedRegionRect); // Apply any border or padding of the region. flippedRegionRect.setLocation(region->contentBoxRect().location()); FloatQuad clipQuad = region->localToAbsoluteQuad(FloatRect(flippedRegionRect)); contentsQuadToPage(mainView, containingView, clipQuad); RefPtr<InspectorObject> regionObject = InspectorObject::create(); regionObject->setArray("quad", buildArrayForQuad(clipQuad)); return regionObject.release(); }