mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Remove recursiveness from directionality search
This commit is contained in:
parent
7e2107b1a5
commit
edb940e613
4 changed files with 35 additions and 26 deletions
|
@ -543,8 +543,11 @@ impl Element {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#the-directionality
|
// https://html.spec.whatwg.org/multipage/#the-directionality
|
||||||
pub fn directionality(&self) -> String {
|
pub fn directionality(&self) -> String {
|
||||||
if let Some(html_element) = self.downcast::<HTMLElement>() {
|
if let Some(directionality) = self
|
||||||
html_element.directionality()
|
.downcast::<HTMLElement>()
|
||||||
|
.and_then(|html_element| html_element.directionality())
|
||||||
|
{
|
||||||
|
directionality
|
||||||
} else {
|
} else {
|
||||||
let node = self.upcast::<Node>();
|
let node = self.upcast::<Node>();
|
||||||
node.parent_directionality()
|
node.parent_directionality()
|
||||||
|
|
|
@ -774,17 +774,17 @@ impl HTMLElement {
|
||||||
.count() as u32
|
.count() as u32
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn directionality(&self) -> String {
|
// returns Some if can infer direction by itself or from child nodes
|
||||||
println!("HTMLElement#directionality");
|
// returns None if requires to go up to parent
|
||||||
|
pub fn directionality(&self) -> Option<String> {
|
||||||
let element_direction: &str = &self.Dir();
|
let element_direction: &str = &self.Dir();
|
||||||
println!("HTMLElement#element_direction={}", element_direction);
|
|
||||||
|
|
||||||
if element_direction == "ltr" {
|
if element_direction == "ltr" {
|
||||||
return "ltr".to_owned();
|
return Some("ltr".to_owned());
|
||||||
}
|
}
|
||||||
|
|
||||||
if element_direction == "rtl" {
|
if element_direction == "rtl" {
|
||||||
return "rtl".to_owned();
|
return Some("rtl".to_owned());
|
||||||
}
|
}
|
||||||
|
|
||||||
if element_direction == "auto" {
|
if element_direction == "auto" {
|
||||||
|
@ -792,11 +792,11 @@ impl HTMLElement {
|
||||||
.downcast::<HTMLInputElement>()
|
.downcast::<HTMLInputElement>()
|
||||||
.and_then(|input| input.auto_directionality())
|
.and_then(|input| input.auto_directionality())
|
||||||
{
|
{
|
||||||
return directionality;
|
return Some(directionality);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(area) = self.downcast::<HTMLTextAreaElement>() {
|
if let Some(area) = self.downcast::<HTMLTextAreaElement>() {
|
||||||
return area.auto_directionality();
|
return Some(area.auto_directionality());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -806,8 +806,7 @@ impl HTMLElement {
|
||||||
// (i.e. it is not present or has an invalid value)
|
// (i.e. it is not present or has an invalid value)
|
||||||
// Requires bdi element implementation (https://html.spec.whatwg.org/multipage/#the-bdi-element)
|
// Requires bdi element implementation (https://html.spec.whatwg.org/multipage/#the-bdi-element)
|
||||||
|
|
||||||
let node = self.upcast::<Node>();
|
None
|
||||||
node.parent_directionality()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -952,11 +952,10 @@ impl HTMLFormElement {
|
||||||
let input = child.downcast::<HTMLInputElement>().unwrap();
|
let input = child.downcast::<HTMLInputElement>().unwrap();
|
||||||
data_set.append(&mut input.form_datums(submitter, encoding));
|
data_set.append(&mut input.form_datums(submitter, encoding));
|
||||||
|
|
||||||
let input_html_element = child.downcast::<HTMLElement>().unwrap();
|
let input_element = child.downcast::<Element>().unwrap();
|
||||||
let dirname: DOMString = input.DirName();
|
let dirname: DOMString = input.DirName();
|
||||||
if !dirname.is_empty() {
|
if !dirname.is_empty() {
|
||||||
let directionality =
|
let directionality = DOMString::from(input_element.directionality());
|
||||||
DOMString::from(input_html_element.directionality());
|
|
||||||
data_set.push(FormDatum {
|
data_set.push(FormDatum {
|
||||||
ty: input.Type().clone(),
|
ty: input.Type().clone(),
|
||||||
name: dirname.clone(),
|
name: dirname.clone(),
|
||||||
|
@ -989,11 +988,10 @@ impl HTMLFormElement {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let area_html_element = child.downcast::<HTMLElement>().unwrap();
|
let area_element = child.downcast::<Element>().unwrap();
|
||||||
let dirname: DOMString = textarea.DirName();
|
let dirname: DOMString = textarea.DirName();
|
||||||
if !dirname.is_empty() {
|
if !dirname.is_empty() {
|
||||||
let directionality =
|
let directionality = DOMString::from(area_element.directionality());
|
||||||
DOMString::from(area_html_element.directionality());
|
|
||||||
data_set.push(FormDatum {
|
data_set.push(FormDatum {
|
||||||
ty: textarea.Type().clone(),
|
ty: textarea.Type().clone(),
|
||||||
name: dirname.clone(),
|
name: dirname.clone(),
|
||||||
|
|
|
@ -434,16 +434,25 @@ impl Node {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parent_directionality(&self) -> String {
|
pub fn parent_directionality(&self) -> String {
|
||||||
match self.GetParentNode() {
|
let mut current = self.GetParentNode();
|
||||||
Some(parent) => {
|
|
||||||
if let Some(parent_html) = parent.downcast::<Element>() {
|
loop {
|
||||||
parent_html.directionality()
|
match current {
|
||||||
} else {
|
Some(parent) => {
|
||||||
parent.parent_directionality()
|
if let Some(directionality) = parent
|
||||||
}
|
.downcast::<HTMLElement>()
|
||||||
},
|
.and_then(|html_element| html_element.directionality())
|
||||||
None => "ltr".to_owned(),
|
{
|
||||||
|
return directionality;
|
||||||
|
} else {
|
||||||
|
current = parent.GetParentNode();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
None => break,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"ltr".to_owned()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue