mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Implement form-associated custom elements and their ElementInternals (#31980)
* FACEs work, setFormValue test is awful so now has _mozilla backup * 1. Impl Validatable in ElementInternals instead of HTMLElement. 2. Reuse the code in Validatable trait. 3. The form associated custom element is not a customized built-in element. * add some comments * support readonly attribute and complete barred from constraint validation * Addressed the code review comments * Updated the legacy-layout results * Fixed the WPT failures in ElementInternals-validation.html * Addressed the code review comments * Review suggestions * Fixed silly mistakes and update the test result outside elementinternals * update the test results --------- Co-authored-by: Patrick Shaughnessy <pshaughn@comcast.net> Co-authored-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
2eb959a159
commit
4e4a4c0a28
67 changed files with 1641 additions and 619 deletions
|
@ -10,6 +10,7 @@ use dom_struct::dom_struct;
|
|||
use itertools::Itertools;
|
||||
use style_traits::dom::ElementState;
|
||||
|
||||
use super::bindings::codegen::Bindings::ElementInternalsBinding::ValidityStateFlags;
|
||||
use crate::dom::bindings::cell::{DomRefCell, Ref};
|
||||
use crate::dom::bindings::codegen::Bindings::ValidityStateBinding::ValidityStateMethods;
|
||||
use crate::dom::bindings::inheritance::Castable;
|
||||
|
@ -129,20 +130,22 @@ impl ValidityState {
|
|||
self.update_pseudo_classes();
|
||||
}
|
||||
|
||||
pub fn update_invalid_flags(&self, update_flags: ValidationFlags) {
|
||||
self.invalid_flags.set(update_flags);
|
||||
}
|
||||
|
||||
pub fn invalid_flags(&self) -> ValidationFlags {
|
||||
self.invalid_flags.get()
|
||||
}
|
||||
|
||||
fn update_pseudo_classes(&self) {
|
||||
if let Some(validatable) = self.element.as_maybe_validatable() {
|
||||
if validatable.is_instance_validatable() {
|
||||
let is_valid = self.invalid_flags.get().is_empty();
|
||||
self.element.set_state(ElementState::VALID, is_valid);
|
||||
self.element.set_state(ElementState::INVALID, !is_valid);
|
||||
} else {
|
||||
self.element.set_state(ElementState::VALID, false);
|
||||
self.element.set_state(ElementState::INVALID, false);
|
||||
}
|
||||
pub fn update_pseudo_classes(&self) {
|
||||
if self.element.is_instance_validatable() {
|
||||
let is_valid = self.invalid_flags.get().is_empty();
|
||||
self.element.set_state(ElementState::VALID, is_valid);
|
||||
self.element.set_state(ElementState::INVALID, !is_valid);
|
||||
} else {
|
||||
self.element.set_state(ElementState::VALID, false);
|
||||
self.element.set_state(ElementState::INVALID, false);
|
||||
}
|
||||
|
||||
if let Some(form_control) = self.element.as_maybe_form_control() {
|
||||
|
@ -225,3 +228,40 @@ impl ValidityStateMethods for ValidityState {
|
|||
self.invalid_flags().is_empty()
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&ValidityStateFlags> for ValidationFlags {
|
||||
fn from(flags: &ValidityStateFlags) -> Self {
|
||||
let mut bits = ValidationFlags::empty();
|
||||
if flags.valueMissing {
|
||||
bits |= ValidationFlags::VALUE_MISSING;
|
||||
}
|
||||
if flags.typeMismatch {
|
||||
bits |= ValidationFlags::TYPE_MISMATCH;
|
||||
}
|
||||
if flags.patternMismatch {
|
||||
bits |= ValidationFlags::PATTERN_MISMATCH;
|
||||
}
|
||||
if flags.tooLong {
|
||||
bits |= ValidationFlags::TOO_LONG;
|
||||
}
|
||||
if flags.tooShort {
|
||||
bits |= ValidationFlags::TOO_SHORT;
|
||||
}
|
||||
if flags.rangeUnderflow {
|
||||
bits |= ValidationFlags::RANGE_UNDERFLOW;
|
||||
}
|
||||
if flags.rangeOverflow {
|
||||
bits |= ValidationFlags::RANGE_OVERFLOW;
|
||||
}
|
||||
if flags.stepMismatch {
|
||||
bits |= ValidationFlags::STEP_MISMATCH;
|
||||
}
|
||||
if flags.badInput {
|
||||
bits |= ValidationFlags::BAD_INPUT;
|
||||
}
|
||||
if flags.customError {
|
||||
bits |= ValidationFlags::CUSTOM_ERROR;
|
||||
}
|
||||
bits
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue