static bool isViewportElement(const Element& element) { return (isSVGSVGElement(element) || isSVGSymbolElement(element) || isSVGForeignObjectElement(element) || isSVGImageElement(element)); }
bool SVGImage::currentFrameHasSingleSecurityOrigin() const { if (!m_page) return true; LocalFrame* frame = toLocalFrame(m_page->mainFrame()); RELEASE_ASSERT(frame->document()->loadEventFinished()); SVGSVGElement* rootElement = frame->document()->accessSVGExtensions().rootElement(); if (!rootElement) return true; // Don't allow foreignObject elements or images that are not known to be // single-origin since these can leak cross-origin information. for (Node* node = rootElement; node; node = ComposedTreeTraversal::next(*node)) { if (isSVGForeignObjectElement(*node)) return false; if (isSVGImageElement(*node)) { if (!toSVGImageElement(*node).currentFrameHasSingleSecurityOrigin()) return false; } else if (isSVGFEImageElement(*node)) { if (!toSVGFEImageElement(*node).currentFrameHasSingleSecurityOrigin()) return false; } } // Because SVG image rendering disallows external resources and links, these // images effectively are restricted to a single security origin. return true; }
bool SVGElement::isOutermostSVGSVGElement() const { if (!isSVGSVGElement(*this)) return false; // Element may not be in the document, pretend we're outermost for viewport(), getCTM(), etc. if (!parentNode()) return true; // We act like an outermost SVG element, if we're a direct child of a <foreignObject> element. if (isSVGForeignObjectElement(*parentNode())) return true; // If we're living in a shadow tree, we're a <svg> element that got created as replacement // for a <symbol> element or a cloned <svg> element in the referenced tree. In that case // we're always an inner <svg> element. if (inUseShadowTree() && parentOrShadowHostElement() && parentOrShadowHostElement()->isSVGElement()) return false; // This is true whenever this is the outermost SVG, even if there are HTML elements outside it return !parentNode()->isSVGElement(); }
static bool isSVGText(Text* text) { Node* parentOrShadowHostNode = text->parentOrShadowHostNode(); ASSERT(parentOrShadowHostNode); return parentOrShadowHostNode->isSVGElement() && !isSVGForeignObjectElement(*parentOrShadowHostNode); }