From 03a5d4628170e2db4c2af76953ef4e017d9f119b Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Fri, 4 Jan 2013 17:28:05 -0500 Subject: [PATCH] Bug 824327: Convert SVGStyleElement to WebIDL r=bz --HG-- rename : content/svg/content/src/nsSVGStyleElement.cpp => content/svg/content/src/SVGStyleElement.cpp rename : content/svg/content/src/nsSVGStyleElement.cpp => content/svg/content/src/SVGStyleElement.h --- content/svg/content/src/Makefile.in | 3 +- content/svg/content/src/SVGStyleElement.cpp | 307 +++++++++++++++ content/svg/content/src/SVGStyleElement.h | 114 ++++++ content/svg/content/src/nsSVGStyleElement.cpp | 363 ------------------ dom/webidl/SVGStyleElement.webidl | 23 ++ dom/webidl/WebIDL.mk | 1 + 6 files changed, 447 insertions(+), 364 deletions(-) create mode 100644 content/svg/content/src/SVGStyleElement.cpp create mode 100644 content/svg/content/src/SVGStyleElement.h delete mode 100644 content/svg/content/src/nsSVGStyleElement.cpp create mode 100644 dom/webidl/SVGStyleElement.webidl diff --git a/content/svg/content/src/Makefile.in b/content/svg/content/src/Makefile.in index 54a2a416ce2..cababe8b1d0 100644 --- a/content/svg/content/src/Makefile.in +++ b/content/svg/content/src/Makefile.in @@ -78,7 +78,6 @@ CPPSRCS = \ nsSVGRect.cpp \ nsSVGRectElement.cpp \ nsSVGSVGElement.cpp \ - nsSVGStyleElement.cpp \ nsSVGSwitchElement.cpp \ nsSVGSymbolElement.cpp \ nsSVGTSpanElement.cpp \ @@ -133,6 +132,7 @@ CPPSRCS = \ SVGPathSegListSMILType.cpp \ SVGPointListSMILType.cpp \ SVGStopElement.cpp \ + SVGStyleElement.cpp \ SVGTransformListSMILType.cpp \ SVGViewBoxSMILType.cpp \ $(NULL) @@ -156,6 +156,7 @@ EXPORTS_mozilla/dom = \ SVGAnimatedBoolean.h \ SVGDescElement.h \ SVGStopElement.h \ + SVGStyleElement.h \ SVGTitleElement.h \ $(NULL) diff --git a/content/svg/content/src/SVGStyleElement.cpp b/content/svg/content/src/SVGStyleElement.cpp new file mode 100644 index 00000000000..bef78f677b1 --- /dev/null +++ b/content/svg/content/src/SVGStyleElement.cpp @@ -0,0 +1,307 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/dom/SVGStyleElement.h" +#include "nsContentUtils.h" +#include "nsStubMutationObserver.h" +#include "mozilla/dom/SVGStyleElementBinding.h" + +DOMCI_NODE_DATA(SVGStyleElement, mozilla::dom::SVGStyleElement) + +NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(Style) + +namespace mozilla { +namespace dom { + +JSObject* +SVGStyleElement::WrapNode(JSContext *aCx, JSObject *aScope, bool *aTriedToWrap) +{ + return SVGStyleElementBinding::Wrap(aCx, aScope, this, aTriedToWrap); +} + +//---------------------------------------------------------------------- +// nsISupports methods + +NS_IMPL_ADDREF_INHERITED(SVGStyleElement, SVGStyleElementBase) +NS_IMPL_RELEASE_INHERITED(SVGStyleElement, SVGStyleElementBase) + +NS_INTERFACE_TABLE_HEAD_CYCLE_COLLECTION_INHERITED(SVGStyleElement) + NS_NODE_INTERFACE_TABLE7(SVGStyleElement, nsIDOMNode, nsIDOMElement, + nsIDOMSVGElement, nsIDOMSVGStyleElement, + nsIDOMLinkStyle, nsIStyleSheetLinkingElement, + nsIMutationObserver) + NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(SVGStyleElement) +NS_INTERFACE_MAP_END_INHERITING(SVGStyleElementBase) + +NS_IMPL_CYCLE_COLLECTION_CLASS(SVGStyleElement) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(SVGStyleElement, + SVGStyleElementBase) + tmp->nsStyleLinkElement::Traverse(cb); +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(SVGStyleElement, + SVGStyleElementBase) + tmp->nsStyleLinkElement::Unlink(); +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +//---------------------------------------------------------------------- +// Implementation + +SVGStyleElement::SVGStyleElement(already_AddRefed aNodeInfo) + : SVGStyleElementBase(aNodeInfo) +{ + SetIsDOMBinding(); + AddMutationObserver(this); +} + + +//---------------------------------------------------------------------- +// nsIDOMNode methods + + +NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGStyleElement) + + +//---------------------------------------------------------------------- +// nsIContent methods + +nsresult +SVGStyleElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent, + nsIContent* aBindingParent, + bool aCompileEventHandlers) +{ + nsresult rv = SVGStyleElementBase::BindToTree(aDocument, aParent, + aBindingParent, + aCompileEventHandlers); + NS_ENSURE_SUCCESS(rv, rv); + + void (SVGStyleElement::*update)() = &SVGStyleElement::UpdateStyleSheetInternal; + nsContentUtils::AddScriptRunner(NS_NewRunnableMethod(this, update)); + + return rv; +} + +void +SVGStyleElement::UnbindFromTree(bool aDeep, bool aNullParent) +{ + nsCOMPtr oldDoc = GetCurrentDoc(); + + SVGStyleElementBase::UnbindFromTree(aDeep, aNullParent); + UpdateStyleSheetInternal(oldDoc); +} + +nsresult +SVGStyleElement::SetAttr(int32_t aNameSpaceID, nsIAtom* aName, + nsIAtom* aPrefix, const nsAString& aValue, + bool aNotify) +{ + nsresult rv = SVGStyleElementBase::SetAttr(aNameSpaceID, aName, aPrefix, + aValue, aNotify); + if (NS_SUCCEEDED(rv)) { + UpdateStyleSheetInternal(nullptr, + aNameSpaceID == kNameSpaceID_None && + (aName == nsGkAtoms::title || + aName == nsGkAtoms::media || + aName == nsGkAtoms::type)); + } + + return rv; +} + +nsresult +SVGStyleElement::UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute, + bool aNotify) +{ + nsresult rv = SVGStyleElementBase::UnsetAttr(aNameSpaceID, aAttribute, + aNotify); + if (NS_SUCCEEDED(rv)) { + UpdateStyleSheetInternal(nullptr, + aNameSpaceID == kNameSpaceID_None && + (aAttribute == nsGkAtoms::title || + aAttribute == nsGkAtoms::media || + aAttribute == nsGkAtoms::type)); + } + + return rv; +} + +bool +SVGStyleElement::ParseAttribute(int32_t aNamespaceID, + nsIAtom* aAttribute, + const nsAString& aValue, + nsAttrValue& aResult) +{ + if (aNamespaceID == kNameSpaceID_None && + aAttribute == nsGkAtoms::crossorigin) { + ParseCORSValue(aValue, aResult); + return true; + } + + return SVGStyleElementBase::ParseAttribute(aNamespaceID, aAttribute, aValue, + aResult); +} + +//---------------------------------------------------------------------- +// nsIMutationObserver methods + +void +SVGStyleElement::CharacterDataChanged(nsIDocument* aDocument, + nsIContent* aContent, + CharacterDataChangeInfo* aInfo) +{ + ContentChanged(aContent); +} + +void +SVGStyleElement::ContentAppended(nsIDocument* aDocument, + nsIContent* aContainer, + nsIContent* aFirstNewContent, + int32_t aNewIndexInContainer) +{ + ContentChanged(aContainer); +} + +void +SVGStyleElement::ContentInserted(nsIDocument* aDocument, + nsIContent* aContainer, + nsIContent* aChild, + int32_t aIndexInContainer) +{ + ContentChanged(aChild); +} + +void +SVGStyleElement::ContentRemoved(nsIDocument* aDocument, + nsIContent* aContainer, + nsIContent* aChild, + int32_t aIndexInContainer, + nsIContent* aPreviousSibling) +{ + ContentChanged(aChild); +} + +void +SVGStyleElement::ContentChanged(nsIContent* aContent) +{ + if (nsContentUtils::IsInSameAnonymousTree(this, aContent)) { + UpdateStyleSheetInternal(nullptr); + } +} + +//---------------------------------------------------------------------- +// nsIDOMSVGStyleElement methods + +/* attribute DOMString xmlspace; */ +NS_IMETHODIMP SVGStyleElement::GetXmlspace(nsAString & aXmlspace) +{ + GetAttr(kNameSpaceID_XML, nsGkAtoms::space, aXmlspace); + + return NS_OK; +} +NS_IMETHODIMP SVGStyleElement::SetXmlspace(const nsAString & aXmlspace) +{ + return SetAttr(kNameSpaceID_XML, nsGkAtoms::space, aXmlspace, true); +} +void +SVGStyleElement::SetXmlspace(const nsAString & aXmlspace, ErrorResult& rv) +{ + rv = SetAttr(kNameSpaceID_XML, nsGkAtoms::space, aXmlspace, true); +} + +/* attribute DOMString type; */ +NS_IMETHODIMP SVGStyleElement::GetType(nsAString & aType) +{ + GetAttr(kNameSpaceID_None, nsGkAtoms::type, aType); + + return NS_OK; +} +NS_IMETHODIMP SVGStyleElement::SetType(const nsAString & aType) +{ + return SetAttr(kNameSpaceID_None, nsGkAtoms::type, aType, true); +} +void +SVGStyleElement::SetType(const nsAString & aType, ErrorResult& rv) +{ + rv = SetAttr(kNameSpaceID_None, nsGkAtoms::type, aType, true); +} + +/* attribute DOMString media; */ +NS_IMETHODIMP SVGStyleElement::GetMedia(nsAString & aMedia) +{ + GetAttr(kNameSpaceID_None, nsGkAtoms::media, aMedia); + + return NS_OK; +} +NS_IMETHODIMP SVGStyleElement::SetMedia(const nsAString & aMedia) +{ + return SetAttr(kNameSpaceID_None, nsGkAtoms::media, aMedia, true); +} +void +SVGStyleElement::SetMedia(const nsAString & aMedia, ErrorResult& rv) +{ + rv = SetAttr(kNameSpaceID_None, nsGkAtoms::media, aMedia, true); +} + +/* attribute DOMString title; */ +NS_IMETHODIMP SVGStyleElement::GetTitle(nsAString & aTitle) +{ + GetAttr(kNameSpaceID_None, nsGkAtoms::title, aTitle); + + return NS_OK; +} +NS_IMETHODIMP SVGStyleElement::SetTitle(const nsAString & aTitle) +{ + return SetAttr(kNameSpaceID_None, nsGkAtoms::title, aTitle, true); +} +void +SVGStyleElement::SetTitle(const nsAString & aTitle, ErrorResult& rv) +{ + rv = SetAttr(kNameSpaceID_None, nsGkAtoms::title, aTitle, true); +} + +//---------------------------------------------------------------------- +// nsStyleLinkElement methods + +already_AddRefed +SVGStyleElement::GetStyleSheetURL(bool* aIsInline) +{ + *aIsInline = true; + return nullptr; +} + +void +SVGStyleElement::GetStyleSheetInfo(nsAString& aTitle, + nsAString& aType, + nsAString& aMedia, + bool* aIsAlternate) +{ + *aIsAlternate = false; + + nsAutoString title; + GetAttr(kNameSpaceID_None, nsGkAtoms::title, title); + title.CompressWhitespace(); + aTitle.Assign(title); + + GetAttr(kNameSpaceID_None, nsGkAtoms::media, aMedia); + // The SVG spec is formulated in terms of the CSS2 spec, + // which specifies that media queries are case insensitive. + nsContentUtils::ASCIIToLower(aMedia); + + GetAttr(kNameSpaceID_None, nsGkAtoms::type, aType); + if (aType.IsEmpty()) { + aType.AssignLiteral("text/css"); + } + + return; +} + +CORSMode +SVGStyleElement::GetCORSMode() const +{ + return AttrValueToCORSMode(GetParsedAttr(nsGkAtoms::crossorigin)); +} + +} // namespace dom +} // namespace mozilla + diff --git a/content/svg/content/src/SVGStyleElement.h b/content/svg/content/src/SVGStyleElement.h new file mode 100644 index 00000000000..c2a3d3f4b67 --- /dev/null +++ b/content/svg/content/src/SVGStyleElement.h @@ -0,0 +1,114 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_SVGStyleElement_h +#define mozilla_dom_SVGStyleElement_h + +#include "nsSVGElement.h" +#include "nsIDOMSVGStyleElement.h" +#include "nsStyleLinkElement.h" +#include "nsStubMutationObserver.h" + +nsresult NS_NewSVGStyleElement(nsIContent **aResult, + already_AddRefed aNodeInfo); + +typedef nsSVGElement SVGStyleElementBase; + +namespace mozilla { +namespace dom { + +class SVGStyleElement MOZ_FINAL : public SVGStyleElementBase, + public nsIDOMSVGStyleElement, + public nsStyleLinkElement, + public nsStubMutationObserver +{ +protected: + friend nsresult (::NS_NewSVGStyleElement(nsIContent **aResult, + already_AddRefed aNodeInfo)); + SVGStyleElement(already_AddRefed aNodeInfo); + + virtual JSObject* WrapNode(JSContext *aCx, JSObject *aScope, bool *aTriedToWrap) MOZ_OVERRIDE; + +public: + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_NSIDOMSVGSTYLEELEMENT + + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SVGStyleElement, + SVGStyleElementBase) + + // xxx I wish we could use virtual inheritance + NS_FORWARD_NSIDOMNODE_TO_NSINODE + NS_FORWARD_NSIDOMELEMENT_TO_GENERIC + NS_FORWARD_NSIDOMSVGELEMENT(SVGStyleElementBase::) + + // nsIContent + virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent, + nsIContent* aBindingParent, + bool aCompileEventHandlers); + virtual void UnbindFromTree(bool aDeep = true, + bool aNullParent = true); + nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName, + const nsAString& aValue, bool aNotify) + { + return SetAttr(aNameSpaceID, aName, nullptr, aValue, aNotify); + } + virtual nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName, + nsIAtom* aPrefix, const nsAString& aValue, + bool aNotify); + virtual nsresult UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute, + bool aNotify); + virtual bool ParseAttribute(int32_t aNamespaceID, + nsIAtom* aAttribute, + const nsAString& aValue, + nsAttrValue& aResult); + + virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const; + + // nsIMutationObserver + NS_DECL_NSIMUTATIONOBSERVER_CHARACTERDATACHANGED + NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED + NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED + NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED + + virtual nsXPCClassInfo* GetClassInfo(); + + virtual nsIDOMNode* AsDOMNode() { return this; } + + // WebIDL + void SetXmlspace(const nsAString & aXmlspace, ErrorResult& rv); + void SetType(const nsAString & aType, ErrorResult& rv); + void SetMedia(const nsAString & aMedia, ErrorResult& rv); + void SetTitle(const nsAString & aTitle, ErrorResult& rv); + +protected: + // Dummy init method to make the NS_IMPL_NS_NEW_SVG_ELEMENT and + // NS_IMPL_ELEMENT_CLONE_WITH_INIT usable with this class. This should be + // completely optimized away. + inline nsresult Init() + { + return NS_OK; + } + + // nsStyleLinkElement overrides + already_AddRefed GetStyleSheetURL(bool* aIsInline); + + void GetStyleSheetInfo(nsAString& aTitle, + nsAString& aType, + nsAString& aMedia, + bool* aIsAlternate); + virtual CORSMode GetCORSMode() const; + + /** + * Common method to call from the various mutation observer methods. + * aContent is a content node that's either the one that changed or its + * parent; we should only respond to the change if aContent is non-anonymous. + */ + void ContentChanged(nsIContent* aContent); +}; + +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_SVGStyleElement_h diff --git a/content/svg/content/src/nsSVGStyleElement.cpp b/content/svg/content/src/nsSVGStyleElement.cpp deleted file mode 100644 index 7d43a7519a5..00000000000 --- a/content/svg/content/src/nsSVGStyleElement.cpp +++ /dev/null @@ -1,363 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsSVGElement.h" -#include "nsGkAtoms.h" -#include "nsIDOMSVGStyleElement.h" -#include "nsUnicharUtils.h" -#include "nsIDocument.h" -#include "nsStyleLinkElement.h" -#include "nsContentUtils.h" -#include "nsStubMutationObserver.h" - -using namespace mozilla; - -typedef nsSVGElement nsSVGStyleElementBase; - -class nsSVGStyleElement : public nsSVGStyleElementBase, - public nsIDOMSVGStyleElement, - public nsStyleLinkElement, - public nsStubMutationObserver -{ -protected: - friend nsresult NS_NewSVGStyleElement(nsIContent **aResult, - already_AddRefed aNodeInfo); - nsSVGStyleElement(already_AddRefed aNodeInfo); - -public: - NS_DECL_ISUPPORTS_INHERITED - NS_DECL_NSIDOMSVGSTYLEELEMENT - - NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsSVGStyleElement, - nsSVGStyleElementBase) - - // xxx I wish we could use virtual inheritance - NS_FORWARD_NSIDOMNODE_TO_NSINODE - NS_FORWARD_NSIDOMELEMENT_TO_GENERIC - NS_FORWARD_NSIDOMSVGELEMENT(nsSVGStyleElementBase::) - - // nsIContent - virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent, - nsIContent* aBindingParent, - bool aCompileEventHandlers); - virtual void UnbindFromTree(bool aDeep = true, - bool aNullParent = true); - nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName, - const nsAString& aValue, bool aNotify) - { - return SetAttr(aNameSpaceID, aName, nullptr, aValue, aNotify); - } - virtual nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName, - nsIAtom* aPrefix, const nsAString& aValue, - bool aNotify); - virtual nsresult UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute, - bool aNotify); - virtual bool ParseAttribute(int32_t aNamespaceID, - nsIAtom* aAttribute, - const nsAString& aValue, - nsAttrValue& aResult); - - virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const; - - // nsIMutationObserver - NS_DECL_NSIMUTATIONOBSERVER_CHARACTERDATACHANGED - NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED - NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED - NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED - - virtual nsXPCClassInfo* GetClassInfo(); - - virtual nsIDOMNode* AsDOMNode() { return this; } -protected: - // Dummy init method to make the NS_IMPL_NS_NEW_SVG_ELEMENT and - // NS_IMPL_ELEMENT_CLONE_WITH_INIT usable with this class. This should be - // completely optimized away. - inline nsresult Init() - { - return NS_OK; - } - - // nsStyleLinkElement overrides - already_AddRefed GetStyleSheetURL(bool* aIsInline); - - void GetStyleSheetInfo(nsAString& aTitle, - nsAString& aType, - nsAString& aMedia, - bool* aIsAlternate); - virtual CORSMode GetCORSMode() const; - - /** - * Common method to call from the various mutation observer methods. - * aContent is a content node that's either the one that changed or its - * parent; we should only respond to the change if aContent is non-anonymous. - */ - void ContentChanged(nsIContent* aContent); -}; - - -NS_IMPL_NS_NEW_SVG_ELEMENT(Style) - - -//---------------------------------------------------------------------- -// nsISupports methods - -NS_IMPL_ADDREF_INHERITED(nsSVGStyleElement,nsSVGStyleElementBase) -NS_IMPL_RELEASE_INHERITED(nsSVGStyleElement,nsSVGStyleElementBase) - -DOMCI_NODE_DATA(SVGStyleElement, nsSVGStyleElement) - -NS_INTERFACE_TABLE_HEAD_CYCLE_COLLECTION_INHERITED(nsSVGStyleElement) - NS_NODE_INTERFACE_TABLE7(nsSVGStyleElement, nsIDOMNode, nsIDOMElement, - nsIDOMSVGElement, nsIDOMSVGStyleElement, - nsIDOMLinkStyle, nsIStyleSheetLinkingElement, - nsIMutationObserver) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(SVGStyleElement) -NS_INTERFACE_MAP_END_INHERITING(nsSVGStyleElementBase) - -NS_IMPL_CYCLE_COLLECTION_CLASS(nsSVGStyleElement) -NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsSVGStyleElement, - nsSVGStyleElementBase) - tmp->nsStyleLinkElement::Traverse(cb); -NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END -NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsSVGStyleElement, - nsSVGStyleElementBase) - tmp->nsStyleLinkElement::Unlink(); -NS_IMPL_CYCLE_COLLECTION_UNLINK_END - -//---------------------------------------------------------------------- -// Implementation - -nsSVGStyleElement::nsSVGStyleElement(already_AddRefed aNodeInfo) - : nsSVGStyleElementBase(aNodeInfo) -{ - AddMutationObserver(this); -} - - -//---------------------------------------------------------------------- -// nsIDOMNode methods - - -NS_IMPL_ELEMENT_CLONE_WITH_INIT(nsSVGStyleElement) - - -//---------------------------------------------------------------------- -// nsIContent methods - -nsresult -nsSVGStyleElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent, - nsIContent* aBindingParent, - bool aCompileEventHandlers) -{ - nsresult rv = nsSVGStyleElementBase::BindToTree(aDocument, aParent, - aBindingParent, - aCompileEventHandlers); - NS_ENSURE_SUCCESS(rv, rv); - - void (nsSVGStyleElement::*update)() = &nsSVGStyleElement::UpdateStyleSheetInternal; - nsContentUtils::AddScriptRunner(NS_NewRunnableMethod(this, update)); - - return rv; -} - -void -nsSVGStyleElement::UnbindFromTree(bool aDeep, bool aNullParent) -{ - nsCOMPtr oldDoc = GetCurrentDoc(); - - nsSVGStyleElementBase::UnbindFromTree(aDeep, aNullParent); - UpdateStyleSheetInternal(oldDoc); -} - -nsresult -nsSVGStyleElement::SetAttr(int32_t aNameSpaceID, nsIAtom* aName, - nsIAtom* aPrefix, const nsAString& aValue, - bool aNotify) -{ - nsresult rv = nsSVGStyleElementBase::SetAttr(aNameSpaceID, aName, aPrefix, - aValue, aNotify); - if (NS_SUCCEEDED(rv)) { - UpdateStyleSheetInternal(nullptr, - aNameSpaceID == kNameSpaceID_None && - (aName == nsGkAtoms::title || - aName == nsGkAtoms::media || - aName == nsGkAtoms::type)); - } - - return rv; -} - -nsresult -nsSVGStyleElement::UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute, - bool aNotify) -{ - nsresult rv = nsSVGStyleElementBase::UnsetAttr(aNameSpaceID, aAttribute, - aNotify); - if (NS_SUCCEEDED(rv)) { - UpdateStyleSheetInternal(nullptr, - aNameSpaceID == kNameSpaceID_None && - (aAttribute == nsGkAtoms::title || - aAttribute == nsGkAtoms::media || - aAttribute == nsGkAtoms::type)); - } - - return rv; -} - -bool -nsSVGStyleElement::ParseAttribute(int32_t aNamespaceID, - nsIAtom* aAttribute, - const nsAString& aValue, - nsAttrValue& aResult) -{ - if (aNamespaceID == kNameSpaceID_None && - aAttribute == nsGkAtoms::crossorigin) { - ParseCORSValue(aValue, aResult); - return true; - } - - return nsSVGStyleElementBase::ParseAttribute(aNamespaceID, aAttribute, aValue, - aResult); -} - -//---------------------------------------------------------------------- -// nsIMutationObserver methods - -void -nsSVGStyleElement::CharacterDataChanged(nsIDocument* aDocument, - nsIContent* aContent, - CharacterDataChangeInfo* aInfo) -{ - ContentChanged(aContent); -} - -void -nsSVGStyleElement::ContentAppended(nsIDocument* aDocument, - nsIContent* aContainer, - nsIContent* aFirstNewContent, - int32_t aNewIndexInContainer) -{ - ContentChanged(aContainer); -} - -void -nsSVGStyleElement::ContentInserted(nsIDocument* aDocument, - nsIContent* aContainer, - nsIContent* aChild, - int32_t aIndexInContainer) -{ - ContentChanged(aChild); -} - -void -nsSVGStyleElement::ContentRemoved(nsIDocument* aDocument, - nsIContent* aContainer, - nsIContent* aChild, - int32_t aIndexInContainer, - nsIContent* aPreviousSibling) -{ - ContentChanged(aChild); -} - -void -nsSVGStyleElement::ContentChanged(nsIContent* aContent) -{ - if (nsContentUtils::IsInSameAnonymousTree(this, aContent)) { - UpdateStyleSheetInternal(nullptr); - } -} - -//---------------------------------------------------------------------- -// nsIDOMSVGStyleElement methods - -/* attribute DOMString xmlspace; */ -NS_IMETHODIMP nsSVGStyleElement::GetXmlspace(nsAString & aXmlspace) -{ - GetAttr(kNameSpaceID_XML, nsGkAtoms::space, aXmlspace); - - return NS_OK; -} -NS_IMETHODIMP nsSVGStyleElement::SetXmlspace(const nsAString & aXmlspace) -{ - return SetAttr(kNameSpaceID_XML, nsGkAtoms::space, aXmlspace, true); -} - -/* attribute DOMString type; */ -NS_IMETHODIMP nsSVGStyleElement::GetType(nsAString & aType) -{ - GetAttr(kNameSpaceID_None, nsGkAtoms::type, aType); - - return NS_OK; -} -NS_IMETHODIMP nsSVGStyleElement::SetType(const nsAString & aType) -{ - return SetAttr(kNameSpaceID_None, nsGkAtoms::type, aType, true); -} - -/* attribute DOMString media; */ -NS_IMETHODIMP nsSVGStyleElement::GetMedia(nsAString & aMedia) -{ - GetAttr(kNameSpaceID_None, nsGkAtoms::media, aMedia); - - return NS_OK; -} -NS_IMETHODIMP nsSVGStyleElement::SetMedia(const nsAString & aMedia) -{ - return SetAttr(kNameSpaceID_None, nsGkAtoms::media, aMedia, true); -} - -/* attribute DOMString title; */ -NS_IMETHODIMP nsSVGStyleElement::GetTitle(nsAString & aTitle) -{ - GetAttr(kNameSpaceID_None, nsGkAtoms::title, aTitle); - - return NS_OK; -} -NS_IMETHODIMP nsSVGStyleElement::SetTitle(const nsAString & aTitle) -{ - return SetAttr(kNameSpaceID_None, nsGkAtoms::title, aTitle, true); -} - -//---------------------------------------------------------------------- -// nsStyleLinkElement methods - -already_AddRefed -nsSVGStyleElement::GetStyleSheetURL(bool* aIsInline) -{ - *aIsInline = true; - return nullptr; -} - -void -nsSVGStyleElement::GetStyleSheetInfo(nsAString& aTitle, - nsAString& aType, - nsAString& aMedia, - bool* aIsAlternate) -{ - *aIsAlternate = false; - - nsAutoString title; - GetAttr(kNameSpaceID_None, nsGkAtoms::title, title); - title.CompressWhitespace(); - aTitle.Assign(title); - - GetAttr(kNameSpaceID_None, nsGkAtoms::media, aMedia); - // The SVG spec is formulated in terms of the CSS2 spec, - // which specifies that media queries are case insensitive. - nsContentUtils::ASCIIToLower(aMedia); - - GetAttr(kNameSpaceID_None, nsGkAtoms::type, aType); - if (aType.IsEmpty()) { - aType.AssignLiteral("text/css"); - } - - return; -} - -CORSMode -nsSVGStyleElement::GetCORSMode() const -{ - return AttrValueToCORSMode(GetParsedAttr(nsGkAtoms::crossorigin)); -} diff --git a/dom/webidl/SVGStyleElement.webidl b/dom/webidl/SVGStyleElement.webidl new file mode 100644 index 00000000000..07f6f3c5a69 --- /dev/null +++ b/dom/webidl/SVGStyleElement.webidl @@ -0,0 +1,23 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.w3.org/TR/SVG2/ + * + * Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C + * liability, trademark and document use rules apply. + */ + +interface SVGStyleElement : SVGElement { + [SetterThrows] + attribute DOMString xmlspace; // Spec claims this should be on SVGElement + [SetterThrows] + attribute DOMString type; + [SetterThrows] + attribute DOMString media; + [SetterThrows] + attribute DOMString title; +}; + diff --git a/dom/webidl/WebIDL.mk b/dom/webidl/WebIDL.mk index cd81eac1adf..97aa4aea426 100644 --- a/dom/webidl/WebIDL.mk +++ b/dom/webidl/WebIDL.mk @@ -107,6 +107,7 @@ webidl_files = \ SVGPointList.webidl \ SVGPreserveAspectRatio.webidl \ SVGStopElement.webidl \ + SVGStyleElement.webidl \ SVGTitleElement.webidl \ SVGTransform.webidl \ SVGTransformList.webidl \