/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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_ServoStyleSet_h #define mozilla_ServoStyleSet_h #include "mozilla/EnumeratedArray.h" #include "mozilla/EventStates.h" #include "mozilla/RefPtr.h" #include "mozilla/ServoBindingHelpers.h" #include "mozilla/ServoStyleSheet.h" #include "mozilla/SheetType.h" #include "mozilla/UniquePtr.h" #include "nsChangeHint.h" #include "nsCSSPseudoElements.h" #include "nsIAtom.h" #include "nsTArray.h" namespace mozilla { namespace dom { class Element; } // namespace dom class CSSStyleSheet; class ServoStyleSheet; } // namespace mozilla class nsIDocument; class nsStyleContext; class nsPresContext; struct TreeMatchContext; namespace mozilla { /** * The set of style sheets that apply to a document, backed by a Servo * Stylist. A ServoStyleSet contains ServoStyleSheets. */ class ServoStyleSet { public: ServoStyleSet(); void Init(nsPresContext* aPresContext); void BeginShutdown(); void Shutdown(); bool GetAuthorStyleDisabled() const; nsresult SetAuthorStyleDisabled(bool aStyleDisabled); void BeginUpdate(); nsresult EndUpdate(); already_AddRefed ResolveStyleFor(dom::Element* aElement, nsStyleContext* aParentContext); already_AddRefed ResolveStyleFor(dom::Element* aElement, nsStyleContext* aParentContext, TreeMatchContext& aTreeMatchContext); already_AddRefed ResolveStyleForText(nsIContent* aTextNode, nsStyleContext* aParentContext); already_AddRefed ResolveStyleForOtherNonElement(nsStyleContext* aParentContext); already_AddRefed ResolvePseudoElementStyle(dom::Element* aParentElement, mozilla::CSSPseudoElementType aType, nsStyleContext* aParentContext, dom::Element* aPseudoElement); // aFlags is an nsStyleSet flags bitfield already_AddRefed ResolveAnonymousBoxStyle(nsIAtom* aPseudoTag, nsStyleContext* aParentContext, uint32_t aFlags = 0); // manage the set of style sheets in the style set nsresult AppendStyleSheet(SheetType aType, ServoStyleSheet* aSheet); nsresult PrependStyleSheet(SheetType aType, ServoStyleSheet* aSheet); nsresult RemoveStyleSheet(SheetType aType, ServoStyleSheet* aSheet); nsresult ReplaceSheets(SheetType aType, const nsTArray>& aNewSheets); nsresult InsertStyleSheetBefore(SheetType aType, ServoStyleSheet* aNewSheet, ServoStyleSheet* aReferenceSheet); int32_t SheetCount(SheetType aType) const; ServoStyleSheet* StyleSheetAt(SheetType aType, int32_t aIndex) const; nsresult RemoveDocStyleSheet(ServoStyleSheet* aSheet); nsresult AddDocStyleSheet(ServoStyleSheet* aSheet, nsIDocument* aDocument); // check whether there is ::before/::after style for an element already_AddRefed ProbePseudoElementStyle(dom::Element* aParentElement, mozilla::CSSPseudoElementType aType, nsStyleContext* aParentContext); already_AddRefed ProbePseudoElementStyle(dom::Element* aParentElement, mozilla::CSSPseudoElementType aType, nsStyleContext* aParentContext, TreeMatchContext& aTreeMatchContext, dom::Element* aPseudoElement = nullptr); // Test if style is dependent on content state nsRestyleHint HasStateDependentStyle(dom::Element* aElement, EventStates aStateMask); nsRestyleHint HasStateDependentStyle(dom::Element* aElement, mozilla::CSSPseudoElementType aPseudoType, dom::Element* aPseudoElement, EventStates aStateMask); private: already_AddRefed GetContext(already_AddRefed, nsStyleContext* aParentContext, nsIAtom* aPseudoTag, CSSPseudoElementType aPseudoType); already_AddRefed GetContext(nsIContent* aContent, nsStyleContext* aParentContext, nsIAtom* aPseudoTag, CSSPseudoElementType aPseudoType); nsPresContext* mPresContext; UniquePtr mRawSet; EnumeratedArray>> mSheets; int32_t mBatching; }; } // namespace mozilla #endif // mozilla_ServoStyleSet_h