Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1435)

Unified Diff: Source/core/svg/graphics/SVGImage.cpp

Issue 22604008: Allow SVG images to not taint the canvas with drawImage/drawPattern (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/svg/graphics/SVGImage.cpp
diff --git a/Source/core/svg/graphics/SVGImage.cpp b/Source/core/svg/graphics/SVGImage.cpp
index bbcfe3c44c2ce39b21e62a1fec4518c558e323b6..2c24155e259107ecb07f9114c18a2f47cb3e7dda 100644
--- a/Source/core/svg/graphics/SVGImage.cpp
+++ b/Source/core/svg/graphics/SVGImage.cpp
@@ -29,7 +29,9 @@
#include "core/svg/graphics/SVGImage.h"
+#include "core/dom/NodeTraversal.h"
#include "core/loader/DocumentLoader.h"
+#include "core/page/Chrome.h"
#include "core/page/FrameView.h"
#include "core/page/Settings.h"
#include "core/platform/graphics/GraphicsContextStateSaver.h"
@@ -39,6 +41,7 @@
#include "core/rendering/style/RenderStyle.h"
#include "core/rendering/svg/RenderSVGRoot.h"
#include "core/svg/SVGDocument.h"
+#include "core/svg/SVGImageElement.h"
#include "core/svg/SVGSVGElement.h"
#include "core/svg/graphics/SVGImageChromeClient.h"
#include "wtf/PassRefPtr.h"
@@ -62,6 +65,47 @@ SVGImage::~SVGImage()
ASSERT(!m_chromeClient || !m_chromeClient->image());
}
+bool SVGImage::isInSVGImage(const Element* element)
+{
+ ASSERT(element);
+
+ Page* page = element->document()->page();
+ if (!page)
+ return false;
+
+ ChromeClient* chromeClient = page->chrome().client();
+ return chromeClient && chromeClient->isSVGImageChromeClient();
+}
+
+bool SVGImage::hasSingleSecurityOrigin() const
+{
+ if (!m_page)
+ return true;
+
+ Frame* frame = m_page->mainFrame();
+ SVGSVGElement* rootElement = toSVGDocument(frame->document())->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 (Element* element = ElementTraversal::firstWithin(rootElement); element; element = ElementTraversal::next(element, rootElement)) {
abarth-chromium 2013/08/12 19:47:44 Does this traverse shadow DOM?
pdr. 2013/08/19 23:16:17 Fortunately, custom elements cannot be created dec
+ if (element->hasTagName(SVGNames::foreignObjectTag))
+ return false;
+ // FIXME(crbug.com/249037): Images should be allowed but the
+ // implementation is difficult because images can have animations which
+ // cause them to dynamically change their single-origin state.
+ if (element->hasTagName(SVGNames::imageTag))
+ return false;
+ if (element->hasTagName(SVGNames::feImageTag))
Tom Sepez 2013/08/15 17:53:59 I worry about folks introducing a new element type
pdr. 2013/08/19 23:16:17 I think this will actually end up being prohibitiv
+ return false;
+ }
+
+ // Because SVG image rendering disallows external resources and links, these
+ // images effectively are restricted to a single security origin.
+ return true;
+}
+
void SVGImage::setContainerSize(const IntSize& size)
{
if (!m_page || !usesContainerSize())
« Source/core/html/HTMLImageElement.cpp ('K') | « Source/core/svg/graphics/SVGImage.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698