1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use webcore::value::Reference;
use webcore::try_from::TryInto;
use webapi::event_target::{IEventTarget, EventTarget};
use webapi::node::{INode, Node};
use webapi::element::{IElement, Element};
use webapi::string_map::StringMap;
/// The `IHtmlElement` interface represents any HTML element.
///
/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement)
// https://html.spec.whatwg.org/#htmlelement
pub trait IHtmlElement: IElement {
/// Sets focus on the specified element, if it can be focused.
///
/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus)
// https://html.spec.whatwg.org/#elements-in-the-dom:dom-focus
fn focus( &self ) {
js! { @(no_return)
@{self.as_ref()}.focus();
}
}
/// Removes keyboard focus from the current element.
///
/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/blur)
// https://html.spec.whatwg.org/#elements-in-the-dom:dom-blur
fn blur( &self ) {
js! { @(no_return)
@{self.as_ref()}.blur();
}
}
/// Allows access, both in reading and writing, to all of the custom data attributes (data-*)
/// set on the element, either in HTML or in the DOM.
///
/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset)
// https://html.spec.whatwg.org/#elements-in-the-dom:dom-dataset
fn dataset( &self ) -> StringMap {
unsafe {
js!(
return @{self.as_ref()}.dataset;
).into_reference_unchecked().unwrap()
}
}
/// Returns the layout width of an element. Typically, an element's offsetWidth is a
/// measurement which includes the element borders, the element horizontal padding, the
/// element vertical scrollbar (if present, if rendered) and the element CSS width.
// https://drafts.csswg.org/cssom-view/#ref-for-dom-htmlelement-offsetwidth
fn offset_width( &self ) -> i32 {
js!(
return @{self.as_ref()}.offsetWidth;
).try_into().unwrap()
}
/// Returns the height of the element including vertical padding and borders, as an
/// integer.
// https://drafts.csswg.org/cssom-view/#ref-for-dom-htmlelement-offsetheight
fn offset_height( &self ) -> i32 {
js!(
return @{self.as_ref()}.offsetHeight;
).try_into().unwrap()
}
/// A property which represents the "rendered" text content of a node and its descendants.
/// It approximates the text the user would get if they highlighted the contents of the element
/// with the cursor and then copied to the clipboard.
///
/// This feature was originally introduced by Internet Explorer, and was formally specified in the HTML
/// standard in 2016 after being adopted by all major browser vendors.
///
/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText)
// https://html.spec.whatwg.org/#elements-in-the-dom:dom-innertext
fn inner_text( &self ) -> String {
js!(
return @{self.as_ref()}.innerText;
).try_into().unwrap()
}
}
/// A reference to a JavaScript object which implements the [IHtmlElement](trait.IHtmlElement.html)
/// interface.
///
/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement)
#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
#[reference(instance_of = "HTMLElement")]
#[reference(subclass_of(EventTarget, Node, Element))]
pub struct HtmlElement( Reference );
impl IEventTarget for HtmlElement {}
impl INode for HtmlElement {}
impl IElement for HtmlElement {}
impl IHtmlElement for HtmlElement {}
#[cfg(all(test, feature = "web_test"))]
mod tests {
use super::*;
fn div() -> Element {
js!(
return document.createElement("div");
).try_into().unwrap()
}
fn text(text: &str) -> Node {
js!(
return new Text(@{text});
).try_into().unwrap()
}
#[test]
fn test_inner_text() {
let element: HtmlElement = div().try_into().unwrap();
assert_eq!(element.inner_text(), "");
element.append_child(&text("foo "));
assert_eq!(element.inner_text(), "foo ");
element.append_child(&text("foo"));
assert_eq!(element.inner_text(), "foo foo");
}
}