mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Hoist checked and indeterminate state into EventState.
This is necessary for those selectors to take advantage of restyle hints.
This commit is contained in:
parent
7512aa69c0
commit
f7f27a8146
2 changed files with 27 additions and 18 deletions
|
@ -85,19 +85,28 @@ use util::str::{DOMString, LengthOrPercentageOrAuto};
|
||||||
bitflags! {
|
bitflags! {
|
||||||
#[doc = "Element Event States."]
|
#[doc = "Element Event States."]
|
||||||
#[derive(JSTraceable, HeapSizeOf)]
|
#[derive(JSTraceable, HeapSizeOf)]
|
||||||
flags EventState: u8 {
|
flags EventState: u16 {
|
||||||
#[doc = "The mouse is down on this element. \
|
#[doc = "The mouse is down on this element. \
|
||||||
(https://html.spec.whatwg.org/multipage/#selector-active). \
|
(https://html.spec.whatwg.org/multipage/#selector-active). \
|
||||||
FIXME(#7333): set/unset this when appropriate"]
|
FIXME(#7333): set/unset this when appropriate"]
|
||||||
const IN_ACTIVE_STATE = 0x01,
|
const IN_ACTIVE_STATE = 0x01,
|
||||||
#[doc = "This element has focus."]
|
#[doc = "This element has focus.
|
||||||
|
https://html.spec.whatwg.org/multipage/scripting.html#selector-focus"]
|
||||||
const IN_FOCUS_STATE = 0x02,
|
const IN_FOCUS_STATE = 0x02,
|
||||||
#[doc = "The mouse is hovering over this element."]
|
#[doc = "The mouse is hovering over this element. \
|
||||||
|
https://html.spec.whatwg.org/multipage/scripting.html#selector-hover"]
|
||||||
const IN_HOVER_STATE = 0x04,
|
const IN_HOVER_STATE = 0x04,
|
||||||
#[doc = "Content is enabled (and can be disabled)."]
|
#[doc = "Content is enabled (and can be disabled). \
|
||||||
|
http://www.whatwg.org/html/#selector-enabled"]
|
||||||
const IN_ENABLED_STATE = 0x08,
|
const IN_ENABLED_STATE = 0x08,
|
||||||
#[doc = "Content is disabled."]
|
#[doc = "Content is disabled. \
|
||||||
|
http://www.whatwg.org/html/#selector-disabled"]
|
||||||
const IN_DISABLED_STATE = 0x10,
|
const IN_DISABLED_STATE = 0x10,
|
||||||
|
#[doc = "Content is checked. \
|
||||||
|
https://html.spec.whatwg.org/multipage/scripting.html#selector-checked"]
|
||||||
|
const IN_CHECKED_STATE = 0x20,
|
||||||
|
#[doc = "https://html.spec.whatwg.org/multipage/scripting.html#selector-indeterminate"]
|
||||||
|
const IN_INDETERMINATE_STATE = 0x40,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1834,7 +1843,11 @@ impl Element {
|
||||||
self.set_click_in_progress(false);
|
self.set_click_in_progress(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_state(&self, which: EventState, value: bool) {
|
pub fn get_state(&self) -> EventState {
|
||||||
|
self.event_state.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_state(&self, which: EventState, value: bool) {
|
||||||
let mut state = self.event_state.get();
|
let mut state = self.event_state.get();
|
||||||
if state.contains(which) == value {
|
if state.contains(which) == value {
|
||||||
return
|
return
|
||||||
|
|
|
@ -15,7 +15,7 @@ use dom::bindings::conversions::Castable;
|
||||||
use dom::bindings::global::GlobalRef;
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::js::{JS, LayoutJS, Root, RootedReference};
|
use dom::bindings::js::{JS, LayoutJS, Root, RootedReference};
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::element::{AttributeMutation, Element, IN_ENABLED_STATE, RawLayoutElementHelpers};
|
use dom::element::{AttributeMutation, Element, IN_CHECKED_STATE, IN_ENABLED_STATE, IN_INDETERMINATE_STATE, RawLayoutElementHelpers};
|
||||||
use dom::event::{Event, EventBubbles, EventCancelable};
|
use dom::event::{Event, EventBubbles, EventCancelable};
|
||||||
use dom::eventtarget::EventTarget;
|
use dom::eventtarget::EventTarget;
|
||||||
use dom::htmlelement::HTMLElement;
|
use dom::htmlelement::HTMLElement;
|
||||||
|
@ -57,10 +57,8 @@ enum InputType {
|
||||||
pub struct HTMLInputElement {
|
pub struct HTMLInputElement {
|
||||||
htmlelement: HTMLElement,
|
htmlelement: HTMLElement,
|
||||||
input_type: Cell<InputType>,
|
input_type: Cell<InputType>,
|
||||||
checked: Cell<bool>,
|
|
||||||
checked_changed: Cell<bool>,
|
checked_changed: Cell<bool>,
|
||||||
placeholder: DOMRefCell<DOMString>,
|
placeholder: DOMRefCell<DOMString>,
|
||||||
indeterminate: Cell<bool>,
|
|
||||||
value_changed: Cell<bool>,
|
value_changed: Cell<bool>,
|
||||||
size: Cell<u32>,
|
size: Cell<u32>,
|
||||||
#[ignore_heap_size_of = "#7193"]
|
#[ignore_heap_size_of = "#7193"]
|
||||||
|
@ -111,9 +109,7 @@ impl HTMLInputElement {
|
||||||
HTMLElement::new_inherited_with_state(IN_ENABLED_STATE,
|
HTMLElement::new_inherited_with_state(IN_ENABLED_STATE,
|
||||||
localName, prefix, document),
|
localName, prefix, document),
|
||||||
input_type: Cell::new(InputType::InputText),
|
input_type: Cell::new(InputType::InputText),
|
||||||
checked: Cell::new(false),
|
|
||||||
placeholder: DOMRefCell::new("".to_owned()),
|
placeholder: DOMRefCell::new("".to_owned()),
|
||||||
indeterminate: Cell::new(false),
|
|
||||||
checked_changed: Cell::new(false),
|
checked_changed: Cell::new(false),
|
||||||
value_changed: Cell::new(false),
|
value_changed: Cell::new(false),
|
||||||
size: Cell::new(DEFAULT_INPUT_SIZE),
|
size: Cell::new(DEFAULT_INPUT_SIZE),
|
||||||
|
@ -204,13 +200,13 @@ impl RawLayoutHTMLInputElementHelpers for HTMLInputElement {
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
unsafe fn get_checked_state_for_layout(&self) -> bool {
|
unsafe fn get_checked_state_for_layout(&self) -> bool {
|
||||||
self.checked.get()
|
self.Checked()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
unsafe fn get_indeterminate_state_for_layout(&self) -> bool {
|
unsafe fn get_indeterminate_state_for_layout(&self) -> bool {
|
||||||
self.indeterminate.get()
|
self.Indeterminate()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
|
@ -240,7 +236,7 @@ impl HTMLInputElementMethods for HTMLInputElement {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-input-checked
|
// https://html.spec.whatwg.org/multipage/#dom-input-checked
|
||||||
fn Checked(&self) -> bool {
|
fn Checked(&self) -> bool {
|
||||||
self.checked.get()
|
self.upcast::<Element>().get_state().contains(IN_CHECKED_STATE)
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-input-checked
|
// https://html.spec.whatwg.org/multipage/#dom-input-checked
|
||||||
|
@ -329,12 +325,12 @@ impl HTMLInputElementMethods for HTMLInputElement {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-input-indeterminate
|
// https://html.spec.whatwg.org/multipage/#dom-input-indeterminate
|
||||||
fn Indeterminate(&self) -> bool {
|
fn Indeterminate(&self) -> bool {
|
||||||
self.indeterminate.get()
|
self.upcast::<Element>().get_state().contains(IN_INDETERMINATE_STATE)
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-input-indeterminate
|
// https://html.spec.whatwg.org/multipage/#dom-input-indeterminate
|
||||||
fn SetIndeterminate(&self, val: bool) {
|
fn SetIndeterminate(&self, val: bool) {
|
||||||
self.indeterminate.set(val)
|
self.upcast::<Element>().set_state(IN_INDETERMINATE_STATE, val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -443,7 +439,7 @@ impl HTMLInputElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_checked_state(&self, checked: bool, dirty: bool) {
|
fn update_checked_state(&self, checked: bool, dirty: bool) {
|
||||||
self.checked.set(checked);
|
self.upcast::<Element>().set_state(IN_CHECKED_STATE, checked);
|
||||||
|
|
||||||
if dirty {
|
if dirty {
|
||||||
self.checked_changed.set(true);
|
self.checked_changed.set(true);
|
||||||
|
@ -459,7 +455,7 @@ impl HTMLInputElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_indeterminate_state(&self) -> bool {
|
pub fn get_indeterminate_state(&self) -> bool {
|
||||||
self.indeterminate.get()
|
self.Indeterminate()
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#concept-fe-mutable
|
// https://html.spec.whatwg.org/multipage/#concept-fe-mutable
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue