aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlimageelement.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-01-31 01:18:41 +0530
committerbors-servo <lbergstrom+bors@mozilla.com>2016-01-31 01:18:41 +0530
commit46b3eb653579a40632f91497a3d48f1d7fbd40cc (patch)
treee45b6e5fcc181c7c8eb9647c1ba8f27f857bd86f /components/script/dom/htmlimageelement.rs
parentf8bdda499ef8c13f65cbc20215bd36dbc42b6439 (diff)
parent167ffa7a95ae0068d2b4f900d2207436a1799675 (diff)
downloadservo-46b3eb653579a40632f91497a3d48f1d7fbd40cc.tar.gz
servo-46b3eb653579a40632f91497a3d48f1d7fbd40cc.zip
Auto merge of #9208 - jmr0:master-img, r=asajeffrey
Use image metadata to lay out images Fixes #7047. cc: @jdm <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/9208) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/htmlimageelement.rs')
-rw-r--r--components/script/dom/htmlimageelement.rs33
1 files changed, 21 insertions, 12 deletions
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index 6474d360a75..a6b124939f0 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -21,7 +21,7 @@ use dom::node::{Node, NodeDamage, document_from_node, window_from_node};
use dom::virtualmethods::VirtualMethods;
use ipc_channel::ipc;
use ipc_channel::router::ROUTER;
-use net_traits::image::base::Image;
+use net_traits::image::base::{Image, ImageMetadata};
use net_traits::image_cache_thread::{ImageResponder, ImageResponse};
use script_thread::ScriptThreadEventCategory::UpdateReplacedElement;
use script_thread::{CommonScriptMsg, Runnable, ScriptChan};
@@ -35,6 +35,7 @@ pub struct HTMLImageElement {
htmlelement: HTMLElement,
url: DOMRefCell<Option<Url>>,
image: DOMRefCell<Option<Arc<Image>>>,
+ metadata: DOMRefCell<Option<ImageMetadata>>,
}
impl HTMLImageElement {
@@ -64,12 +65,17 @@ impl Runnable for ImageResponseHandlerRunnable {
// Update the image field
let element = self.element.root();
let element_ref = element.r();
- *element_ref.image.borrow_mut() = match self.image {
+ let (image, metadata, trigger_image_load) = match self.image {
ImageResponse::Loaded(image) | ImageResponse::PlaceholderLoaded(image) => {
- Some(image)
+ (Some(image.clone()), Some(ImageMetadata { height: image.height, width: image.width } ), true)
}
- ImageResponse::None => None,
+ ImageResponse::MetadataLoaded(meta) => {
+ (None, Some(meta), false)
+ }
+ ImageResponse::None => (None, None, true)
};
+ *element_ref.image.borrow_mut() = image;
+ *element_ref.metadata.borrow_mut() = metadata;
// Mark the node dirty
let document = document_from_node(&*element);
@@ -77,7 +83,9 @@ impl Runnable for ImageResponseHandlerRunnable {
// Fire image.onload
let window = window_from_node(document.r());
- element.upcast::<EventTarget>().fire_simple_event("load", GlobalRef::Window(window.r()));
+ if trigger_image_load {
+ element.upcast::<EventTarget>().fire_simple_event("load", GlobalRef::Window(window.r()));
+ }
// Trigger reflow
window.add_pending_reflow();
}
@@ -116,7 +124,7 @@ impl HTMLImageElement {
UpdateReplacedElement, runnable));
});
- image_cache.request_image(img_url,
+ image_cache.request_image_and_metadata(img_url,
window.image_cache_chan(),
Some(ImageResponder::new(responder_sender)));
}
@@ -128,6 +136,7 @@ impl HTMLImageElement {
htmlelement: HTMLElement::new_inherited(localName, prefix, document),
url: DOMRefCell::new(None),
image: DOMRefCell::new(None),
+ metadata: DOMRefCell::new(None),
}
}
@@ -218,20 +227,20 @@ impl HTMLImageElementMethods for HTMLImageElement {
// https://html.spec.whatwg.org/multipage/#dom-img-naturalwidth
fn NaturalWidth(&self) -> u32 {
- let image = self.image.borrow();
+ let metadata = self.metadata.borrow();
- match *image {
- Some(ref image) => image.width,
+ match *metadata {
+ Some(ref metadata) => metadata.width,
None => 0,
}
}
// https://html.spec.whatwg.org/multipage/#dom-img-naturalheight
fn NaturalHeight(&self) -> u32 {
- let image = self.image.borrow();
+ let metadata = self.metadata.borrow();
- match *image {
- Some(ref image) => image.height,
+ match *metadata {
+ Some(ref metadata) => metadata.height,
None => 0,
}
}