mirror of
https://github.com/servo/servo.git
synced 2025-06-19 14:48:59 +01:00
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 -->
This commit is contained in:
commit
46b3eb6535
15 changed files with 269 additions and 63 deletions
|
@ -58,7 +58,7 @@ use libc;
|
|||
use msg::constellation_msg::ConstellationChan;
|
||||
use msg::constellation_msg::{PipelineId, SubpageId, WindowSizeData};
|
||||
use net_traits::Metadata;
|
||||
use net_traits::image::base::Image;
|
||||
use net_traits::image::base::{Image, ImageMetadata};
|
||||
use net_traits::image_cache_thread::{ImageCacheChan, ImageCacheThread};
|
||||
use net_traits::storage_thread::StorageType;
|
||||
use profile_traits::mem::ProfilerChan as MemProfilerChan;
|
||||
|
@ -265,7 +265,7 @@ no_jsmanaged_fields!(Receiver<T>);
|
|||
no_jsmanaged_fields!(Rect<T>);
|
||||
no_jsmanaged_fields!(Size2D<T>);
|
||||
no_jsmanaged_fields!(Arc<T>);
|
||||
no_jsmanaged_fields!(Image, ImageCacheChan, ImageCacheThread);
|
||||
no_jsmanaged_fields!(Image, ImageMetadata, ImageCacheChan, ImageCacheThread);
|
||||
no_jsmanaged_fields!(Metadata);
|
||||
no_jsmanaged_fields!(Atom, Namespace, QualName);
|
||||
no_jsmanaged_fields!(Trusted<T: Reflectable>);
|
||||
|
|
|
@ -444,7 +444,7 @@ impl CanvasRenderingContext2D {
|
|||
|
||||
let img = match self.request_image_from_cache(url) {
|
||||
ImageResponse::Loaded(img) => img,
|
||||
ImageResponse::PlaceholderLoaded(_) | ImageResponse::None => {
|
||||
ImageResponse::PlaceholderLoaded(_) | ImageResponse::None | ImageResponse::MetadataLoaded(_) => {
|
||||
return None;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1138,7 +1138,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
|
||||
let img = match canvas_utils::request_image_from_cache(window.r(), img_url) {
|
||||
ImageResponse::Loaded(img) => img,
|
||||
ImageResponse::PlaceholderLoaded(_) | ImageResponse::None
|
||||
ImageResponse::PlaceholderLoaded(_) | ImageResponse::None |
|
||||
ImageResponse::MetadataLoaded(_)
|
||||
=> return,
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue