diff options
author | akhan7 <akhan7@ncsu.edu> | 2016-03-19 19:56:27 -0500 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2016-04-12 14:11:31 -0400 |
commit | 90359b1cba2e0171e9666c3ae6beb6cb1596b541 (patch) | |
tree | f6f388e5f525d7055207b264b435608493ffd743 /components/script | |
parent | dfb482a2b7fdb570f34e9092384fa74a3e1b54e3 (diff) | |
download | servo-90359b1cba2e0171e9666c3ae6beb6cb1596b541.tar.gz servo-90359b1cba2e0171e9666c3ae6beb6cb1596b541.zip |
Implement image request concept for HTMLImageElement. Implement HTMLImageElement.currentSrc.
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/htmlimageelement.rs | 73 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLImageElement.webidl | 4 |
2 files changed, 57 insertions, 20 deletions
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index c36bcb02651..92291600ca3 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -21,6 +21,7 @@ use dom::htmlelement::HTMLElement; use dom::node::{Node, NodeDamage, document_from_node, window_from_node}; use dom::values::UNSIGNED_LONG_MAX; use dom::virtualmethods::VirtualMethods; +use heapsize::HeapSizeOf; use ipc_channel::ipc; use ipc_channel::router::ROUTER; use net_traits::image::base::{Image, ImageMetadata}; @@ -33,17 +34,31 @@ use string_cache::Atom; use url::Url; use util::str::{DOMString, LengthOrPercentageOrAuto}; +#[derive(JSTraceable, HeapSizeOf)] +#[allow(dead_code)] +enum State { + Unavailable, + PartiallyAvailable, + CompletelyAvailable, + Broken, +} +#[derive(JSTraceable, HeapSizeOf)] +struct ImageRequest { + state: State, + url: Option<Url>, + image: Option<Arc<Image>>, + metadata: Option<ImageMetadata>, +} #[dom_struct] pub struct HTMLImageElement { htmlelement: HTMLElement, - url: DOMRefCell<Option<Url>>, - image: DOMRefCell<Option<Arc<Image>>>, - metadata: DOMRefCell<Option<ImageMetadata>>, + current_request: DOMRefCell<ImageRequest>, + pending_request: DOMRefCell<ImageRequest>, } impl HTMLImageElement { pub fn get_url(&self) -> Option<Url>{ - self.url.borrow().clone() + self.current_request.borrow().url.clone() } } @@ -77,8 +92,8 @@ impl Runnable for ImageResponseHandlerRunnable { } ImageResponse::None => (None, None, true) }; - *element_ref.image.borrow_mut() = image; - *element_ref.metadata.borrow_mut() = metadata; + element_ref.current_request.borrow_mut().image = image; + element_ref.current_request.borrow_mut().metadata = metadata; // Mark the node dirty let document = document_from_node(&*element); @@ -104,14 +119,14 @@ impl HTMLImageElement { let image_cache = window.image_cache_thread(); match value { None => { - *self.url.borrow_mut() = None; - *self.image.borrow_mut() = None; + self.current_request.borrow_mut().url = None; + self.current_request.borrow_mut().image = None; } Some((src, base_url)) => { let img_url = base_url.join(&src); // FIXME: handle URL parse errors more gracefully. let img_url = img_url.unwrap(); - *self.url.borrow_mut() = Some(img_url.clone()); + self.current_request.borrow_mut().url = Some(img_url.clone()); let trusted_node = Trusted::new(self, window.networking_task_source()); let (responder_sender, responder_receiver) = ipc::channel().unwrap(); @@ -134,13 +149,21 @@ impl HTMLImageElement { } } } - fn new_inherited(localName: Atom, prefix: Option<DOMString>, document: &Document) -> HTMLImageElement { HTMLImageElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document), - url: DOMRefCell::new(None), - image: DOMRefCell::new(None), - metadata: DOMRefCell::new(None), + current_request: DOMRefCell::new(ImageRequest { + state: State::Unavailable, + url: None, + image: None, + metadata: None + }), + pending_request: DOMRefCell::new(ImageRequest { + state: State::Unavailable, + url: None, + image: None, + metadata: None + }), } } @@ -182,12 +205,12 @@ pub trait LayoutHTMLImageElementHelpers { impl LayoutHTMLImageElementHelpers for LayoutJS<HTMLImageElement> { #[allow(unsafe_code)] unsafe fn image(&self) -> Option<Arc<Image>> { - (*self.unsafe_get()).image.borrow_for_layout().clone() + (*self.unsafe_get()).current_request.borrow_for_layout().image.clone() } #[allow(unsafe_code)] unsafe fn image_url(&self) -> Option<Url> { - (*self.unsafe_get()).url.borrow_for_layout().clone() + (*self.unsafe_get()).current_request.borrow_for_layout().url.clone() } #[allow(unsafe_code)] @@ -224,6 +247,11 @@ impl HTMLImageElementMethods for HTMLImageElement { // https://html.spec.whatwg.org/multipage/#dom-img-src make_setter!(SetSrc, "src"); + // https://html.spec.whatwg.org/multipage/#dom-img-crossOrigin + make_enumerated_getter!(CrossOrigin, "crossorigin", "anonymous", ("use-credentials")); + // https://html.spec.whatwg.org/multipage/#dom-img-crossOrigin + make_setter!(SetCrossOrigin, "crossorigin"); + // https://html.spec.whatwg.org/multipage/#dom-img-usemap make_getter!(UseMap, "usemap"); // https://html.spec.whatwg.org/multipage/#dom-img-usemap @@ -260,7 +288,7 @@ impl HTMLImageElementMethods for HTMLImageElement { // https://html.spec.whatwg.org/multipage/#dom-img-naturalwidth fn NaturalWidth(&self) -> u32 { - let metadata = self.metadata.borrow(); + let ref metadata = self.current_request.borrow().metadata; match *metadata { Some(ref metadata) => metadata.width, @@ -270,7 +298,7 @@ impl HTMLImageElementMethods for HTMLImageElement { // https://html.spec.whatwg.org/multipage/#dom-img-naturalheight fn NaturalHeight(&self) -> u32 { - let metadata = self.metadata.borrow(); + let ref metadata = self.current_request.borrow().metadata; match *metadata { Some(ref metadata) => metadata.height, @@ -280,10 +308,19 @@ impl HTMLImageElementMethods for HTMLImageElement { // https://html.spec.whatwg.org/multipage/#dom-img-complete fn Complete(&self) -> bool { - let image = self.image.borrow(); + let ref image = self.current_request.borrow().image; image.is_some() } + // https://html.spec.whatwg.org/multipage/#dom-img-currentsrc + fn CurrentSrc(&self) -> DOMString { + let ref url = self.current_request.borrow().url; + match *url { + Some(ref url) => DOMString::from(url.serialize()), + None => DOMString::from(""), + } + } + // https://html.spec.whatwg.org/multipage/#dom-img-name make_getter!(Name, "name"); diff --git a/components/script/dom/webidls/HTMLImageElement.webidl b/components/script/dom/webidls/HTMLImageElement.webidl index c063301cb39..69bd2f7d4c1 100644 --- a/components/script/dom/webidls/HTMLImageElement.webidl +++ b/components/script/dom/webidls/HTMLImageElement.webidl @@ -9,7 +9,7 @@ interface HTMLImageElement : HTMLElement { attribute DOMString alt; attribute DOMString src; // attribute DOMString srcset; - // attribute DOMString crossOrigin; + attribute DOMString crossOrigin; attribute DOMString useMap; attribute boolean isMap; attribute unsigned long width; @@ -17,7 +17,7 @@ interface HTMLImageElement : HTMLElement { readonly attribute unsigned long naturalWidth; readonly attribute unsigned long naturalHeight; readonly attribute boolean complete; - + readonly attribute DOMString currentSrc; // also has obsolete members }; |