stdweb/webapi/html_elements/image.rs
1use webcore::value::{Value, Reference};
2use webcore::try_from::TryInto;
3use webapi::cross_origin_setting::CrossOriginSetting;
4use webapi::event_target::{IEventTarget, EventTarget};
5use webapi::node::{INode, Node};
6use webapi::element::{IElement, Element};
7use webapi::html_element::{IHtmlElement, HtmlElement};
8
9/// The HTML image element is used to manipulate the layout and presentation of
10/// `<img>` elements.
11///
12/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
13// https://html.spec.whatwg.org/#htmlimageelement
14#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
15#[reference(instance_of = "HTMLImageElement")]
16#[reference(subclass_of(EventTarget, Node, Element, HtmlElement))]
17pub struct ImageElement( Reference );
18
19impl IEventTarget for ImageElement {}
20impl INode for ImageElement {}
21impl IElement for ImageElement {}
22impl IHtmlElement for ImageElement {}
23
24impl ImageElement {
25 /// Constructs a new ImageElement.
26 ///
27 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/Image)
28 // https://html.spec.whatwg.org/#the-img-element:dom-image
29 pub fn new() -> ImageElement {
30 js! (
31 return new Image();
32 ).try_into().unwrap()
33 }
34
35 /// Constructs a new ImageElement with the given width and height.
36 ///
37 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/Image)
38 // https://html.spec.whatwg.org/#the-img-element:dom-image
39 pub fn with_size(width: u32, height: u32) -> ImageElement {
40 js! (
41 return new Image(@{width}, @{height});
42 ).try_into().unwrap()
43 }
44
45 /// Returns the HTML `alt` attribute, representing the fallback context for the image.
46 ///
47 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/alt)
48 // https://html.spec.whatwg.org/#the-img-element:dom-img-alt
49 #[inline]
50 pub fn alt( &self ) -> String {
51 js! (
52 return @{self}.alt;
53 ).try_into().unwrap()
54 }
55
56 /// Sets the HTML `alt` attribute, representing the fallback context for the image.
57 ///
58 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/alt)
59 // https://html.spec.whatwg.org/#the-img-element:dom-img-alt
60 pub fn set_alt( &self, value: &str ) {
61 js! { @(no_return)
62 @{self}.alt = @{value};
63 }
64 }
65
66 /// Returns true if the browser has finished fetching the image, whether
67 /// successful or not. It also return true if the image has no src value.
68 ///
69 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/complete)
70 // https://html.spec.whatwg.org/#the-img-element:dom-img-complete
71 pub fn complete( &self ) -> bool {
72 js! (
73 return @{self}.complete;
74 ).try_into().unwrap()
75 }
76
77 /// Returns the Cross-Origin Resource Sharing (CORS) setting for the image.
78 ///
79 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/crossOrigin)
80 // https://html.spec.whatwg.org/#the-img-element:dom-img-crossorigin
81 pub fn cross_origin( &self ) -> CrossOriginSetting {
82 match js!(
83 return @{self}.crossOrigin;
84 ) {
85 Value::Null => CrossOriginSetting::None,
86 Value::String( ref s ) if *s == "anonymous" => CrossOriginSetting::Anonymous,
87 Value::String( ref s ) if *s == "use-credentials" => CrossOriginSetting::UseCredentials,
88 _ => unreachable!("Unexpected crossOrigin value")
89 }
90 }
91
92 /// Sets the Cross-Origin Resource Sharing (CORS) setting for the image.
93 ///
94 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/crossOrigin)
95 // https://html.spec.whatwg.org/#the-img-element:dom-img-crossorigin
96 pub fn set_cross_origin( &self, value: CrossOriginSetting ) {
97 js! { @(no_return)
98 @{self}.crossOrigin = @{
99 match value {
100 CrossOriginSetting::None => None,
101 CrossOriginSetting::Anonymous => Some("anonymous"),
102 CrossOriginSetting::UseCredentials => Some("use-credentials")
103 }
104 }
105 }
106 }
107
108 /// Returns the the rendered height of the image in CSS pixels.
109 ///
110 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/height)
111 // https://html.spec.whatwg.org/#the-img-element:dom-img-height
112 pub fn height( &self ) -> u32 {
113 js! (
114 return @{self}.height;
115 ).try_into().unwrap()
116 }
117
118 /// Sets the the rendered height of the image in CSS pixels.
119 ///
120 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/height)
121 // https://html.spec.whatwg.org/#the-img-element:dom-img-height
122 pub fn set_height( &self, value: u32 ) {
123 js! { @(no_return)
124 @{self}.height = @{value};
125 }
126 }
127
128 /// Indicates whether the image is part of a server-side image map.
129 ///
130 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/isMap)
131 // https://html.spec.whatwg.org/#the-img-element:dom-img-ismap
132 pub fn is_map( &self ) -> bool {
133 js!(
134 return @{self}.isMap;
135 ).try_into().unwrap()
136 }
137
138 /// Sets whether the image is part of a server-side image map.
139 ///
140 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/isMap)
141 // https://html.spec.whatwg.org/#the-img-element:dom-img-ismap
142 pub fn set_is_map( &self, value: bool ) {
143 js! { @(no_return)
144 @{self}.isMap = @{value};
145 }
146 }
147
148 /// Returns the intrinsic height of the image in CSS pixels, if it is available.
149 ///
150 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/naturalHeight)
151 // https://html.spec.whatwg.org/#the-img-element:dom-img-naturalheight
152 pub fn natural_height( &self ) -> Option< u32 > {
153 match js!(
154 return @{self}.naturalHeight;
155 ).try_into().unwrap() {
156 0 => None,
157 value => Some( value )
158 }
159 }
160
161 /// Returns the intrinsic width of the image in CSS pixels, if it is available.
162 ///
163 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/naturalWidth)
164 // https://html.spec.whatwg.org/#the-img-element:dom-img-naturalwidth
165 pub fn natural_width( &self ) -> Option< u32 > {
166 match js!(
167 return @{self}.naturalWidth;
168 ).try_into().unwrap() {
169 0 => None,
170 value => Some( value )
171 }
172 }
173
174 /// Returns the full URL of the image, including the base URI.
175 ///
176 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/src)
177 // https://html.spec.whatwg.org/#the-img-element:dom-img-src
178 pub fn src( &self ) -> String {
179 js! (
180 return @{self}.src;
181 ).try_into().unwrap()
182 }
183
184 /// Sets the full URL of the image, including the base URI.
185 ///
186 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/src)
187 // https://html.spec.whatwg.org/#the-img-element:dom-img-src
188 pub fn set_src( &self, value: &str ) {
189 js! { @(no_return)
190 @{self}.src = @{value};
191 }
192 }
193
194 /// Returns the `usemap` HTML attribute, containing a partial URL of a map element.
195 ///
196 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/useMap)
197 // https://html.spec.whatwg.org/#the-img-element:dom-img-usemap
198 pub fn use_map( &self ) -> String {
199 js!(
200 return @{self}.useMap;
201 ).try_into().unwrap()
202 }
203
204 /// Sets the `usemap` HTML attribute, containing a partial URL of a map element.
205 ///
206 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/useMap)
207 // https://html.spec.whatwg.org/#the-img-element:dom-img-usemap
208 pub fn set_use_map( &self, value: &str ) {
209 js! { @(no_return)
210 @{self}.useMap = @{value};
211 }
212 }
213
214 /// Returns the rendered width of the image in CSS pixels.
215 ///
216 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/width)
217 // https://html.spec.whatwg.org/#the-img-element:dom-img-width
218 pub fn width( &self ) -> u32 {
219 js! (
220 return @{self}.width;
221 ).try_into().unwrap()
222 }
223
224 /// Sets the rendered width of the image in CSS pixels.
225 ///
226 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/width)
227 // https://html.spec.whatwg.org/#the-img-element:dom-img-width
228 pub fn set_width( &self, value: u32 ) {
229 js! { @(no_return)
230 @{self}.width = @{value};
231 }
232 }
233}
234
235#[cfg(all(test, feature = "web_test"))]
236mod tests {
237 use super::*;
238
239 #[test]
240 fn test_new() {
241 let image = ImageElement::new();
242 assert_eq!(image.alt(), "");
243 }
244
245 #[test]
246 fn test_with_size() {
247 let image = ImageElement::with_size(333, 444);
248 assert_eq!(image.width(), 333);
249 assert_eq!(image.height(), 444);
250 }
251
252 #[test]
253 fn test_alt() {
254 let image = ImageElement::new();
255 assert_eq!(image.alt(), "");
256 image.set_alt("test");
257 assert_eq!(image.alt(), "test");
258 }
259
260 #[test]
261 fn test_complete() {
262 let image = ImageElement::new();
263 assert_eq!(image.complete(), true);
264 }
265
266 #[test]
267 fn test_width_height() {
268 let image = ImageElement::new();
269 assert_eq!(image.width(), 0);
270 assert_eq!(image.height(), 0);
271 image.set_width(4);
272 image.set_height(5);
273 assert_eq!(image.width(), 4);
274 assert_eq!(image.height(), 5);
275 }
276
277 #[test]
278 fn test_src() {
279 let image = ImageElement::new();
280 assert_eq!(image.src(), "");
281 image.set_src("http://example.com/image.gif");
282 assert_eq!(image.src(), "http://example.com/image.gif");
283 }
284
285 #[test]
286 fn test_use_map() {
287 let image = ImageElement::new();
288 assert_eq!(image.use_map(), "");
289 image.set_use_map("test");
290 assert_eq!(image.use_map(), "test");
291 }
292
293 #[test]
294 fn test_natural_width_height() {
295 let image = ImageElement::new();
296 assert_eq!(image.natural_width(), None);
297 assert_eq!(image.natural_height(), None);
298 }
299
300 #[test]
301 fn test_cross_origin() {
302 let image = ImageElement::new();
303 assert_eq!(image.cross_origin(), CrossOriginSetting::None);
304 image.set_cross_origin(CrossOriginSetting::Anonymous);
305 assert_eq!(image.cross_origin(), CrossOriginSetting::Anonymous);
306 image.set_cross_origin(CrossOriginSetting::UseCredentials);
307 assert_eq!(image.cross_origin(), CrossOriginSetting::UseCredentials);
308 image.set_cross_origin(CrossOriginSetting::None);
309 assert_eq!(image.cross_origin(), CrossOriginSetting::None);
310 }
311}