/* 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 https://mozilla.org/MPL/2.0/. */ //! DOM types to be shared between Rust and C++. use bitflags::bitflags; bitflags! { /// Event-based element states. #[repr(C)] #[derive(Clone, Copy, Eq, PartialEq)] pub struct ElementState: u64 { /// The mouse is down on this element. /// /// FIXME(#7333): set/unset this when appropriate const ACTIVE = 1 << 0; /// This element has focus. /// const FOCUS = 1 << 1; /// The mouse is hovering over this element. /// const HOVER = 1 << 2; /// Content is enabled (and can be disabled). /// const ENABLED = 1 << 3; /// Content is disabled. /// const DISABLED = 1 << 4; /// Content is checked. /// const CHECKED = 1 << 5; /// const INDETERMINATE = 1 << 6; /// const PLACEHOLDER_SHOWN = 1 << 7; /// const URLTARGET = 1 << 8; /// const FULLSCREEN = 1 << 9; /// const VALID = 1 << 10; /// const INVALID = 1 << 11; /// const USER_VALID = 1 << 12; /// const USER_INVALID = 1 << 13; /// Non-standard: https://developer.mozilla.org/en-US/docs/Web/CSS/:-moz-broken const BROKEN = 1 << 14; /// Non-standard: https://developer.mozilla.org/en-US/docs/Web/CSS/:-moz-loading const LOADING = 1 << 15; /// const REQUIRED = 1 << 16; /// /// We use an underscore to workaround a silly windows.h define. const OPTIONAL_ = 1 << 17; /// const DEFINED = 1 << 18; /// const VISITED = 1 << 19; /// const UNVISITED = 1 << 20; /// const VISITED_OR_UNVISITED = Self::VISITED.bits | Self::UNVISITED.bits; /// Non-standard: https://developer.mozilla.org/en-US/docs/Web/CSS/:-moz-drag-over const DRAGOVER = 1 << 21; /// const INRANGE = 1 << 22; /// const OUTOFRANGE = 1 << 23; /// const READONLY = 1 << 24; /// const READWRITE = 1 << 25; /// const DEFAULT = 1 << 26; /// Non-standard & undocumented. const OPTIMUM = 1 << 28; /// Non-standard & undocumented. const SUB_OPTIMUM = 1 << 29; /// Non-standard & undocumented. const SUB_SUB_OPTIMUM = 1 << 30; /// Non-standard & undocumented. const INCREMENT_SCRIPT_LEVEL = 1u64 << 31; /// const FOCUSRING = 1u64 << 32; /// const FOCUS_WITHIN = 1u64 << 33; /// :dir matching; the states are used for dynamic change detection. /// State that elements that match :dir(ltr) are in. const LTR = 1u64 << 34; /// State that elements that match :dir(rtl) are in. const RTL = 1u64 << 35; /// State that HTML elements that have a "dir" attr are in. const HAS_DIR_ATTR = 1u64 << 36; /// State that HTML elements with dir="ltr" (or something /// case-insensitively equal to "ltr") are in. const HAS_DIR_ATTR_LTR = 1u64 << 37; /// State that HTML elements with dir="rtl" (or something /// case-insensitively equal to "rtl") are in. const HAS_DIR_ATTR_RTL = 1u64 << 38; /// State that HTML elements without a valid-valued "dir" attr or /// any HTML elements (including ) with dir="auto" (or something /// case-insensitively equal to "auto") are in. const HAS_DIR_ATTR_LIKE_AUTO = 1u64 << 39; /// Non-standard & undocumented. const AUTOFILL = 1u64 << 40; /// Non-standard & undocumented. const AUTOFILL_PREVIEW = 1u64 << 41; /// State for modal elements: /// const MODAL = 1u64 << 42; /// const INERT = 1u64 << 43; /// State for the topmost modal element in top layer const TOPMOST_MODAL = 1u64 << 44; /// Initially used for the devtools highlighter, but now somehow only /// used for the devtools accessibility inspector. const DEVTOOLS_HIGHLIGHTED = 1u64 << 45; /// Used for the devtools style editor. Probably should go away. const STYLEEDITOR_TRANSITIONING = 1u64 << 46; /// For :-moz-value-empty (to show widgets like the reveal password /// button or the clear button). const VALUE_EMPTY = 1u64 << 47; /// For :-moz-revealed. const REVEALED = 1u64 << 48; /// https://html.spec.whatwg.org/#selector-popover-open /// Match element's popover visibility state of showing const POPOVER_OPEN = 1u64 << 49; /// Some convenience unions. const DIR_STATES = Self::LTR.bits | Self::RTL.bits; const DIR_ATTR_STATES = Self::HAS_DIR_ATTR.bits | Self::HAS_DIR_ATTR_LTR.bits | Self::HAS_DIR_ATTR_RTL.bits | Self::HAS_DIR_ATTR_LIKE_AUTO.bits; const DISABLED_STATES = Self::DISABLED.bits | Self::ENABLED.bits; const REQUIRED_STATES = Self::REQUIRED.bits | Self::OPTIONAL_.bits; /// Event states that can be added and removed through /// Element::{Add,Remove}ManuallyManagedStates. /// /// Take care when manually managing state bits. You are responsible /// for setting or clearing the bit when an Element is added or removed /// from a document (e.g. in BindToTree and UnbindFromTree), if that is /// an appropriate thing to do for your state bit. const MANUALLY_MANAGED_STATES = Self::AUTOFILL.bits | Self::AUTOFILL_PREVIEW.bits; /// Event states that are managed externally to an element (by the /// EventStateManager, or by other code). As opposed to those in /// INTRINSIC_STATES, which are are computed by the element itself /// and returned from Element::IntrinsicState. const EXTERNALLY_MANAGED_STATES = Self::MANUALLY_MANAGED_STATES.bits | Self::DIR_ATTR_STATES.bits | Self::DISABLED_STATES.bits | Self::REQUIRED_STATES.bits | Self::ACTIVE.bits | Self::DEFINED.bits | Self::DRAGOVER.bits | Self::FOCUS.bits | Self::FOCUSRING.bits | Self::FOCUS_WITHIN.bits | Self::FULLSCREEN.bits | Self::POPOVER_OPEN.bits | Self::HOVER.bits | Self::URLTARGET.bits | Self::MODAL.bits | Self::INERT.bits | Self::TOPMOST_MODAL.bits | Self::REVEALED.bits | Self::VALUE_EMPTY.bits; const INTRINSIC_STATES = !Self::EXTERNALLY_MANAGED_STATES.bits; } } bitflags! { /// Event-based document states. #[repr(C)] #[derive(Clone, Copy, Eq, PartialEq)] pub struct DocumentState: u64 { /// Window activation status const WINDOW_INACTIVE = 1 << 0; /// RTL locale: specific to the XUL localedir attribute const RTL_LOCALE = 1 << 1; /// LTR locale: specific to the XUL localedir attribute const LTR_LOCALE = 1 << 2; /// LWTheme status const LWTHEME = 1 << 3; const ALL_LOCALEDIR_BITS = Self::LTR_LOCALE.bits | Self::RTL_LOCALE.bits; } }