123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347 |
- /* -*- 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/. */
- /* parsing of CSS stylesheets, based on a token stream from the CSS scanner */
- #ifndef nsCSSParser_h___
- #define nsCSSParser_h___
- #include "mozilla/Attributes.h"
- #include "mozilla/css/Loader.h"
- #include "nsCSSPropertyID.h"
- #include "nsCSSScanner.h"
- #include "nsCOMPtr.h"
- #include "nsAutoPtr.h"
- #include "nsStringFwd.h"
- #include "nsTArrayForwardDeclare.h"
- class nsIPrincipal;
- class nsIURI;
- struct nsCSSSelectorList;
- class nsMediaList;
- class nsMediaQuery;
- class nsCSSKeyframeRule;
- class nsCSSValue;
- struct nsRuleData;
- namespace mozilla {
- class CSSStyleSheet;
- class CSSVariableValues;
- namespace css {
- class Rule;
- class Declaration;
- class StyleRule;
- } // namespace css
- } // namespace mozilla
- // Interface to the css parser.
- class MOZ_STACK_CLASS nsCSSParser {
- public:
- explicit nsCSSParser(mozilla::css::Loader* aLoader = nullptr,
- mozilla::CSSStyleSheet* aSheet = nullptr);
- ~nsCSSParser();
- static void Startup();
- static void Shutdown();
- private:
- nsCSSParser(nsCSSParser const&) = delete;
- nsCSSParser& operator=(nsCSSParser const&) = delete;
- public:
- /**
- * Parse aInput into the stylesheet that was previously passed to the
- * constructor. Calling this method on an nsCSSParser that had nullptr
- * passed in as the style sheet is an error.
- *
- * @param aInput the data to parse
- * @param aSheetURL the URI to use as the sheet URI (for error reporting).
- * This must match the URI of the sheet passed to
- * the constructor.
- * @param aBaseURI the URI to use for relative URI resolution
- * @param aSheetPrincipal the principal of the stylesheet. This must match
- * the principal of the sheet passed to the
- * constructor.
- * @param aLineNumber the line number of the first line of the sheet.
- * @param aReusableSheets style sheets that can be reused by an @import.
- * This can be nullptr.
- */
- nsresult ParseSheet(const nsAString& aInput,
- nsIURI* aSheetURL,
- nsIURI* aBaseURI,
- nsIPrincipal* aSheetPrincipal,
- uint32_t aLineNumber,
- mozilla::css::LoaderReusableStyleSheets* aReusableSheets =
- nullptr);
- // Parse HTML style attribute or its equivalent in other markup
- // languages. aBaseURL is the base url to use for relative links in
- // the declaration.
- already_AddRefed<mozilla::css::Declaration>
- ParseStyleAttribute(const nsAString& aAttributeValue,
- nsIURI* aDocURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aNodePrincipal);
- // Parse the body of a declaration block. Very similar to
- // ParseStyleAttribute, but used under different circumstances.
- // The contents of aDeclaration will be erased and replaced with the
- // results of parsing; aChanged will be set true if the aDeclaration
- // argument was modified.
- nsresult ParseDeclarations(const nsAString& aBuffer,
- nsIURI* aSheetURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aSheetPrincipal,
- mozilla::css::Declaration* aDeclaration,
- bool* aChanged);
- nsresult ParseRule(const nsAString& aRule,
- nsIURI* aSheetURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aSheetPrincipal,
- mozilla::css::Rule** aResult);
- // Parse the value of a single CSS property, and add or replace that
- // property in aDeclaration.
- //
- // SVG "mapped attributes" (which correspond directly to CSS
- // properties) are parsed slightly differently from regular CSS; in
- // particular, units may be omitted from <length>. The 'aIsSVGMode'
- // argument controls this quirk. Note that this *only* applies to
- // mapped attributes, not inline styles or full style sheets in SVG.
- void ParseProperty(const nsCSSPropertyID aPropID,
- const nsAString& aPropValue,
- nsIURI* aSheetURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aSheetPrincipal,
- mozilla::css::Declaration* aDeclaration,
- bool* aChanged,
- bool aIsImportant,
- bool aIsSVGMode = false);
- // Same as ParseProperty but returns an nsCSSValue in aResult
- // rather than storing the property in a Declaration. aPropID
- // must be a longhand property.
- void ParseLonghandProperty(const nsCSSPropertyID aPropID,
- const nsAString& aPropValue,
- nsIURI* aSheetURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aSheetPrincipal,
- nsCSSValue& aResult);
- // Parse the value of a CSS transform property. Returns
- // whether the value was successfully parsed. If
- // aDisallowRelativeValues is true then this method will
- // only successfully parse if all values are numbers or
- // have non-relative dimensions.
- bool ParseTransformProperty(const nsAString& aPropValue,
- bool aDisallowRelativeValues,
- nsCSSValue& aResult);
- // The same as ParseProperty but for a variable.
- void ParseVariable(const nsAString& aVariableName,
- const nsAString& aPropValue,
- nsIURI* aSheetURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aSheetPrincipal,
- mozilla::css::Declaration* aDeclaration,
- bool* aChanged,
- bool aIsImportant);
- /**
- * Parse aBuffer into a media list |aMediaList|, which must be
- * non-null, replacing its current contents. If aHTMLMode is true,
- * parse according to HTML rules, with commas as the most important
- * delimiter. Otherwise, parse according to CSS rules, with
- * parentheses and strings more important than commas. |aURL| and
- * |aLineNumber| are used for error reporting.
- */
- void ParseMediaList(const nsSubstring& aBuffer,
- nsIURI* aURL,
- uint32_t aLineNumber,
- nsMediaList* aMediaList,
- bool aHTMLMode);
- /*
- * Parse aBuffer into a list of media queries and their associated values,
- * according to grammar:
- * <source-size-list> = <source-size>#?
- * <source-size> = <media-condition>? <length>
- *
- * Note that this grammar is top-level: The function expects to consume the
- * entire input buffer.
- *
- * Output arrays overwritten (not appended) and are cleared in case of parse
- * failure.
- */
- bool ParseSourceSizeList(const nsAString& aBuffer,
- nsIURI* aURI, // for error reporting
- uint32_t aLineNumber, // for error reporting
- InfallibleTArray< nsAutoPtr<nsMediaQuery> >& aQueries,
- InfallibleTArray<nsCSSValue>& aValues,
- bool aHTMLMode);
- /**
- * Parse aBuffer into a nsCSSValue |aValue|. Will return false
- * if aBuffer is not a valid font family list.
- */
- bool ParseFontFamilyListString(const nsSubstring& aBuffer,
- nsIURI* aURL,
- uint32_t aLineNumber,
- nsCSSValue& aValue);
- /**
- * Parse aBuffer into a nsCSSValue |aValue|. Will return false
- * if aBuffer is not a valid CSS color specification.
- * One can use nsRuleNode::ComputeColor to compute an nscolor from
- * the returned nsCSSValue.
- */
- bool ParseColorString(const nsSubstring& aBuffer,
- nsIURI* aURL,
- uint32_t aLineNumber,
- nsCSSValue& aValue,
- bool aSuppressErrors = false);
- /**
- * Parse aBuffer into a nsCSSValue |aValue|. Will return false
- * if aBuffer is not a valid CSS margin specification.
- * One can use nsRuleNode::GetRectValue to compute an nsCSSRect from
- * the returned nsCSSValue.
- */
- bool ParseMarginString(const nsSubstring& aBuffer,
- nsIURI* aURL,
- uint32_t aLineNumber,
- nsCSSValue& aValue,
- bool aSuppressErrors = false);
- /**
- * Parse aBuffer into a selector list. On success, caller must
- * delete *aSelectorList when done with it.
- */
- nsresult ParseSelectorString(const nsSubstring& aSelectorString,
- nsIURI* aURL,
- uint32_t aLineNumber,
- nsCSSSelectorList** aSelectorList);
- /*
- * Parse a keyframe rule (which goes inside an @keyframes rule).
- * Return it if the parse was successful.
- */
- already_AddRefed<nsCSSKeyframeRule>
- ParseKeyframeRule(const nsSubstring& aBuffer,
- nsIURI* aURL,
- uint32_t aLineNumber);
- /*
- * Parse a selector list for a keyframe rule. Return whether
- * the parse succeeded.
- */
- bool ParseKeyframeSelectorString(const nsSubstring& aSelectorString,
- nsIURI* aURL,
- uint32_t aLineNumber,
- InfallibleTArray<float>& aSelectorList);
- /**
- * Parse a property and value and return whether the property/value pair
- * is supported.
- */
- bool EvaluateSupportsDeclaration(const nsAString& aProperty,
- const nsAString& aValue,
- nsIURI* aDocURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aDocPrincipal);
- /**
- * Parse an @supports condition and returns the result of evaluating the
- * condition.
- */
- bool EvaluateSupportsCondition(const nsAString& aCondition,
- nsIURI* aDocURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aDocPrincipal);
- typedef void (*VariableEnumFunc)(const nsAString&, void*);
- /**
- * Parses aPropertyValue as a property value and calls aFunc for each
- * variable reference that is found. Returns false if there was
- * a syntax error in the use of variable references.
- */
- bool EnumerateVariableReferences(const nsAString& aPropertyValue,
- VariableEnumFunc aFunc,
- void* aData);
- /**
- * Parses aPropertyValue as a property value and resolves variable references
- * using the values in aVariables.
- */
- bool ResolveVariableValue(const nsAString& aPropertyValue,
- const mozilla::CSSVariableValues* aVariables,
- nsString& aResult,
- nsCSSTokenSerializationType& aFirstToken,
- nsCSSTokenSerializationType& aLastToken);
- /**
- * Parses a string as a CSS token stream value for particular property,
- * resolving any variable references. The parsed property value is stored
- * in the specified nsRuleData object. If aShorthandPropertyID has a value
- * other than eCSSProperty_UNKNOWN, this is the property that will be parsed;
- * otherwise, aPropertyID will be parsed. Either way, only aPropertyID,
- * a longhand property, will be copied over to the rule data.
- *
- * If the property cannot be parsed, it will be treated as if 'initial' or
- * 'inherit' were specified, for non-inherited and inherited properties
- * respectively.
- */
- void ParsePropertyWithVariableReferences(
- nsCSSPropertyID aPropertyID,
- nsCSSPropertyID aShorthandPropertyID,
- const nsAString& aValue,
- const mozilla::CSSVariableValues* aVariables,
- nsRuleData* aRuleData,
- nsIURI* aDocURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aDocPrincipal,
- mozilla::CSSStyleSheet* aSheet,
- uint32_t aLineNumber,
- uint32_t aLineOffset);
- bool ParseCounterStyleName(const nsAString& aBuffer,
- nsIURI* aURL,
- nsAString& aName);
- bool ParseCounterDescriptor(nsCSSCounterDesc aDescID,
- const nsAString& aBuffer,
- nsIURI* aSheetURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aSheetPrincipal,
- nsCSSValue& aValue);
- bool ParseFontFaceDescriptor(nsCSSFontDesc aDescID,
- const nsAString& aBuffer,
- nsIURI* aSheetURL,
- nsIURI* aBaseURL,
- nsIPrincipal* aSheetPrincipal,
- nsCSSValue& aValue);
- // Check whether a given value can be applied to a property.
- bool IsValueValidForProperty(const nsCSSPropertyID aPropID,
- const nsAString& aPropValue);
- // Return the default value to be used for -moz-control-character-visibility,
- // from preferences (cached by our Startup(), so that both nsStyleText and
- // nsRuleNode can have fast access to it).
- static uint8_t ControlCharVisibilityDefault();
- protected:
- // This is a CSSParserImpl*, but if we expose that type name in this
- // header, we can't put the type definition (in nsCSSParser.cpp) in
- // the anonymous namespace.
- void* mImpl;
- };
- #endif /* nsCSSParser_h___ */
|