mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
HTMLFormElement::Elements should honor [SameObject] attribute
Ideally, this would get tested by web-platform-tests, but that has yet to be implemented: https://github.com/w3c/web-platform-tests/issues/2462
This commit is contained in:
parent
4056716ecd
commit
1ff1ec69dd
3 changed files with 36 additions and 2 deletions
|
@ -13,7 +13,7 @@ use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaEl
|
||||||
use dom::bindings::conversions::DerivedFrom;
|
use dom::bindings::conversions::DerivedFrom;
|
||||||
use dom::bindings::global::GlobalRef;
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
use dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
||||||
use dom::bindings::js::{Root};
|
use dom::bindings::js::{JS, MutNullableHeap, Root};
|
||||||
use dom::bindings::reflector::Reflectable;
|
use dom::bindings::reflector::Reflectable;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::element::Element;
|
use dom::element::Element;
|
||||||
|
@ -47,6 +47,7 @@ use util::str::DOMString;
|
||||||
pub struct HTMLFormElement {
|
pub struct HTMLFormElement {
|
||||||
htmlelement: HTMLElement,
|
htmlelement: HTMLElement,
|
||||||
marked_for_reset: Cell<bool>,
|
marked_for_reset: Cell<bool>,
|
||||||
|
elements: MutNullableHeap<JS<HTMLFormControlsCollection>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLFormElement {
|
impl HTMLFormElement {
|
||||||
|
@ -56,6 +57,7 @@ impl HTMLFormElement {
|
||||||
HTMLFormElement {
|
HTMLFormElement {
|
||||||
htmlelement: HTMLElement::new_inherited(localName, prefix, document),
|
htmlelement: HTMLElement::new_inherited(localName, prefix, document),
|
||||||
marked_for_reset: Cell::new(false),
|
marked_for_reset: Cell::new(false),
|
||||||
|
elements: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,6 +144,10 @@ impl HTMLFormElementMethods for HTMLFormElement {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-form-elements
|
// https://html.spec.whatwg.org/multipage/#dom-form-elements
|
||||||
fn Elements(&self) -> Root<HTMLFormControlsCollection> {
|
fn Elements(&self) -> Root<HTMLFormControlsCollection> {
|
||||||
|
if let Some(elements) = self.elements.get() {
|
||||||
|
return elements;
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(JSTraceable, HeapSizeOf)]
|
#[derive(JSTraceable, HeapSizeOf)]
|
||||||
struct ElementsFilter {
|
struct ElementsFilter {
|
||||||
form: Root<HTMLFormElement>
|
form: Root<HTMLFormElement>
|
||||||
|
@ -193,7 +199,9 @@ impl HTMLFormElementMethods for HTMLFormElement {
|
||||||
}
|
}
|
||||||
let filter = box ElementsFilter { form: Root::from_ref(self) };
|
let filter = box ElementsFilter { form: Root::from_ref(self) };
|
||||||
let window = window_from_node(self);
|
let window = window_from_node(self);
|
||||||
HTMLFormControlsCollection::new(window.r(), self.upcast(), filter)
|
let elements = HTMLFormControlsCollection::new(window.r(), self.upcast(), filter);
|
||||||
|
self.elements.set(Some(&elements));
|
||||||
|
elements
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-form-length
|
// https://html.spec.whatwg.org/multipage/#dom-form-length
|
||||||
|
|
|
@ -35209,6 +35209,12 @@
|
||||||
"path": "html/semantics/forms/the-button-element/button-activate.html",
|
"path": "html/semantics/forms/the-button-element/button-activate.html",
|
||||||
"url": "/html/semantics/forms/the-button-element/button-activate.html"
|
"url": "/html/semantics/forms/the-button-element/button-activate.html"
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"html/semantics/forms/the-form-element/form-elements-sameobject.html": [
|
||||||
|
{
|
||||||
|
"path": "html/semantics/forms/the-form-element/form-elements-sameobject.html",
|
||||||
|
"url": "/html/semantics/forms/the-form-element/form-elements-sameobject.html"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
<!doctype html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Testing [SameObject] on the 'elements' attribute on the 'form' element</title>
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<div id="log"></div>
|
||||||
|
|
||||||
|
<form>
|
||||||
|
<input>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
test(function() {
|
||||||
|
var form = document.querySelector('form');
|
||||||
|
var elements = form.elements;
|
||||||
|
assert_true(elements === form.elements);
|
||||||
|
form.appendChild(document.createElement('input'));
|
||||||
|
assert_true(elements === form.elements);
|
||||||
|
}, "[SameObject] should apply to 'elements' attr on <form>");
|
||||||
|
</script>
|
Loading…
Add table
Add a link
Reference in a new issue