Skip to content

Commit

Permalink
HTMLOptionElement.index
Browse files Browse the repository at this point in the history
  • Loading branch information
pshaughn committed Jan 9, 2020
1 parent c6192dc commit 767ccbe
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 25 deletions.
41 changes: 41 additions & 0 deletions components/script/dom/htmloptionelement.rs
Expand Up @@ -28,6 +28,7 @@ use crate::dom::window::Window;
use dom_struct::dom_struct;
use html5ever::{LocalName, Prefix, QualName};
use std::cell::Cell;
use std::convert::TryInto;
use style::element_state::ElementState;
use style::str::{split_html_space_chars, str_join};

Expand Down Expand Up @@ -127,6 +128,41 @@ impl HTMLOptionElement {
select.ask_for_reset();
}
}

// https://html.spec.whatwg.org/multipage/#concept-option-index
fn index(&self) -> i32 {
if let Some(parent) = self.upcast::<Node>().GetParentNode() {
if let Some(select_parent) = parent.downcast::<HTMLSelectElement>() {
// return index in parent select's list of options
return self.index_in_select(select_parent);
} else if parent.is::<HTMLOptGroupElement>() {
if let Some(grandparent) = parent.GetParentNode() {
if let Some(select_grandparent) = grandparent.downcast::<HTMLSelectElement>() {
// return index in grandparent select's list of options
return self.index_in_select(select_grandparent);
}
}
}
}
// "If the option element is not in a list of options,
// then the option element's index is zero."
// self is neither a child of a select, nor a grandchild of a select
// via an optgroup, so it is not in a list of options
0
}

fn index_in_select(&self, select: &HTMLSelectElement) -> i32 {
match select.list_of_options().position(|n| &*n == self) {
Some(index) => index.try_into().unwrap_or(0),
None => {
// shouldn't happen but not worth a browser panic
warn!(
"HTMLOptionElement called index_in_select at a select that did not contain it"
);
0
},
}
}
}

// FIXME(ajeffrey): Provide a way of buffering DOMStrings other than using Strings
Expand Down Expand Up @@ -225,6 +261,11 @@ impl HTMLOptionElementMethods for HTMLOptionElement {
self.selectedness.set(selected);
self.pick_if_selected_and_reset();
}

// https://html.spec.whatwg.org/multipage/#dom-option-index
fn Index(&self) -> i32 {
self.index()
}
}

impl VirtualMethods for HTMLOptionElement {
Expand Down
2 changes: 1 addition & 1 deletion components/script/dom/htmlselectelement.rs
Expand Up @@ -102,7 +102,7 @@ impl HTMLSelectElement {
}

// https://html.spec.whatwg.org/multipage/#concept-select-option-list
fn list_of_options(&self) -> impl Iterator<Item = DomRoot<HTMLOptionElement>> {
pub fn list_of_options(&self) -> impl Iterator<Item = DomRoot<HTMLOptionElement>> {
self.upcast::<Node>().children().flat_map(|node| {
if node.is::<HTMLOptionElement>() {
let node = DomRoot::downcast::<HTMLOptionElement>(node).unwrap();
Expand Down
2 changes: 1 addition & 1 deletion components/script/dom/webidls/HTMLOptionElement.webidl
Expand Up @@ -22,5 +22,5 @@ interface HTMLOptionElement : HTMLElement {

[CEReactions]
attribute DOMString text;
// readonly attribute long index;
readonly attribute long index;
};
9 changes: 0 additions & 9 deletions tests/wpt/metadata/html/dom/idlharness.https.html.ini
Expand Up @@ -2337,9 +2337,6 @@
[HTMLInputElement interface: createInput("url") must inherit property "stepDown(long)" with the proper type]
expected: FAIL

[HTMLOptionElement interface: new Option() must inherit property "index" with the proper type]
expected: FAIL

[HTMLInputElement interface: createInput("password") must inherit property "height" with the proper type]
expected: FAIL

Expand Down Expand Up @@ -3702,9 +3699,6 @@
[HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("range") with too few arguments must throw TypeError]
expected: FAIL
[HTMLOptionElement interface: attribute index]
expected: FAIL
[HTMLInputElement interface: document.createElement("input") must inherit property "valueAsNumber" with the proper type]
expected: FAIL
Expand Down Expand Up @@ -4923,9 +4917,6 @@
[HTMLInputElement interface: createInput("number") must inherit property "valueAsDate" with the proper type]
expected: FAIL

[HTMLOptionElement interface: document.createElement("option") must inherit property "index" with the proper type]
expected: FAIL

[HTMLInputElement interface: createInput("email") must inherit property "setCustomValidity(DOMString)" with the proper type]
expected: FAIL

Expand Down

This file was deleted.

0 comments on commit 767ccbe

Please sign in to comment.