From 76d288fe62fda928d10731d4c94cd0ab9feb410e Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 12 Sep 2013 17:08:33 -0700 Subject: [PATCH] script: Implement image source setting from script and write a demo for this. --- .../script/dom/bindings/codegen/Bindings.conf | 2 +- src/components/script/dom/htmlimageelement.rs | 53 +++++++++++++++++- src/components/script/dom/window.rs | 9 ++- .../script/html/hubbub_html_parser.rs | 17 +----- src/components/script/script_task.rs | 7 ++- src/test/html/filmstrip.html | 20 +++++++ src/test/html/rust-0.png | Bin 0 -> 4399 bytes src/test/html/rust-135.png | Bin 0 -> 10767 bytes src/test/html/rust-180.png | Bin 0 -> 4395 bytes src/test/html/rust-225.png | Bin 0 -> 10889 bytes src/test/html/rust-270.png | Bin 0 -> 4497 bytes src/test/html/rust-315.png | Bin 0 -> 10753 bytes src/test/html/rust-45.png | Bin 0 -> 10873 bytes src/test/html/rust-90.png | Bin 0 -> 4466 bytes 14 files changed, 85 insertions(+), 23 deletions(-) create mode 100644 src/test/html/filmstrip.html create mode 100644 src/test/html/rust-0.png create mode 100644 src/test/html/rust-135.png create mode 100644 src/test/html/rust-180.png create mode 100644 src/test/html/rust-225.png create mode 100644 src/test/html/rust-270.png create mode 100644 src/test/html/rust-315.png create mode 100644 src/test/html/rust-45.png create mode 100644 src/test/html/rust-90.png diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 4322a8cfa8b..4942b59b132 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -589,7 +589,7 @@ addHTMLElement('HTMLHeadingElement') addHTMLElement('HTMLHtmlElement') addHTMLElement('HTMLHRElement') addHTMLElement('HTMLIFrameElement', needsAbstract=['sandbox']) -addHTMLElement('HTMLImageElement', needsAbstract=['width', 'height']) +addHTMLElement('HTMLImageElement', needsAbstract=['src', 'width', 'height']) addHTMLElement('HTMLInputElement') addHTMLElement('HTMLLabelElement') addHTMLElement('HTMLLegendElement') diff --git a/src/components/script/dom/htmlimageelement.rs b/src/components/script/dom/htmlimageelement.rs index c0922859ce7..4af8a36def2 100644 --- a/src/components/script/dom/htmlimageelement.rs +++ b/src/components/script/dom/htmlimageelement.rs @@ -6,8 +6,10 @@ use dom::bindings::utils::{DOMString, str, null_string, ErrorResult}; use dom::htmlelement::HTMLElement; use dom::node::{ScriptView, AbstractNode}; use extra::url::Url; -use layout_interface::{ContentBoxQuery, ContentBoxResponse}; use gfx::geometry::to_px; +use layout_interface::{ContentBoxQuery, ContentBoxResponse}; +use servo_net::image_cache_task; +use servo_util::url::make_url; pub struct HTMLImageElement { parent: HTMLElement, @@ -15,6 +17,41 @@ pub struct HTMLImageElement { } impl HTMLImageElement { + /// Makes the local `image` member match the status of the `src` attribute and starts + /// prefetching the image. This method must be called after `src` is changed. + pub fn update_image(&mut self) { + let elem = &mut self.parent.parent; + let src_opt = elem.get_attr("src").map(|x| x.to_str()); + let node = &mut elem.parent; + match node.owner_doc { + Some(doc) => { + match doc.with_base(|doc| doc.window) { + Some(window) => { + match src_opt { + None => {} + Some(src) => { + let page = window.page; + let img_url = make_url(src, + (*page).url + .map(|&(ref url, _)| url.clone())); + self.image = Some(img_url.clone()); + + // inform the image cache to load this, but don't store a + // handle. + // + // TODO (Issue #84): don't prefetch if we are within a + //