// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_SVG_LAYOUT_SVG_FOREIGN_OBJECT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_SVG_LAYOUT_SVG_FOREIGN_OBJECT_H_ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_block.h" namespace blink { // LayoutSVGForeignObject is the LayoutObject associated with <foreignobject>. // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement // // Foreign object is a way of inserting arbitrary non-SVG content into SVG. // A good example of this is HTML in SVG. Because of this, CSS content has to // be aware of SVG: e.g. when determining containing blocks we stop at the // enclosing foreign object (see LayoutObject::ComputeIsFixedContainer). // // Note that SVG is also allowed in HTML with the HTML5 parsing rules so SVG // content also has to be aware of CSS objects. // See http://www.w3.org/TR/html5/syntax.html#elements-0 with the rules for // 'foreign elements'. TODO(jchaffraix): Find a better place for this paragraph. // // The coordinate space for the descendants of the foreignObject does not // include the effective zoom (it is baked into any lengths as usual). The // transform that defines the userspace of the element is: // // [CSS transform] * [inverse effective zoom] (* ['x' and 'y' translation]) // // Because of this, the frame rect and visual rect includes effective zoom. The // object bounding box (ObjectBoundingBox method) is however not zoomed to be // compatible with the expectations of the getBBox() DOM interface. class LayoutSVGForeignObject final : public LayoutSVGBlock { … }; template <> struct DowncastTraits<LayoutSVGForeignObject> { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_SVG_LAYOUT_SVG_FOREIGN_OBJECT_H_