Bug 1355343: Move node restyle bits to Element, and add bits for snapshot handling. r=bholley
MozReview-Commit-ID: 6OrUKX5RcBq
Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
--- a/dom/base/Element.h
+++ b/dom/base/Element.h
@@ -78,38 +78,64 @@ already_AddRefed<nsContentList>
NS_GetContentList(nsINode* aRootNode,
int32_t aMatchNameSpaceId,
const nsAString& aTagname);
#define ELEMENT_FLAG_BIT(n_) NODE_FLAG_BIT(NODE_TYPE_SPECIFIC_BITS_OFFSET + (n_))
// Element-specific flags
enum {
+ // These two bits are shared by Gecko's and Servo's restyle systems for
+ // different purposes. They should not be accessed directly, and access to
+ // them should be properly guarded by asserts.
+ ELEMENT_SHARED_RESTYLE_BIT_1 = ELEMENT_FLAG_BIT(0),
+ ELEMENT_SHARED_RESTYLE_BIT_2 = ELEMENT_FLAG_BIT(1),
+ ELEMENT_SHARED_RESTYLE_BIT_3 = ELEMENT_FLAG_BIT(2),
+ ELEMENT_SHARED_RESTYLE_BIT_4 = ELEMENT_FLAG_BIT(3),
+
+ // Whether this node has dirty descendants for Servo's style system.
+ ELEMENT_HAS_DIRTY_DESCENDANTS_FOR_SERVO = ELEMENT_SHARED_RESTYLE_BIT_1,
+
+ // Whether this node has dirty descendants for animation-only restyle for
+ // Servo's style system.
+ ELEMENT_HAS_ANIMATION_ONLY_DIRTY_DESCENDANTS_FOR_SERVO =
+ ELEMENT_SHARED_RESTYLE_BIT_2,
+
+ // Whether the element has been snapshotted due to attribute or state changes
+ // by the Servo restyle manager.
+ ELEMENT_HAS_SNAPSHOT = ELEMENT_SHARED_RESTYLE_BIT_3,
+
+ // Whether the element has already handled its relevant snapshot.
+ //
+ // Used by the servo restyle process in order to accurately track whether the
+ // style of an element is up-to-date, even during the same restyle process.
+ ELEMENT_HANDLED_SNAPSHOT = ELEMENT_SHARED_RESTYLE_BIT_4,
+
// Set if the element has a pending style change.
- ELEMENT_HAS_PENDING_RESTYLE = NODE_SHARED_RESTYLE_BIT_1,
+ ELEMENT_HAS_PENDING_RESTYLE = ELEMENT_SHARED_RESTYLE_BIT_1,
// Set if the element is a potential restyle root (that is, has a style
// change pending _and_ that style change will attempt to restyle
// descendants).
- ELEMENT_IS_POTENTIAL_RESTYLE_ROOT = NODE_SHARED_RESTYLE_BIT_2,
+ ELEMENT_IS_POTENTIAL_RESTYLE_ROOT = ELEMENT_SHARED_RESTYLE_BIT_2,
// Set if the element has a pending animation-only style change as
// part of an animation-only style update (where we update styles from
// animation to the current refresh tick, but leave everything else as
// it was).
- ELEMENT_HAS_PENDING_ANIMATION_ONLY_RESTYLE = ELEMENT_FLAG_BIT(0),
+ ELEMENT_HAS_PENDING_ANIMATION_ONLY_RESTYLE = ELEMENT_SHARED_RESTYLE_BIT_3,
// Set if the element is a potential animation-only restyle root (that
// is, has an animation-only style change pending _and_ that style
// change will attempt to restyle descendants).
- ELEMENT_IS_POTENTIAL_ANIMATION_ONLY_RESTYLE_ROOT = ELEMENT_FLAG_BIT(1),
+ ELEMENT_IS_POTENTIAL_ANIMATION_ONLY_RESTYLE_ROOT = ELEMENT_SHARED_RESTYLE_BIT_4,
// Set if this element has a pending restyle with an eRestyle_SomeDescendants
// restyle hint.
- ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR = ELEMENT_FLAG_BIT(2),
+ ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR = ELEMENT_FLAG_BIT(4),
// Just the HAS_PENDING bits, for convenience
ELEMENT_PENDING_RESTYLE_FLAGS =
ELEMENT_HAS_PENDING_RESTYLE |
ELEMENT_HAS_PENDING_ANIMATION_ONLY_RESTYLE,
// Just the IS_POTENTIAL bits, for convenience
ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS =
@@ -117,20 +143,20 @@ enum {
ELEMENT_IS_POTENTIAL_ANIMATION_ONLY_RESTYLE_ROOT,
// All of the restyle bits together, for convenience.
ELEMENT_ALL_RESTYLE_FLAGS = ELEMENT_PENDING_RESTYLE_FLAGS |
ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS |
ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR,
// Set if this element is marked as 'scrollgrab' (see bug 912666)
- ELEMENT_HAS_SCROLLGRAB = ELEMENT_FLAG_BIT(3),
+ ELEMENT_HAS_SCROLLGRAB = ELEMENT_FLAG_BIT(5),
// Remaining bits are for subclasses
- ELEMENT_TYPE_SPECIFIC_BITS_OFFSET = NODE_TYPE_SPECIFIC_BITS_OFFSET + 4
+ ELEMENT_TYPE_SPECIFIC_BITS_OFFSET = NODE_TYPE_SPECIFIC_BITS_OFFSET + 6
};
#undef ELEMENT_FLAG_BIT
// Make sure we have space for our bits
ASSERT_NODE_FLAGS_SPACE(ELEMENT_TYPE_SPECIFIC_BITS_OFFSET);
namespace mozilla {
@@ -434,27 +460,27 @@ public:
Directionality GetComputedDirectionality() const;
inline Element* GetFlattenedTreeParentElement() const;
inline Element* GetFlattenedTreeParentElementForStyle() const;
bool HasDirtyDescendantsForServo() const
{
MOZ_ASSERT(IsStyledByServo());
- return HasFlag(NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO);
+ return HasFlag(ELEMENT_HAS_DIRTY_DESCENDANTS_FOR_SERVO);
}
void SetHasDirtyDescendantsForServo() {
MOZ_ASSERT(IsStyledByServo());
- SetFlags(NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO);
+ SetFlags(ELEMENT_HAS_DIRTY_DESCENDANTS_FOR_SERVO);
}
void UnsetHasDirtyDescendantsForServo() {
MOZ_ASSERT(IsStyledByServo());
- UnsetFlags(NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO);
+ UnsetFlags(ELEMENT_HAS_DIRTY_DESCENDANTS_FOR_SERVO);
}
inline void NoteDirtyDescendantsForServo();
#ifdef DEBUG
inline bool DirtyDescendantsBitIsPropagatedForServo();
#endif
--- a/dom/base/nsINode.h
+++ b/dom/base/nsINode.h
@@ -198,34 +198,18 @@ enum {
NODE_ALL_DIRECTION_FLAGS = NODE_HAS_DIRECTION_LTR |
NODE_HAS_DIRECTION_RTL,
NODE_CHROME_ONLY_ACCESS = NODE_FLAG_BIT(19),
NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS = NODE_FLAG_BIT(20),
- // These two bits are shared by Gecko's and Servo's restyle systems for
- // different purposes. They should not be accessed directly, and access to
- // them should be properly guarded by asserts.
- //
- // FIXME(bholley): These should move to Element, and we only need one now.
- NODE_SHARED_RESTYLE_BIT_1 = NODE_FLAG_BIT(21),
- NODE_SHARED_RESTYLE_BIT_2 = NODE_FLAG_BIT(22),
-
- // Whether this node has dirty descendants for Servo's style system.
- NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO = NODE_SHARED_RESTYLE_BIT_1,
-
- // Whether this node has dirty descendants for animation-only restyle for
- // Servo's style system.
- NODE_HAS_ANIMATION_ONLY_DIRTY_DESCENDANTS_FOR_SERVO =
- NODE_SHARED_RESTYLE_BIT_2,
-
// Remaining bits are node type specific.
- NODE_TYPE_SPECIFIC_BITS_OFFSET = 23
+ NODE_TYPE_SPECIFIC_BITS_OFFSET = 21
};
// Make sure we have space for our bits
#define ASSERT_NODE_FLAGS_SPACE(n) \
static_assert(WRAPPER_CACHE_FLAGS_BITS_USED + (n) <= \
sizeof(nsWrapperCache::FlagsType) * 8, \
"Not enough space for our bits")
ASSERT_NODE_FLAGS_SPACE(NODE_TYPE_SPECIFIC_BITS_OFFSET);