WebKit Bugzilla
Attachment 346680 Details for
Bug 153854
: Allow href attribute without xlink on SVG elements
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-153854-20180806201918.patch (text/plain), 19.38 KB, created by
Said Abou-Hallawa
on 2018-08-06 20:19:20 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Said Abou-Hallawa
Created:
2018-08-06 20:19:20 PDT
Size:
19.38 KB
patch
obsolete
>Subversion Revision: 234620 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index dd29f46a74d9e81bf2fd0d9326c53b9319689196..6c465e1d8f0679eb8c34e658eb9d0cdde8d4d6e5 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,57 @@ >+2018-08-06 Said Abou-Hallawa <sabouhallawa@apple.com> >+ >+ Allow href attribute without xlink on SVG elements >+ https://bugs.webkit.org/show_bug.cgi?id=153854 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ SVG 2 removed the need for the xlink namespace, so instead of xlink:href >+ href should be used. See https://www.w3.org/TR/SVG2/linking.html#XLinkRefAttrs. >+ >+ For backward compatibility, xlink:href will be treated as an alias to href. >+ >+ Tests: svg/custom/href-svg-namespace-expected.svg >+ svg/custom/href-svg-namespace.svg >+ >+ * dom/Element.cpp: >+ (WebCore::Element::getAttribute const): A new template function with template >+ pack parameter QualifiedNames is added to return the first none empty >+ attribute value given a set of attributes' names. This should be useful for >+ deprecated attributes. >+ (WebCore::Element::absoluteLinkURL const): >+ * dom/Element.h: >+ * dom/VisitedLinkState.cpp: >+ (WebCore::linkAttribute): >+ * html/parser/XSSAuditor.cpp: >+ (WebCore::XSSAuditor::filterScriptToken): >+ * svg/SVGAElement.cpp: >+ (WebCore::SVGAElement::isURLAttribute const): >+ * svg/SVGAltGlyphElement.cpp: >+ (WebCore::SVGAltGlyphElement::hasValidGlyphElements const): >+ * svg/SVGDocumentExtensions.cpp: >+ (WebCore::SVGDocumentExtensions::rebuildElements): >+ (WebCore::SVGDocumentExtensions::rebuildAllElementReferencesForTarget): >+ * svg/SVGElement.cpp: >+ (WebCore::SVGElement::animatableAttributeForName): >+ * svg/SVGFontFaceUriElement.cpp: >+ (WebCore::SVGFontFaceUriElement::srcValue const): >+ (WebCore::SVGFontFaceUriElement::parseAttribute): >+ (WebCore::SVGFontFaceUriElement::loadFont): >+ * svg/SVGGlyphRefElement.cpp: >+ (WebCore::SVGGlyphRefElement::hasValidGlyphElement const): >+ * svg/SVGImageElement.cpp: >+ (WebCore::SVGImageElement::imageSourceURL const): >+ * svg/SVGScriptElement.h: >+ * svg/SVGURIReference.cpp: >+ (WebCore::SVGURIReference::registerAttributes): >+ (WebCore::SVGURIReference::parseAttribute): >+ * svg/SVGUseElement.cpp: >+ (WebCore::SVGUseElement::expandUseElementsInShadowTree const): >+ * svg/animation/SVGSMILElement.cpp: >+ (WebCore::SVGSMILElement::isSupportedAttribute): >+ (WebCore::SVGSMILElement::svgAttributeChanged): >+ * svg/svgattrs.in: >+ > 2018-08-06 Said Abou-Hallawa <sabouhallawa@apple.com> > > Remove the SVG elements' attributes macros >diff --git a/Source/WebCore/dom/Element.cpp b/Source/WebCore/dom/Element.cpp >index 8870d2dffd129b766e1a4a1c78d629f4c69a278c..2daec1abc95cb23a1ebb1e60d165608cad3cced8 100644 >--- a/Source/WebCore/dom/Element.cpp >+++ b/Source/WebCore/dom/Element.cpp >@@ -495,6 +495,15 @@ const AtomicString& Element::getAttribute(const QualifiedName& name) const > return attribute->value(); > return nullAtom(); > } >+ >+template<typename... QualifiedNames> >+const AtomicString& Element::getAttribute(const QualifiedName& name, const QualifiedNames&... names) const >+{ >+ const AtomicString& value = getAttribute(name); >+ if (!value.isEmpty()) >+ return value; >+ return getAttribute(names...); >+} > > Vector<String> Element::getAttributeNames() const > { >@@ -1472,7 +1481,7 @@ URL Element::absoluteLinkURL() const > > AtomicString linkAttribute; > if (hasTagName(SVGNames::aTag)) >- linkAttribute = getAttribute(XLinkNames::hrefAttr); >+ linkAttribute = getAttribute(SVGNames::hrefAttr, XLinkNames::hrefAttr); > else > linkAttribute = getAttribute(HTMLNames::hrefAttr); > >diff --git a/Source/WebCore/dom/Element.h b/Source/WebCore/dom/Element.h >index 842a2080e6649e15030fc48e6fbd0ad9bd0545cb..03e723df3a7508c01077e4c610914786c3f35552 100644 >--- a/Source/WebCore/dom/Element.h >+++ b/Source/WebCore/dom/Element.h >@@ -76,6 +76,8 @@ public: > > WEBCORE_EXPORT bool hasAttribute(const QualifiedName&) const; > WEBCORE_EXPORT const AtomicString& getAttribute(const QualifiedName&) const; >+ template<typename... QualifiedNames> >+ const AtomicString& getAttribute(const QualifiedName&, const QualifiedNames&...) const; > WEBCORE_EXPORT void setAttribute(const QualifiedName&, const AtomicString& value); > WEBCORE_EXPORT void setAttributeWithoutSynchronization(const QualifiedName&, const AtomicString& value); > void setSynchronizedLazyAttribute(const QualifiedName&, const AtomicString& value); >diff --git a/Source/WebCore/dom/VisitedLinkState.cpp b/Source/WebCore/dom/VisitedLinkState.cpp >index 43564c1693bf8cf03d54b2e2785219d78e85974f..c49c3681fbf21a616dcfffc9e9766aa3fe896df6 100644 >--- a/Source/WebCore/dom/VisitedLinkState.cpp >+++ b/Source/WebCore/dom/VisitedLinkState.cpp >@@ -33,6 +33,7 @@ > #include "Frame.h" > #include "HTMLAnchorElement.h" > #include "Page.h" >+#include "SVGNames.h" > #include "VisitedLinkStore.h" > #include "XLinkNames.h" > >@@ -47,7 +48,7 @@ inline static const AtomicString* linkAttribute(const Element& element) > if (element.isHTMLElement()) > return &element.attributeWithoutSynchronization(HTMLNames::hrefAttr); > if (element.isSVGElement()) >- return &element.getAttribute(XLinkNames::hrefAttr); >+ return &element.getAttribute(SVGNames::hrefAttr, XLinkNames::hrefAttr); > return 0; > } > >diff --git a/Source/WebCore/html/parser/XSSAuditor.cpp b/Source/WebCore/html/parser/XSSAuditor.cpp >index 2ac8a2a9760d99d2801b4698811cb919b8a47919..71928c7cea8e14f044de49f9d01384730aaa2ceb 100644 >--- a/Source/WebCore/html/parser/XSSAuditor.cpp >+++ b/Source/WebCore/html/parser/XSSAuditor.cpp >@@ -447,6 +447,7 @@ bool XSSAuditor::filterScriptToken(const FilterTokenRequest& request) > bool didBlockScript = false; > if (m_wasScriptTagFoundInRequest) { > didBlockScript |= eraseAttributeIfInjected(request, srcAttr, blankURL().string(), TruncationStyle::SrcLikeAttribute); >+ didBlockScript |= eraseAttributeIfInjected(request, SVGNames::hrefAttr, blankURL().string(), TruncationStyle::SrcLikeAttribute); > didBlockScript |= eraseAttributeIfInjected(request, XLinkNames::hrefAttr, blankURL().string(), TruncationStyle::SrcLikeAttribute); > } > >diff --git a/Source/WebCore/svg/SVGAElement.cpp b/Source/WebCore/svg/SVGAElement.cpp >index cc3c09f763b602429d69f2e828e1f0f5fc7efb1b..72e4760fd8e01b4bc53343d9eae00d3c315d9222 100644 >--- a/Source/WebCore/svg/SVGAElement.cpp >+++ b/Source/WebCore/svg/SVGAElement.cpp >@@ -171,7 +171,9 @@ bool SVGAElement::supportsFocus() const > > bool SVGAElement::isURLAttribute(const Attribute& attribute) const > { >- return attribute.name().localName() == XLinkNames::hrefAttr || SVGGraphicsElement::isURLAttribute(attribute); >+ return attribute.name().localName() == SVGNames::hrefAttr >+ || attribute.name().localName() == XLinkNames::hrefAttr >+ || SVGGraphicsElement::isURLAttribute(attribute); > } > > bool SVGAElement::isMouseFocusable() const >diff --git a/Source/WebCore/svg/SVGAltGlyphElement.cpp b/Source/WebCore/svg/SVGAltGlyphElement.cpp >index 782b245ad1b118fdca695b651f75cf15e2e294a5..9b2c7eb87a1448bf0a1a911036357c0c7cf58ce2 100644 >--- a/Source/WebCore/svg/SVGAltGlyphElement.cpp >+++ b/Source/WebCore/svg/SVGAltGlyphElement.cpp >@@ -82,7 +82,7 @@ RenderPtr<RenderElement> SVGAltGlyphElement::createElementRenderer(RenderStyle&& > bool SVGAltGlyphElement::hasValidGlyphElements(Vector<String>& glyphNames) const > { > String target; >- auto element = makeRefPtr(targetElementFromIRIString(getAttribute(XLinkNames::hrefAttr), document(), &target)); >+ auto element = makeRefPtr(targetElementFromIRIString(getAttribute(SVGNames::hrefAttr, XLinkNames::hrefAttr), document(), &target)); > > if (is<SVGGlyphElement>(element)) { > glyphNames.append(target); >diff --git a/Source/WebCore/svg/SVGDocumentExtensions.cpp b/Source/WebCore/svg/SVGDocumentExtensions.cpp >index 65e246d97788a92c1463bd15a811c719a1a189e0..d29a3997ccd1ea2c63cfac2998459b354962cfd4 100644 >--- a/Source/WebCore/svg/SVGDocumentExtensions.cpp >+++ b/Source/WebCore/svg/SVGDocumentExtensions.cpp >@@ -326,7 +326,7 @@ void SVGDocumentExtensions::rebuildElements() > { > Vector<SVGElement*> shadowRebuildElements = WTFMove(m_rebuildElements); > for (auto* element : shadowRebuildElements) >- element->svgAttributeChanged(XLinkNames::hrefAttr); >+ element->svgAttributeChanged(SVGNames::hrefAttr); > } > > void SVGDocumentExtensions::clearTargetDependencies(SVGElement& referencedElement) >@@ -356,7 +356,7 @@ void SVGDocumentExtensions::rebuildAllElementReferencesForTarget(SVGElement& ref > elementsToRebuild.uncheckedAppend(element); > > for (auto* element : elementsToRebuild) >- element->svgAttributeChanged(XLinkNames::hrefAttr); >+ element->svgAttributeChanged(SVGNames::hrefAttr); > } > > void SVGDocumentExtensions::removeAllElementReferencesForTarget(SVGElement* referencedElement) >diff --git a/Source/WebCore/svg/SVGElement.cpp b/Source/WebCore/svg/SVGElement.cpp >index 1b7214bf990991007be412beb082c55cf6da76fd..32bc4a0973de9167995ad8b6c1fa5af35429d711 100644 >--- a/Source/WebCore/svg/SVGElement.cpp >+++ b/Source/WebCore/svg/SVGElement.cpp >@@ -854,7 +854,7 @@ QualifiedName SVGElement::animatableAttributeForName(const AtomicString& localNa > &SVGNames::yAttr.get(), > &SVGNames::yChannelSelectorAttr.get(), > &SVGNames::zAttr.get(), >- &XLinkNames::hrefAttr.get(), >+ &SVGNames::hrefAttr.get(), > }; > HashMap<AtomicString, QualifiedName> map; > for (auto& name : names) { >diff --git a/Source/WebCore/svg/SVGFontFaceUriElement.cpp b/Source/WebCore/svg/SVGFontFaceUriElement.cpp >index affaea45ce52edb36e82061e4666572ae7229c20..57cb2db59a477dec45c5bfffd369ebe84c5bb4d0 100644 >--- a/Source/WebCore/svg/SVGFontFaceUriElement.cpp >+++ b/Source/WebCore/svg/SVGFontFaceUriElement.cpp >@@ -58,7 +58,7 @@ SVGFontFaceUriElement::~SVGFontFaceUriElement() > > Ref<CSSFontFaceSrcValue> SVGFontFaceUriElement::srcValue() const > { >- auto src = CSSFontFaceSrcValue::create(getAttribute(XLinkNames::hrefAttr)); >+ auto src = CSSFontFaceSrcValue::create(getAttribute(SVGNames::hrefAttr, XLinkNames::hrefAttr)); > AtomicString value(attributeWithoutSynchronization(formatAttr)); > src.get().setFormat(value.isEmpty() ? "svg" : value); // Default format > return src; >@@ -66,7 +66,7 @@ Ref<CSSFontFaceSrcValue> SVGFontFaceUriElement::srcValue() const > > void SVGFontFaceUriElement::parseAttribute(const QualifiedName& name, const AtomicString& value) > { >- if (name == XLinkNames::hrefAttr) >+ if (name == SVGNames::hrefAttr || name == XLinkNames::hrefAttr) > loadFont(); > else > SVGElement::parseAttribute(name, value); >@@ -101,7 +101,7 @@ void SVGFontFaceUriElement::loadFont() > if (m_cachedFont) > m_cachedFont->removeClient(*this); > >- const AtomicString& href = getAttribute(XLinkNames::hrefAttr); >+ const AtomicString& href = getAttribute(SVGNames::hrefAttr, XLinkNames::hrefAttr); > if (!href.isNull()) { > ResourceLoaderOptions options = CachedResourceLoader::defaultCachedResourceOptions(); > options.contentSecurityPolicyImposition = isInUserAgentShadowTree() ? ContentSecurityPolicyImposition::SkipPolicyCheck : ContentSecurityPolicyImposition::DoPolicyCheck; >diff --git a/Source/WebCore/svg/SVGGlyphRefElement.cpp b/Source/WebCore/svg/SVGGlyphRefElement.cpp >index 24cdd40e829345d3938cb491f0987782ab879131..91544171f727bd1a12621c0564f5e4db77d8ec6a 100644 >--- a/Source/WebCore/svg/SVGGlyphRefElement.cpp >+++ b/Source/WebCore/svg/SVGGlyphRefElement.cpp >@@ -50,7 +50,7 @@ bool SVGGlyphRefElement::hasValidGlyphElement(String& glyphName) const > { > // FIXME: We only support xlink:href so far. > // https://bugs.webkit.org/show_bug.cgi?id=64787 >- return is<SVGGlyphElement>(targetElementFromIRIString(getAttribute(XLinkNames::hrefAttr), document(), &glyphName)); >+ return is<SVGGlyphElement>(targetElementFromIRIString(getAttribute(SVGNames::hrefAttr, XLinkNames::hrefAttr), document(), &glyphName)); > } > > static float parseFloat(const AtomicString& value) >diff --git a/Source/WebCore/svg/SVGImageElement.cpp b/Source/WebCore/svg/SVGImageElement.cpp >index f93937736ed60bcdc59b06e1f83ad03f9f36a0e2..055992764c63ed2351f267eb853df4f58d0c1ae3 100644 >--- a/Source/WebCore/svg/SVGImageElement.cpp >+++ b/Source/WebCore/svg/SVGImageElement.cpp >@@ -167,7 +167,7 @@ Node::InsertedIntoAncestorResult SVGImageElement::insertedIntoAncestor(Insertion > > const AtomicString& SVGImageElement::imageSourceURL() const > { >- return getAttribute(XLinkNames::hrefAttr); >+ return getAttribute(SVGNames::hrefAttr, XLinkNames::hrefAttr); > } > > void SVGImageElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const >diff --git a/Source/WebCore/svg/SVGScriptElement.h b/Source/WebCore/svg/SVGScriptElement.h >index 5264571facdb02670278a5646f6e44ede21490a5..f8ced22a327281b0118035a9b71807f15a815d28 100644 >--- a/Source/WebCore/svg/SVGScriptElement.h >+++ b/Source/WebCore/svg/SVGScriptElement.h >@@ -67,7 +67,7 @@ private: > bool hasAsyncAttribute() const final { return false; } > bool hasDeferAttribute() const final { return false; } > bool hasNoModuleAttribute() const final { return false; } >- bool hasSourceAttribute() const final { return hasAttribute(XLinkNames::hrefAttr); } >+ bool hasSourceAttribute() const final { return hasAttribute(SVGNames::hrefAttr) || hasAttribute(XLinkNames::hrefAttr); } > > void dispatchLoadEvent() final { SVGExternalResourcesRequired::dispatchLoadEvent(); } > >diff --git a/Source/WebCore/svg/SVGURIReference.cpp b/Source/WebCore/svg/SVGURIReference.cpp >index 9cb4da0ec5973efc4c3c761be73d457189693b22..3f1dc7b8429f39d505d2892b3b638da9e935776b 100644 >--- a/Source/WebCore/svg/SVGURIReference.cpp >+++ b/Source/WebCore/svg/SVGURIReference.cpp >@@ -41,6 +41,7 @@ void SVGURIReference::registerAttributes() > auto& registry = attributeRegistry(); > if (!registry.isEmpty()) > return; >+ registry.registerAttribute<SVGNames::hrefAttr, &SVGURIReference::m_href>(); > registry.registerAttribute<XLinkNames::hrefAttr, &SVGURIReference::m_href>(); > } > >@@ -56,7 +57,7 @@ bool SVGURIReference::isKnownAttribute(const QualifiedName& attributeName) > > void SVGURIReference::parseAttribute(const QualifiedName& name, const AtomicString& value) > { >- if (name.matches(XLinkNames::hrefAttr)) >+ if (name.matches(SVGNames::hrefAttr) || name.matches(XLinkNames::hrefAttr)) > m_href.setValue(value); > } > >diff --git a/Source/WebCore/svg/SVGUseElement.cpp b/Source/WebCore/svg/SVGUseElement.cpp >index f12c7d0a88ede0c15cb1a5833ab9aecdd5e47f1a..f7e234429515adfc67c36048c20b8888fcbb6dc0 100644 >--- a/Source/WebCore/svg/SVGUseElement.cpp >+++ b/Source/WebCore/svg/SVGUseElement.cpp >@@ -480,6 +480,7 @@ void SVGUseElement::expandUseElementsInShadowTree() const > replacementClone->removeAttribute(SVGNames::yAttr); > replacementClone->removeAttribute(SVGNames::widthAttr); > replacementClone->removeAttribute(SVGNames::heightAttr); >+ replacementClone->removeAttribute(SVGNames::hrefAttr); > replacementClone->removeAttribute(XLinkNames::hrefAttr); > > if (target) >diff --git a/Source/WebCore/svg/animation/SVGSMILElement.cpp b/Source/WebCore/svg/animation/SVGSMILElement.cpp >index 0601e5c335525bc045aebbb9d39b4bd86f76e421..f50861324ee1f4afdf4853c16d26b07ff789fb79 100644 >--- a/Source/WebCore/svg/animation/SVGSMILElement.cpp >+++ b/Source/WebCore/svg/animation/SVGSMILElement.cpp >@@ -467,6 +467,7 @@ bool SVGSMILElement::isSupportedAttribute(const QualifiedName& attrName) > SVGNames::minAttr, > SVGNames::maxAttr, > SVGNames::attributeNameAttr, >+ SVGNames::hrefAttr, > XLinkNames::hrefAttr, > }); > return supportedAttributes.get().contains<SVGAttributeHashTranslator>(attrName); >@@ -519,7 +520,7 @@ void SVGSMILElement::svgAttributeChanged(const QualifiedName& attrName) > m_cachedMax = invalidCachedTime; > else if (attrName == SVGNames::attributeNameAttr) > updateAttributeName(); >- else if (attrName.matches(XLinkNames::hrefAttr)) { >+ else if (attrName.matches(SVGNames::hrefAttr) || attrName.matches(XLinkNames::hrefAttr)) { > InstanceInvalidationGuard guard(*this); > buildPendingResource(); > } else if (isConnected()) { >diff --git a/Source/WebCore/svg/svgattrs.in b/Source/WebCore/svg/svgattrs.in >index c7561c2b5a46b5d275d63d96694f17182f97837e..8a356f01fbc3a4520da96148e4a5ae553d2b266f 100644 >--- a/Source/WebCore/svg/svgattrs.in >+++ b/Source/WebCore/svg/svgattrs.in >@@ -87,6 +87,7 @@ height > horiz-adv-x > horiz-origin-x > horiz-origin-y >+href > ideographic > image-rendering > in >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index a3efe6616dd4d710095374c8db27234775c73008..fcc75093c98a88a1ac3b46b463df34ff1041e436 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,13 @@ >+2018-08-06 Said Abou-Hallawa <sabouhallawa@apple.com> >+ >+ Allow href attribute without xlink on SVG elements >+ https://bugs.webkit.org/show_bug.cgi?id=153854 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * svg/custom/href-svg-namespace-expected.svg: Added. >+ * svg/custom/href-svg-namespace.svg: Added. >+ > 2018-08-06 Ryosuke Niwa <rniwa@webkit.org> > > fast/custom-elements/custom-element-registry-wrapper-should-stay-alive.html always timeouts on debug bots >diff --git a/LayoutTests/svg/custom/href-svg-namespace-expected.svg b/LayoutTests/svg/custom/href-svg-namespace-expected.svg >new file mode 100644 >index 0000000000000000000000000000000000000000..877ad9900cd633eed38b15fd3010d628b3481df4 >--- /dev/null >+++ b/LayoutTests/svg/custom/href-svg-namespace-expected.svg >@@ -0,0 +1,6 @@ >+<svg xmlns="http://www.w3.org/2000/svg"> >+ <rect x="10" y="10" width="100" height="100" fill="green" /> >+ <rect x="120" y="10" width="100" height="100" fill="green" /> >+ <rect x="230" y="10" width="100" height="100" fill="green" /> >+ <rect x="340" y="10" width="100" height="100" fill="green" /> >+</svg> >diff --git a/LayoutTests/svg/custom/href-svg-namespace.svg b/LayoutTests/svg/custom/href-svg-namespace.svg >new file mode 100644 >index 0000000000000000000000000000000000000000..f73b152e72abfdd37a8129e86d6a9482823c0aba >--- /dev/null >+++ b/LayoutTests/svg/custom/href-svg-namespace.svg >@@ -0,0 +1,23 @@ >+<svg xmlns="http://www.w3.org/2000/svg"> >+ <defs> >+ <rect id="rect" width="100" height="100"/> >+ <linearGradient id="grad1"> >+ <stop offset="0%" stop-color="green" /> >+ <stop offset="100%" stop-color="green" /> >+ </linearGradient> >+ <linearGradient id="grad2" x1="0%" y1="0%" x2="100%" y2="0%" href="#grad1"/> >+ >+ <pattern id="pattern1"> >+ <rect width="100%" height="100%" fill="green"/> >+ </pattern> >+ <pattern id="pattern2" x="0" y="0" width="100" height="100" href="#pattern1"/> >+ </defs> >+ <use x="10" y="10" width="100" height="100" href="#rect" fill="green"/> >+ <rect x="120" y="10" width="100" height="100" fill="url(#grad2)" /> >+ <rect x="230" y="10" width="100" height="100" fill="url(#pattern2)" /> >+ <image x="340" y="10" width="100" height="100" >+ href="data:image/svg+xml;base64, >+ PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgI >+ DxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDBweCIgaGVpZ2h0PSIxMDBweCIgZmlsbD0iZ3JlZW4iLz4KPC9zdmc+" >+ /> >+</svg>
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 153854
:
346680
|
346685
|
346690
|
346714
|
346725
|
346742