diff options
Diffstat (limited to 'layout/style/nsDOMCSSDeclaration.h')
-rw-r--r-- | layout/style/nsDOMCSSDeclaration.h | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/layout/style/nsDOMCSSDeclaration.h b/layout/style/nsDOMCSSDeclaration.h new file mode 100644 index 000000000..5b2308e4a --- /dev/null +++ b/layout/style/nsDOMCSSDeclaration.h @@ -0,0 +1,174 @@ +/* -*- 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/. */ + +/* base class for DOM objects for element.style and cssStyleRule.style */ + +#ifndef nsDOMCSSDeclaration_h___ +#define nsDOMCSSDeclaration_h___ + +#include "nsICSSDeclaration.h" + +#include "mozilla/Attributes.h" +#include "nsIURI.h" +#include "nsCOMPtr.h" + +class nsIPrincipal; +class nsIDocument; +struct JSContext; +class JSObject; + +namespace mozilla { +class DeclarationBlock; +namespace css { +class Loader; +class Rule; +} // namespace css +} // namespace mozilla + +class nsDOMCSSDeclaration : public nsICSSDeclaration +{ +public: + // Only implement QueryInterface; subclasses have the responsibility + // of implementing AddRef/Release. + NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override; + + // Declare addref and release so they can be called on us, but don't + // implement them. Our subclasses must handle their own + // refcounting. + NS_IMETHOD_(MozExternalRefCountType) AddRef() override = 0; + NS_IMETHOD_(MozExternalRefCountType) Release() override = 0; + + NS_DECL_NSICSSDECLARATION + using nsICSSDeclaration::GetLength; + + // Require subclasses to implement |GetParentRule|. + //NS_DECL_NSIDOMCSSSTYLEDECLARATION + NS_IMETHOD GetCssText(nsAString & aCssText) override; + NS_IMETHOD SetCssText(const nsAString & aCssText) override; + NS_IMETHOD GetPropertyValue(const nsAString & propertyName, + nsAString & _retval) override; + virtual already_AddRefed<mozilla::dom::CSSValue> + GetPropertyCSSValue(const nsAString & propertyName, + mozilla::ErrorResult& aRv) override; + using nsICSSDeclaration::GetPropertyCSSValue; + NS_IMETHOD RemoveProperty(const nsAString & propertyName, + nsAString & _retval) override; + NS_IMETHOD GetPropertyPriority(const nsAString & propertyName, + nsAString & _retval) override; + NS_IMETHOD SetProperty(const nsAString & propertyName, + const nsAString & value, const nsAString & priority) override; + NS_IMETHOD GetLength(uint32_t *aLength) override; + NS_IMETHOD GetParentRule(nsIDOMCSSRule * *aParentRule) override = 0; + + // WebIDL interface for CSS2Properties +#define CSS_PROP_PUBLIC_OR_PRIVATE(publicname_, privatename_) publicname_ +#define CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, \ + kwtable_, stylestruct_, stylestructoffset_, animtype_) \ + void \ + Get##method_(nsAString& aValue, mozilla::ErrorResult& rv) \ + { \ + rv = GetPropertyValue(eCSSProperty_##id_, aValue); \ + } \ + \ + void \ + Set##method_(const nsAString& aValue, mozilla::ErrorResult& rv) \ + { \ + rv = SetPropertyValue(eCSSProperty_##id_, aValue); \ + } + +#define CSS_PROP_LIST_EXCLUDE_INTERNAL +#define CSS_PROP_LIST_INCLUDE_LOGICAL +#define CSS_PROP_SHORTHAND(name_, id_, method_, flags_, pref_) \ + CSS_PROP(name_, id_, method_, flags_, pref_, X, X, X, X, X) +#include "nsCSSPropList.h" + +#define CSS_PROP_ALIAS(aliasname_, propid_, aliasmethod_, pref_) \ + CSS_PROP(X, propid_, aliasmethod_, X, pref_, X, X, X, X, X) +#include "nsCSSPropAliasList.h" +#undef CSS_PROP_ALIAS + +#undef CSS_PROP_SHORTHAND +#undef CSS_PROP_LIST_INCLUDE_LOGICAL +#undef CSS_PROP_LIST_EXCLUDE_INTERNAL +#undef CSS_PROP +#undef CSS_PROP_PUBLIC_OR_PRIVATE + + virtual void IndexedGetter(uint32_t aIndex, bool& aFound, nsAString& aPropName) override; + + virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override; + +protected: + // The reason for calling GetCSSDeclaration. + enum Operation { + // We are calling GetCSSDeclaration so that we can read from it. Does not + // allocate a new declaration if we don't have one yet; returns nullptr in + // this case. + eOperation_Read, + + // We are calling GetCSSDeclaration so that we can set a property on it + // or re-parse the whole declaration. Allocates a new declaration if we + // don't have one yet and calls AttributeWillChange. A nullptr return value + // indicates an error allocating the declaration. + eOperation_Modify, + + // We are calling GetCSSDeclaration so that we can remove a property from + // it. Does not allocates a new declaration if we don't have one yet; + // returns nullptr in this case. If we do have a declaration, calls + // AttributeWillChange. + eOperation_RemoveProperty + }; + virtual mozilla::DeclarationBlock* GetCSSDeclaration(Operation aOperation) = 0; + virtual nsresult SetCSSDeclaration(mozilla::DeclarationBlock* aDecl) = 0; + // Document that we must call BeginUpdate/EndUpdate on around the + // calls to SetCSSDeclaration and the style rule mutation that leads + // to it. + virtual nsIDocument* DocToUpdate() = 0; + + // Information neded to parse a declaration. We need the mSheetURI + // for error reporting, mBaseURI to resolve relative URIs, + // mPrincipal for subresource loads, and mCSSLoader for determining + // whether we're in quirks mode. mBaseURI needs to be a strong + // pointer because of xml:base possibly creating base URIs on the + // fly. This is why we don't use CSSParsingEnvironment as a return + // value, to avoid multiple-refcounting of mBaseURI. + struct CSSParsingEnvironment { + nsIURI* MOZ_UNSAFE_REF("user of CSSParsingEnviroment must hold an owning " + "reference; reference counting here has unacceptable " + "performance overhead (see bug 649163)") mSheetURI; + nsCOMPtr<nsIURI> mBaseURI; + nsIPrincipal* MOZ_UNSAFE_REF("user of CSSParsingEnviroment must hold an owning " + "reference; reference counting here has unacceptable " + "performance overhead (see bug 649163)") mPrincipal; + mozilla::css::Loader* MOZ_UNSAFE_REF("user of CSSParsingEnviroment must hold an owning " + "reference; reference counting here has unacceptable " + "performance overhead (see bug 649163)") mCSSLoader; + }; + + // On failure, mPrincipal should be set to null in aCSSParseEnv. + // If mPrincipal is null, the other members may not be set to + // anything meaningful. + virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) = 0; + + // An implementation for GetCSSParsingEnvironment for callers wrapping + // an css::Rule. + static void GetCSSParsingEnvironmentForRule(mozilla::css::Rule* aRule, + CSSParsingEnvironment& aCSSParseEnv); + + nsresult ParsePropertyValue(const nsCSSPropertyID aPropID, + const nsAString& aPropValue, + bool aIsImportant); + + nsresult ParseCustomPropertyValue(const nsAString& aPropertyName, + const nsAString& aPropValue, + bool aIsImportant); + + nsresult RemovePropertyInternal(nsCSSPropertyID aPropID); + nsresult RemovePropertyInternal(const nsAString& aProperty); + +protected: + virtual ~nsDOMCSSDeclaration(); +}; + +#endif // nsDOMCSSDeclaration_h___ |