LayoutBox* SVGImage::embeddedContentBox() const { SVGSVGElement* rootElement = svgRootElement(m_page.get()); if (!rootElement) return nullptr; return toLayoutBox(rootElement->layoutObject()); }
void SVGImage::setContainerSize(const IntSize& size) { SVGSVGElement* rootElement = svgRootElement(m_page.get()); if (!rootElement) return; FrameView* view = frameView(); view->resize(this->containerSize()); LayoutSVGRoot* layoutObject = toLayoutSVGRoot(rootElement->layoutObject()); if (!layoutObject) return; layoutObject->setContainerSize(size); }
IntSize SVGImage::containerSize() const { SVGSVGElement* rootElement = svgRootElement(m_page.get()); if (!rootElement) return IntSize(); LayoutSVGRoot* layoutObject = toLayoutSVGRoot(rootElement->layoutObject()); if (!layoutObject) return IntSize(); // If a container size is available it has precedence. IntSize containerSize = layoutObject->containerSize(); if (!containerSize.isEmpty()) return containerSize; // Assure that a container size is always given for a non-identity zoom level. ASSERT(layoutObject->style()->effectiveZoom() == 1); FloatSize intrinsicSize; double intrinsicRatio = 0; layoutObject->computeIntrinsicRatioInformation(intrinsicSize, intrinsicRatio); if (intrinsicSize.isEmpty() && intrinsicRatio) { if (!intrinsicSize.width() && intrinsicSize.height()) intrinsicSize.setWidth(intrinsicSize.height() * intrinsicRatio); else if (intrinsicSize.width() && !intrinsicSize.height()) intrinsicSize.setHeight(intrinsicSize.width() / intrinsicRatio); } // TODO(davve): In order to maintain aspect ratio the intrinsic // size is faked from the viewBox as a last resort. This may cause // unwanted side effects. Preferably we should be able to signal // the intrinsic ratio in another way. if (intrinsicSize.isEmpty()) intrinsicSize = rootElement->currentViewBoxRect().size(); if (!intrinsicSize.isEmpty()) return expandedIntSize(intrinsicSize); // As last resort, use CSS replaced element fallback size. return IntSize(300, 150); }