diff options
Diffstat (limited to 'layout/style/ServoStyleSet.h')
-rw-r--r-- | layout/style/ServoStyleSet.h | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/layout/style/ServoStyleSet.h b/layout/style/ServoStyleSet.h new file mode 100644 index 000000000..26b515afd --- /dev/null +++ b/layout/style/ServoStyleSet.h @@ -0,0 +1,175 @@ +/* -*- 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/ServoBindingTypes.h" +#include "mozilla/ServoElementSnapshot.h" +#include "mozilla/StyleSheetInlines.h" +#include "mozilla/SheetType.h" +#include "mozilla/UniquePtr.h" +#include "nsCSSPseudoElements.h" +#include "nsChangeHint.h" +#include "nsIAtom.h" +#include "nsTArray.h" + +namespace mozilla { +namespace dom { +class Element; +} // namespace dom +class CSSStyleSheet; +class ServoRestyleManager; +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 +{ + friend class ServoRestyleManager; +public: + ServoStyleSet(); + + void Init(nsPresContext* aPresContext); + void BeginShutdown(); + void Shutdown(); + + bool GetAuthorStyleDisabled() const; + nsresult SetAuthorStyleDisabled(bool aStyleDisabled); + + void BeginUpdate(); + nsresult EndUpdate(); + + already_AddRefed<nsStyleContext> + ResolveStyleFor(dom::Element* aElement, + nsStyleContext* aParentContext); + + already_AddRefed<nsStyleContext> + ResolveStyleFor(dom::Element* aElement, + nsStyleContext* aParentContext, + TreeMatchContext& aTreeMatchContext); + + already_AddRefed<nsStyleContext> + ResolveStyleForText(nsIContent* aTextNode, + nsStyleContext* aParentContext); + + already_AddRefed<nsStyleContext> + ResolveStyleForOtherNonElement(nsStyleContext* aParentContext); + + already_AddRefed<nsStyleContext> + ResolvePseudoElementStyle(dom::Element* aParentElement, + mozilla::CSSPseudoElementType aType, + nsStyleContext* aParentContext, + dom::Element* aPseudoElement); + + // aFlags is an nsStyleSet flags bitfield + already_AddRefed<nsStyleContext> + 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<RefPtr<ServoStyleSheet>>& 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<nsStyleContext> + ProbePseudoElementStyle(dom::Element* aParentElement, + mozilla::CSSPseudoElementType aType, + nsStyleContext* aParentContext); + + already_AddRefed<nsStyleContext> + 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); + + /** + * Computes a restyle hint given a element and a previous element snapshot. + */ + nsRestyleHint ComputeRestyleHint(dom::Element* aElement, + ServoElementSnapshot* aSnapshot); + + /** + * Performs a Servo traversal to compute style for all dirty nodes in the + * document. The root element must be non-null. + * + * If aLeaveDirtyBits is true, the dirty/dirty-descendant bits are not + * cleared. + */ + void StyleDocument(bool aLeaveDirtyBits); + + /** + * Eagerly styles a subtree of dirty nodes that were just appended to the + * tree. This is used in situations where we need the style immediately and + * cannot wait for a future batch restyle. + * + * The subtree must have the root dirty bit set, which currently gets + * propagated to all descendants. The dirty bits are cleared before + * returning. + */ + void StyleNewSubtree(nsIContent* aContent); + + /** + * Like the above, but does not assume that the root node is dirty. When + * appending multiple children to a potentially-non-dirty node, it's + * preferable to call StyleNewChildren on the node rather than making multiple + * calls to StyleNewSubtree on each child, since it allows for more + * parallelism. + */ + void StyleNewChildren(nsIContent* aParent); + +private: + already_AddRefed<nsStyleContext> GetContext(already_AddRefed<ServoComputedValues>, + nsStyleContext* aParentContext, + nsIAtom* aPseudoTag, + CSSPseudoElementType aPseudoType); + + already_AddRefed<nsStyleContext> GetContext(nsIContent* aContent, + nsStyleContext* aParentContext, + nsIAtom* aPseudoTag, + CSSPseudoElementType aPseudoType); + + nsPresContext* mPresContext; + UniquePtr<RawServoStyleSet> mRawSet; + EnumeratedArray<SheetType, SheetType::Count, + nsTArray<RefPtr<ServoStyleSheet>>> mSheets; + int32_t mBatching; +}; + +} // namespace mozilla + +#endif // mozilla_ServoStyleSet_h |