Bug 1328806 - Map more state bits from Gecko to Servo. r?heycam
MozReview-Commit-ID: CX54Z1cERBZ
--- a/dom/events/EventStates.h
+++ b/dom/events/EventStates.h
@@ -7,30 +7,30 @@
#ifndef mozilla_EventStates_h_
#define mozilla_EventStates_h_
#include "mozilla/Attributes.h"
#include "nsDebug.h"
namespace mozilla {
-#define NS_EVENT_STATE_HIGHEST_SERVO_BIT 6
+#define NS_EVENT_STATE_HIGHEST_SERVO_BIT 9
/**
* EventStates is the class used to represent the event states of nsIContent
* instances. These states are calculated by IntrinsicState() and
* ContentStatesChanged() has to be called when one of them changes thus
* informing the layout/style engine of the change.
* Event states are associated with pseudo-classes.
*/
class EventStates
{
public:
typedef uint64_t InternalType;
- typedef uint8_t ServoType;
+ typedef uint16_t ServoType;
constexpr EventStates()
: mStates(0)
{
}
// NOTE: the ideal scenario would be to have the default constructor public
// setting mStates to 0 and this constructor (without = 0) private.
@@ -205,104 +205,110 @@ private:
// Content is enabled (and can be disabled).
#define NS_EVENT_STATE_ENABLED NS_DEFINE_EVENT_STATE_MACRO(3)
// Content is disabled.
#define NS_EVENT_STATE_DISABLED NS_DEFINE_EVENT_STATE_MACRO(4)
// Content is checked.
#define NS_EVENT_STATE_CHECKED NS_DEFINE_EVENT_STATE_MACRO(5)
// Content is in the indeterminate state.
#define NS_EVENT_STATE_INDETERMINATE NS_DEFINE_EVENT_STATE_MACRO(6)
+// Content shows its placeholder
+#define NS_EVENT_STATE_PLACEHOLDERSHOWN NS_DEFINE_EVENT_STATE_MACRO(7)
+// Content is URL's target (ref).
+#define NS_EVENT_STATE_URLTARGET NS_DEFINE_EVENT_STATE_MACRO(8)
+// Content is the full screen element, or a frame containing the
+// current full-screen element.
+#define NS_EVENT_STATE_FULL_SCREEN NS_DEFINE_EVENT_STATE_MACRO(9)
/*
* Bits below here do not have Servo-related ordering constraints.
*
* Remember to change NS_EVENT_STATE_HIGHEST_SERVO_BIT at the top of the file if
* this changes!
*/
// Drag is hovering over content.
-#define NS_EVENT_STATE_DRAGOVER NS_DEFINE_EVENT_STATE_MACRO(7)
-// Content is URL's target (ref).
-#define NS_EVENT_STATE_URLTARGET NS_DEFINE_EVENT_STATE_MACRO(8)
+#define NS_EVENT_STATE_DRAGOVER NS_DEFINE_EVENT_STATE_MACRO(10)
// Content is required.
-#define NS_EVENT_STATE_REQUIRED NS_DEFINE_EVENT_STATE_MACRO(9)
+#define NS_EVENT_STATE_REQUIRED NS_DEFINE_EVENT_STATE_MACRO(11)
// Content is optional (and can be required).
-#define NS_EVENT_STATE_OPTIONAL NS_DEFINE_EVENT_STATE_MACRO(10)
+#define NS_EVENT_STATE_OPTIONAL NS_DEFINE_EVENT_STATE_MACRO(12)
// Link has been visited.
-#define NS_EVENT_STATE_VISITED NS_DEFINE_EVENT_STATE_MACRO(11)
+#define NS_EVENT_STATE_VISITED NS_DEFINE_EVENT_STATE_MACRO(13)
// Link hasn't been visited.
-#define NS_EVENT_STATE_UNVISITED NS_DEFINE_EVENT_STATE_MACRO(12)
+#define NS_EVENT_STATE_UNVISITED NS_DEFINE_EVENT_STATE_MACRO(14)
// Content is valid (and can be invalid).
-#define NS_EVENT_STATE_VALID NS_DEFINE_EVENT_STATE_MACRO(13)
+#define NS_EVENT_STATE_VALID NS_DEFINE_EVENT_STATE_MACRO(15)
// Content is invalid.
-#define NS_EVENT_STATE_INVALID NS_DEFINE_EVENT_STATE_MACRO(14)
+#define NS_EVENT_STATE_INVALID NS_DEFINE_EVENT_STATE_MACRO(16)
// Content value is in-range (and can be out-of-range).
-#define NS_EVENT_STATE_INRANGE NS_DEFINE_EVENT_STATE_MACRO(15)
+#define NS_EVENT_STATE_INRANGE NS_DEFINE_EVENT_STATE_MACRO(17)
// Content value is out-of-range.
-#define NS_EVENT_STATE_OUTOFRANGE NS_DEFINE_EVENT_STATE_MACRO(16)
+#define NS_EVENT_STATE_OUTOFRANGE NS_DEFINE_EVENT_STATE_MACRO(18)
// These two are temporary (see bug 302188)
// Content is read-only.
-#define NS_EVENT_STATE_MOZ_READONLY NS_DEFINE_EVENT_STATE_MACRO(17)
+#define NS_EVENT_STATE_MOZ_READONLY NS_DEFINE_EVENT_STATE_MACRO(19)
// Content is editable.
-#define NS_EVENT_STATE_MOZ_READWRITE NS_DEFINE_EVENT_STATE_MACRO(18)
+#define NS_EVENT_STATE_MOZ_READWRITE NS_DEFINE_EVENT_STATE_MACRO(20)
// Content is the default one (meaning depends of the context).
-#define NS_EVENT_STATE_DEFAULT NS_DEFINE_EVENT_STATE_MACRO(19)
+#define NS_EVENT_STATE_DEFAULT NS_DEFINE_EVENT_STATE_MACRO(21)
// Content could not be rendered (image/object/etc).
-#define NS_EVENT_STATE_BROKEN NS_DEFINE_EVENT_STATE_MACRO(20)
+#define NS_EVENT_STATE_BROKEN NS_DEFINE_EVENT_STATE_MACRO(22)
// Content disabled by the user (images turned off, say).
-#define NS_EVENT_STATE_USERDISABLED NS_DEFINE_EVENT_STATE_MACRO(21)
+#define NS_EVENT_STATE_USERDISABLED NS_DEFINE_EVENT_STATE_MACRO(23)
// Content suppressed by the user (ad blocking, etc).
-#define NS_EVENT_STATE_SUPPRESSED NS_DEFINE_EVENT_STATE_MACRO(22)
+#define NS_EVENT_STATE_SUPPRESSED NS_DEFINE_EVENT_STATE_MACRO(24)
// Content is still loading such that there is nothing to show the
// user (eg an image which hasn't started coming in yet).
-#define NS_EVENT_STATE_LOADING NS_DEFINE_EVENT_STATE_MACRO(23)
-#define NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL NS_DEFINE_EVENT_STATE_MACRO(25)
+#define NS_EVENT_STATE_LOADING NS_DEFINE_EVENT_STATE_MACRO(25)
+#define NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL NS_DEFINE_EVENT_STATE_MACRO(26)
// Handler for the content has been blocked.
-#define NS_EVENT_STATE_HANDLER_BLOCKED NS_DEFINE_EVENT_STATE_MACRO(26)
+#define NS_EVENT_STATE_HANDLER_BLOCKED NS_DEFINE_EVENT_STATE_MACRO(27)
// Handler for the content has been disabled.
-#define NS_EVENT_STATE_HANDLER_DISABLED NS_DEFINE_EVENT_STATE_MACRO(27)
+#define NS_EVENT_STATE_HANDLER_DISABLED NS_DEFINE_EVENT_STATE_MACRO(28)
// Handler for the content has crashed
-#define NS_EVENT_STATE_HANDLER_CRASHED NS_DEFINE_EVENT_STATE_MACRO(28)
+#define NS_EVENT_STATE_HANDLER_CRASHED NS_DEFINE_EVENT_STATE_MACRO(29)
// Content has focus and should show a ring.
-#define NS_EVENT_STATE_FOCUSRING NS_DEFINE_EVENT_STATE_MACRO(29)
+#define NS_EVENT_STATE_FOCUSRING NS_DEFINE_EVENT_STATE_MACRO(30)
// Content is a submit control and the form isn't valid.
-#define NS_EVENT_STATE_MOZ_SUBMITINVALID NS_DEFINE_EVENT_STATE_MACRO(30)
+#define NS_EVENT_STATE_MOZ_SUBMITINVALID NS_DEFINE_EVENT_STATE_MACRO(31)
// UI friendly version of :invalid pseudo-class.
-#define NS_EVENT_STATE_MOZ_UI_INVALID NS_DEFINE_EVENT_STATE_MACRO(31)
+#define NS_EVENT_STATE_MOZ_UI_INVALID NS_DEFINE_EVENT_STATE_MACRO(32)
// UI friendly version of :valid pseudo-class.
-#define NS_EVENT_STATE_MOZ_UI_VALID NS_DEFINE_EVENT_STATE_MACRO(32)
-// Content is the full screen element, or a frame containing the
-// current full-screen element.
-#define NS_EVENT_STATE_FULL_SCREEN NS_DEFINE_EVENT_STATE_MACRO(33)
+#define NS_EVENT_STATE_MOZ_UI_VALID NS_DEFINE_EVENT_STATE_MACRO(33)
// This bit is currently free.
// #define NS_EVENT_STATE_?????????? NS_DEFINE_EVENT_STATE_MACRO(34)
// Handler for click to play plugin
#define NS_EVENT_STATE_TYPE_CLICK_TO_PLAY NS_DEFINE_EVENT_STATE_MACRO(35)
// Content is in the optimum region.
#define NS_EVENT_STATE_OPTIMUM NS_DEFINE_EVENT_STATE_MACRO(36)
// Content is in the suboptimal region.
#define NS_EVENT_STATE_SUB_OPTIMUM NS_DEFINE_EVENT_STATE_MACRO(37)
// Content is in the sub-suboptimal region.
#define NS_EVENT_STATE_SUB_SUB_OPTIMUM NS_DEFINE_EVENT_STATE_MACRO(38)
// Handler for click to play plugin (vulnerable w/update)
#define NS_EVENT_STATE_VULNERABLE_UPDATABLE NS_DEFINE_EVENT_STATE_MACRO(39)
// Handler for click to play plugin (vulnerable w/no update)
#define NS_EVENT_STATE_VULNERABLE_NO_UPDATE NS_DEFINE_EVENT_STATE_MACRO(40)
+// This bit is currently free.
+// #define NS_EVENT_STATE_?????????? NS_DEFINE_EVENT_STATE_MACRO(41)
// Element is ltr (for :dir pseudo-class)
#define NS_EVENT_STATE_LTR NS_DEFINE_EVENT_STATE_MACRO(42)
// Element is rtl (for :dir pseudo-class)
#define NS_EVENT_STATE_RTL NS_DEFINE_EVENT_STATE_MACRO(43)
+// This bit is currently free.
+// #define NS_EVENT_STATE_?????????? NS_DEFINE_EVENT_STATE_MACRO(44)
// Element is highlighted (devtools inspector)
#define NS_EVENT_STATE_DEVTOOLS_HIGHLIGHTED NS_DEFINE_EVENT_STATE_MACRO(45)
// Element is an unresolved custom element candidate
#define NS_EVENT_STATE_UNRESOLVED NS_DEFINE_EVENT_STATE_MACRO(46)
// Element is transitioning for rules changed by style editor
#define NS_EVENT_STATE_STYLEEDITOR_TRANSITIONING NS_DEFINE_EVENT_STATE_MACRO(47)
-// Content shows its placeholder
-#define NS_EVENT_STATE_PLACEHOLDERSHOWN NS_DEFINE_EVENT_STATE_MACRO(48)
+// This bit is currently free.
+// #define NS_EVENT_STATE_?????????? NS_DEFINE_EVENT_STATE_MACRO(48)
// Element has focus-within.
#define NS_EVENT_STATE_FOCUS_WITHIN NS_DEFINE_EVENT_STATE_MACRO(49)
// Event state that is used for values that need to be parsed but do nothing.
#define NS_EVENT_STATE_IGNORE NS_DEFINE_EVENT_STATE_MACRO(63)
/**
* NOTE: do not go over 63 without updating EventStates::InternalType!
--- a/layout/style/ServoBindings.h
+++ b/layout/style/ServoBindings.h
@@ -110,17 +110,17 @@ void Gecko_LoadStyleSheet(mozilla::css::
// optional heap-allocated iterator for nodes that need it. If the creation
// method returns null, Servo falls back to the aforementioned simpler (and
// faster) sibling traversal.
StyleChildrenIteratorOwnedOrNull Gecko_MaybeCreateStyleChildrenIterator(RawGeckoNodeBorrowed node);
void Gecko_DropStyleChildrenIterator(StyleChildrenIteratorOwned it);
RawGeckoNodeBorrowedOrNull Gecko_GetNextStyleChild(StyleChildrenIteratorBorrowedMut it);
// Selector Matching.
-uint8_t Gecko_ElementState(RawGeckoElementBorrowed element);
+uint16_t Gecko_ElementState(RawGeckoElementBorrowed element);
bool Gecko_IsHTMLElementInHTMLDocument(RawGeckoElementBorrowed element);
bool Gecko_IsLink(RawGeckoElementBorrowed element);
bool Gecko_IsTextNode(RawGeckoNodeBorrowed node);
bool Gecko_IsVisitedLink(RawGeckoElementBorrowed element);
bool Gecko_IsUnvisitedLink(RawGeckoElementBorrowed element);
bool Gecko_IsRootElement(RawGeckoElementBorrowed element);
nsIAtom* Gecko_LocalName(RawGeckoElementBorrowed element);
nsIAtom* Gecko_Namespace(RawGeckoElementBorrowed element);
--- a/servo/components/style/element_state.rs
+++ b/servo/components/style/element_state.rs
@@ -26,18 +26,18 @@ bitflags! {
#[doc = "Content is disabled. \
http://www.whatwg.org/html/#selector-disabled"]
const IN_DISABLED_STATE = 0x10,
#[doc = "Content is checked. \
https://html.spec.whatwg.org/multipage/#selector-checked"]
const IN_CHECKED_STATE = 0x20,
#[doc = "https://html.spec.whatwg.org/multipage/#selector-indeterminate"]
const IN_INDETERMINATE_STATE = 0x40,
+ #[doc = "https://html.spec.whatwg.org/multipage/#selector-placeholder-shown"]
+ const IN_PLACEHOLDER_SHOWN_STATE = 0x80,
+ #[doc = "https://html.spec.whatwg.org/multipage/#selector-target"]
+ const IN_TARGET_STATE = 0x100,
+ #[doc = "https://fullscreen.spec.whatwg.org/#%3Afullscreen-pseudo-class"]
+ const IN_FULLSCREEN_STATE = 0x200,
#[doc = "https://html.spec.whatwg.org/multipage/#selector-read-write"]
- const IN_READ_WRITE_STATE = 0x80,
- #[doc = "https://html.spec.whatwg.org/multipage/#selector-placeholder-shown"]
- const IN_PLACEHOLDER_SHOWN_STATE = 0x0100,
- #[doc = "https://html.spec.whatwg.org/multipage/#selector-target"]
- const IN_TARGET_STATE = 0x0200,
- #[doc = "https://fullscreen.spec.whatwg.org/#%3Afullscreen-pseudo-class"]
- const IN_FULLSCREEN_STATE = 0x0400,
+ const IN_READ_WRITE_STATE = 0x400,
}
}
--- a/servo/components/style/gecko/wrapper.rs
+++ b/servo/components/style/gecko/wrapper.rs
@@ -298,17 +298,17 @@ impl<'le> TElement for GeckoElement<'le>
fn style_attribute(&self) -> Option<&Arc<RwLock<PropertyDeclarationBlock>>> {
let declarations = unsafe { Gecko_GetServoDeclarationBlock(self.0) };
declarations.map(|s| s.as_arc_opt()).unwrap_or(None)
}
fn get_state(&self) -> ElementState {
unsafe {
- ElementState::from_bits_truncate(Gecko_ElementState(self.0) as u16)
+ ElementState::from_bits_truncate(Gecko_ElementState(self.0))
}
}
#[inline]
fn has_attr(&self, namespace: &Namespace, attr: &Atom) -> bool {
unsafe {
bindings::Gecko_HasAttr(self.0,
namespace.0.as_ptr(),
--- a/servo/components/style/gecko_bindings/bindings.rs
+++ b/servo/components/style/gecko_bindings/bindings.rs
@@ -341,17 +341,17 @@ extern "C" {
extern "C" {
pub fn Gecko_DropStyleChildrenIterator(it: StyleChildrenIteratorOwned);
}
extern "C" {
pub fn Gecko_GetNextStyleChild(it: StyleChildrenIteratorBorrowedMut)
-> RawGeckoNodeBorrowedOrNull;
}
extern "C" {
- pub fn Gecko_ElementState(element: RawGeckoElementBorrowed) -> u8;
+ pub fn Gecko_ElementState(element: RawGeckoElementBorrowed) -> u16;
}
extern "C" {
pub fn Gecko_IsHTMLElementInHTMLDocument(element: RawGeckoElementBorrowed)
-> bool;
}
extern "C" {
pub fn Gecko_IsLink(element: RawGeckoElementBorrowed) -> bool;
}