Commit 7fed5aeb authored by Fredrik Söderquist's avatar Fredrik Söderquist Committed by Commit Bot

Percent-decode fragments before using them for SVG references

We were using the "raw" form of the fragment, meaning that any percent-
encoded fragments would not resolve correctly.

Bug: 779420
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2
Change-Id: Ic091e775589fd59d25ad1878115f2ad2593bc733
Reviewed-on: https://chromium-review.googlesource.com/746885Reviewed-by: default avatarStephen Chenney <schenney@chromium.org>
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Cr-Commit-Position: refs/heads/master@{#512895}
parent 18afd13d
<!DOCTYPE html>
<div style="width: 100px; height: 100px; background-color: green"></div>
<!DOCTYPE html>
<svg>
<defs>
<linearGradient id="foo">
<stop stop-color="green"/>
</linearGradient>
</defs>
<rect width="100" height="100" fill="url(#%66%6f%6f) red"/>
</svg>
<!DOCTYPE html>
<div style="width: 100px; height: 100px; background-color: green"></div>
<!DOCTYPE html>
<meta charset="utf-8">
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="желтый">
<rect width="50" height="100" fill="green"/>
</symbol>
<symbol id="зеленый">
<rect width="50" height="100" fill="green"/>
</symbol>
<use href="#желтый"/>
<use href="#%D0%B7%D0%B5%D0%BB%D0%B5%D0%BD%D1%8B%D0%B9" x="50"/>
</svg>
...@@ -88,11 +88,10 @@ bool SVGURLReferenceResolver::IsLocal() const { ...@@ -88,11 +88,10 @@ bool SVGURLReferenceResolver::IsLocal() const {
} }
AtomicString SVGURLReferenceResolver::FragmentIdentifier() const { AtomicString SVGURLReferenceResolver::FragmentIdentifier() const {
// If this is a "fragment-only" URL, then the reference is always local, so // Use KURL's FragmentIdentifier to ensure that we're handling the
// just return what's after the '#' as the fragment. // fragment in a consistent manner.
if (is_local_) return AtomicString(
return AtomicString(relative_url_.Substring(1)); DecodeURLEscapeSequences(AbsoluteUrl().FragmentIdentifier()));
return AtomicString(AbsoluteUrl().FragmentIdentifier());
} }
AtomicString SVGURIReference::FragmentIdentifierFromIRIString( AtomicString SVGURIReference::FragmentIdentifierFromIRIString(
......
...@@ -305,7 +305,8 @@ void SVGUseElement::ClearResourceReference() { ...@@ -305,7 +305,8 @@ void SVGUseElement::ClearResourceReference() {
Element* SVGUseElement::ResolveTargetElement(ObserveBehavior observe_behavior) { Element* SVGUseElement::ResolveTargetElement(ObserveBehavior observe_behavior) {
if (!element_url_.HasFragmentIdentifier()) if (!element_url_.HasFragmentIdentifier())
return nullptr; return nullptr;
AtomicString element_identifier(element_url_.FragmentIdentifier()); AtomicString element_identifier(
DecodeURLEscapeSequences(element_url_.FragmentIdentifier()));
if (!IsStructurallyExternal()) { if (!IsStructurallyExternal()) {
if (observe_behavior == kDontAddObserver) if (observe_behavior == kDontAddObserver)
return GetTreeScope().getElementById(element_identifier); return GetTreeScope().getElementById(element_identifier);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment