Index: third_party/WebKit/Source/core/css/CSSURIValue.cpp |
diff --git a/third_party/WebKit/Source/core/css/CSSURIValue.cpp b/third_party/WebKit/Source/core/css/CSSURIValue.cpp |
index 23ac0f5107e23c8c96e71581d75403799224b9e1..8b84224e9513c0482076b6300ff7e3e9a78510ef 100644 |
--- a/third_party/WebKit/Source/core/css/CSSURIValue.cpp |
+++ b/third_party/WebKit/Source/core/css/CSSURIValue.cpp |
@@ -7,35 +7,71 @@ |
#include "core/css/CSSMarkup.h" |
#include "core/dom/Document.h" |
#include "core/svg/SVGElementProxy.h" |
-#include "core/svg/SVGURIReference.h" |
+#include "platform/weborigin/KURL.h" |
+#include "wtf/text/WTFString.h" |
namespace blink { |
-CSSURIValue::CSSURIValue(const String& urlString) |
- : CSSValue(URIClass), m_url(urlString) {} |
+CSSURIValue::CSSURIValue(const AtomicString& relativeUrl, |
+ const AtomicString& absoluteUrl) |
+ : CSSValue(URIClass), |
+ m_relativeUrl(relativeUrl), |
+ m_isLocal(relativeUrl.startsWith('#')), |
+ m_absoluteUrl(absoluteUrl) {} |
+ |
+CSSURIValue::CSSURIValue(const AtomicString& relativeUrl, const KURL& url) |
+ : CSSURIValue(relativeUrl, AtomicString(url.getString())) {} |
CSSURIValue::~CSSURIValue() {} |
-SVGElementProxy& CSSURIValue::ensureElementProxy(Document& document) const { |
+SVGElementProxy& CSSURIValue::ensureElementProxy( |
+ const Document& document) const { |
if (m_proxy) |
return *m_proxy; |
- SVGURLReferenceResolver resolver(m_url, document); |
- AtomicString fragmentId = resolver.fragmentIdentifier(); |
- if (resolver.isLocal()) { |
+ AtomicString fragmentId = fragmentIdentifier(); |
+ if (isLocal(document)) |
m_proxy = SVGElementProxy::create(fragmentId); |
- } else { |
- m_proxy = |
- SVGElementProxy::create(resolver.absoluteUrl().getString(), fragmentId); |
- } |
+ else |
+ m_proxy = SVGElementProxy::create(m_absoluteUrl, fragmentId); |
return *m_proxy; |
} |
+void CSSURIValue::reResolveUrl(const Document& document) const { |
+ if (m_isLocal) |
+ return; |
+ KURL url = document.completeURL(m_relativeUrl); |
+ AtomicString urlString(url.getString()); |
+ if (urlString == m_absoluteUrl) |
+ return; |
+ m_absoluteUrl = urlString; |
+ m_proxy = nullptr; |
+} |
+ |
String CSSURIValue::customCSSText() const { |
- return serializeURI(m_url); |
+ return serializeURI(m_relativeUrl); |
+} |
+ |
+AtomicString CSSURIValue::fragmentIdentifier() const { |
+ if (m_isLocal) |
+ return AtomicString(m_relativeUrl.getString().substring(1)); |
+ return AtomicString(absoluteUrl().fragmentIdentifier()); |
+} |
+ |
+KURL CSSURIValue::absoluteUrl() const { |
+ return KURL(ParsedURLString, m_absoluteUrl); |
+} |
+ |
+bool CSSURIValue::isLocal(const Document& document) const { |
+ return m_isLocal || |
+ equalIgnoringFragmentIdentifier(absoluteUrl(), document.url()); |
} |
bool CSSURIValue::equals(const CSSURIValue& other) const { |
- return m_url == other.m_url; |
+ // If only one has the 'local url' flag set, the URLs can't match. |
+ if (m_isLocal != other.m_isLocal) |
+ return false; |
+ return (m_isLocal && m_relativeUrl == other.m_relativeUrl) || |
+ m_absoluteUrl == other.m_absoluteUrl; |
} |
DEFINE_TRACE_AFTER_DISPATCH(CSSURIValue) { |