mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Auto merge of #27255 - avr1254:master, r=jdm
Implemented HTMLFormElement.relList <!-- Please describe your changes on the following line: --> Updated the tests to reflect addition of rel and relList for HTMLFormElement, as well as porting those code snippets from HTMLAnchorElement. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #27252 (GitHub issue number if applicable) <!-- Either: --> - [X] There are tests for these changes OR - [ ] These changes do not require tests because ___ <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
This commit is contained in:
commit
c8d0548824
4 changed files with 33 additions and 17 deletions
|
@ -20,10 +20,11 @@ use crate::dom::bindings::error::{Error, Fallible};
|
||||||
use crate::dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
use crate::dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
||||||
use crate::dom::bindings::refcounted::Trusted;
|
use crate::dom::bindings::refcounted::Trusted;
|
||||||
use crate::dom::bindings::reflector::DomObject;
|
use crate::dom::bindings::reflector::DomObject;
|
||||||
use crate::dom::bindings::root::{Dom, DomOnceCell, DomRoot};
|
use crate::dom::bindings::root::{Dom, DomOnceCell, DomRoot, MutNullableDom};
|
||||||
use crate::dom::bindings::str::DOMString;
|
use crate::dom::bindings::str::DOMString;
|
||||||
use crate::dom::blob::Blob;
|
use crate::dom::blob::Blob;
|
||||||
use crate::dom::document::Document;
|
use crate::dom::document::Document;
|
||||||
|
use crate::dom::domtokenlist::DOMTokenList;
|
||||||
use crate::dom::element::{AttributeMutation, Element};
|
use crate::dom::element::{AttributeMutation, Element};
|
||||||
use crate::dom::event::{Event, EventBubbles, EventCancelable};
|
use crate::dom::event::{Event, EventBubbles, EventCancelable};
|
||||||
use crate::dom::eventtarget::EventTarget;
|
use crate::dom::eventtarget::EventTarget;
|
||||||
|
@ -68,6 +69,7 @@ use servo_atoms::Atom;
|
||||||
use servo_rand::random;
|
use servo_rand::random;
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
use style::attr::AttrValue;
|
||||||
use style::str::split_html_space_chars;
|
use style::str::split_html_space_chars;
|
||||||
|
|
||||||
use crate::dom::bindings::codegen::UnionTypes::RadioNodeListOrElement;
|
use crate::dom::bindings::codegen::UnionTypes::RadioNodeListOrElement;
|
||||||
|
@ -90,6 +92,7 @@ pub struct HTMLFormElement {
|
||||||
controls: DomRefCell<Vec<Dom<Element>>>,
|
controls: DomRefCell<Vec<Dom<Element>>>,
|
||||||
past_names_map: DomRefCell<HashMap<Atom, (Dom<Element>, Tm)>>,
|
past_names_map: DomRefCell<HashMap<Atom, (Dom<Element>, Tm)>>,
|
||||||
firing_submission_events: Cell<bool>,
|
firing_submission_events: Cell<bool>,
|
||||||
|
rel_list: MutNullableDom<DOMTokenList>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLFormElement {
|
impl HTMLFormElement {
|
||||||
|
@ -107,6 +110,7 @@ impl HTMLFormElement {
|
||||||
controls: DomRefCell::new(Vec::new()),
|
controls: DomRefCell::new(Vec::new()),
|
||||||
past_names_map: DomRefCell::new(HashMap::new()),
|
past_names_map: DomRefCell::new(HashMap::new()),
|
||||||
firing_submission_events: Cell::new(false),
|
firing_submission_events: Cell::new(false),
|
||||||
|
rel_list: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,6 +245,9 @@ impl HTMLFormElementMethods for HTMLFormElement {
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-fs-target
|
// https://html.spec.whatwg.org/multipage/#dom-fs-target
|
||||||
make_setter!(SetTarget, "target");
|
make_setter!(SetTarget, "target");
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#dom-a-rel
|
||||||
|
make_getter!(Rel, "rel");
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#the-form-element:concept-form-submit
|
// https://html.spec.whatwg.org/multipage/#the-form-element:concept-form-submit
|
||||||
fn Submit(&self) {
|
fn Submit(&self) {
|
||||||
self.submit(SubmittedFrom::FromForm, FormSubmitter::FormElement(self));
|
self.submit(SubmittedFrom::FromForm, FormSubmitter::FormElement(self));
|
||||||
|
@ -434,6 +441,18 @@ impl HTMLFormElementMethods for HTMLFormElement {
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#dom-a-rel
|
||||||
|
fn SetRel(&self, rel: DOMString) {
|
||||||
|
self.upcast::<Element>()
|
||||||
|
.set_tokenlist_attribute(&local_name!("rel"), rel);
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/#dom-a-rellist
|
||||||
|
fn RelList(&self) -> DomRoot<DOMTokenList> {
|
||||||
|
self.rel_list
|
||||||
|
.or_init(|| DOMTokenList::new(self.upcast(), &local_name!("rel")))
|
||||||
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#the-form-element:supported-property-names
|
// https://html.spec.whatwg.org/multipage/#the-form-element:supported-property-names
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
fn SupportedPropertyNames(&self) -> Vec<DOMString> {
|
fn SupportedPropertyNames(&self) -> Vec<DOMString> {
|
||||||
|
@ -1636,6 +1655,16 @@ impl VirtualMethods for HTMLFormElement {
|
||||||
.reset_form_owner();
|
.reset_form_owner();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
|
||||||
|
match name {
|
||||||
|
&local_name!("rel") => AttrValue::from_serialized_tokenlist(value.into()),
|
||||||
|
_ => self
|
||||||
|
.super_type()
|
||||||
|
.unwrap()
|
||||||
|
.parse_plain_attribute(name, value),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait FormControlElementHelpers {
|
pub trait FormControlElementHelpers {
|
||||||
|
|
|
@ -25,6 +25,9 @@ interface HTMLFormElement : HTMLElement {
|
||||||
attribute boolean noValidate;
|
attribute boolean noValidate;
|
||||||
[CEReactions]
|
[CEReactions]
|
||||||
attribute DOMString target;
|
attribute DOMString target;
|
||||||
|
[CEReactions]
|
||||||
|
attribute DOMString rel;
|
||||||
|
[SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
|
||||||
|
|
||||||
[SameObject] readonly attribute HTMLFormControlsCollection elements;
|
[SameObject] readonly attribute HTMLFormControlsCollection elements;
|
||||||
readonly attribute unsigned long length;
|
readonly attribute unsigned long length;
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[put-forwards.html]
|
|
||||||
type: testharness
|
|
||||||
[Setting form.relList to noreferrer is reflected in rel]
|
|
||||||
expected: FAIL
|
|
|
@ -1911,9 +1911,6 @@
|
||||||
[HTMLElement interface: attribute accessKey]
|
[HTMLElement interface: attribute accessKey]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[HTMLFormElement interface: attribute rel]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type]
|
[HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -2547,9 +2544,6 @@
|
||||||
[HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type]
|
[HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[HTMLFormElement interface: attribute relList]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type]
|
[HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -3237,9 +3231,6 @@
|
||||||
[HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type]
|
[HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[HTMLFormElement interface: document.createElement("form") must inherit property "rel" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[HTMLIFrameElement interface: attribute allowPaymentRequest]
|
[HTMLIFrameElement interface: attribute allowPaymentRequest]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -3375,9 +3366,6 @@
|
||||||
[HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type]
|
[HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[HTMLFormElement interface: document.createElement("form") must inherit property "relList" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type]
|
[HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue