Current-pixel-density tests passing

This commit is contained in:
paavininanda 2018-09-03 19:46:15 +05:30
parent 9a83ab6297
commit 25027e476c
9 changed files with 74 additions and 43 deletions

View file

@ -706,7 +706,7 @@ impl HTMLImageElement {
}
/// Step 13-17 of html.spec.whatwg.org/multipage/#update-the-image-data
fn prepare_image_request(&self, url: &ServoUrl, src: &DOMString) {
fn prepare_image_request(&self, url: &ServoUrl, src: &DOMString, selected_pixel_density: f64) {
match self.image_request.get() {
ImageRequestPhase::Pending => {
if let Some(pending_url) = self.pending_request.borrow().parsed_url.clone() {
@ -731,15 +731,18 @@ impl HTMLImageElement {
// TODO: queue a task to restart animation, if restart-animation is set
return
}
pending_request.current_pixel_density = Some(selected_pixel_density);
self.image_request.set(ImageRequestPhase::Pending);
self.init_image_request(&mut pending_request, &url, &src);
},
(_, State::Broken) | (_, State::Unavailable) => {
// Step 17
current_request.current_pixel_density = Some(selected_pixel_density);
self.init_image_request(&mut current_request, &url, &src);
},
(_, _) => {
// step 17
pending_request.current_pixel_density = Some(selected_pixel_density);
self.image_request.set(ImageRequestPhase::Pending);
self.init_image_request(&mut pending_request, &url, &src);
},
@ -755,12 +758,9 @@ impl HTMLImageElement {
let window = document.window();
let task_source = window.dom_manipulation_task_source();
let this = Trusted::new(self);
let src = match self.select_image_source() {
Some(src) => {
// Step 8
// TODO: Handle pixel density.
src.0
},
let (src, pixel_density) = match self.select_image_source() {
// Step 8
Some(data) => data,
None => {
// Step 9.
// FIXME(nox): Why are errors silenced here?
@ -816,7 +816,7 @@ impl HTMLImageElement {
match parsed_url {
Ok(url) => {
// Step 13-17
self.prepare_image_request(&url, &src);
self.prepare_image_request(&url, &src, pixel_density);
},
Err(_) => {
// Step 12.1-12.5.
@ -1231,6 +1231,9 @@ pub trait LayoutHTMLImageElementHelpers {
#[allow(unsafe_code)]
unsafe fn image_url(&self) -> Option<ServoUrl>;
#[allow(unsafe_code)]
unsafe fn image_density(&self) -> Option<f64>;
fn get_width(&self) -> LengthOrPercentageOrAuto;
fn get_height(&self) -> LengthOrPercentageOrAuto;
}
@ -1246,6 +1249,11 @@ impl LayoutHTMLImageElementHelpers for LayoutDom<HTMLImageElement> {
(*self.unsafe_get()).current_request.borrow_for_layout().parsed_url.clone()
}
#[allow(unsafe_code)]
unsafe fn image_density(&self) -> Option<f64> {
(*self.unsafe_get()).current_request.borrow_for_layout().current_pixel_density.clone()
}
#[allow(unsafe_code)]
fn get_width(&self) -> LengthOrPercentageOrAuto {
unsafe {
@ -1350,20 +1358,22 @@ impl HTMLImageElementMethods for HTMLImageElement {
// https://html.spec.whatwg.org/multipage/#dom-img-naturalwidth
fn NaturalWidth(&self) -> u32 {
let ref metadata = self.current_request.borrow().metadata;
let request = self.current_request.borrow();
let pixel_density = request.current_pixel_density.unwrap_or(1f64);
match *metadata {
Some(ref metadata) => metadata.width,
match request.metadata {
Some(ref metadata) => (metadata.width as f64 / pixel_density) as u32,
None => 0,
}
}
// https://html.spec.whatwg.org/multipage/#dom-img-naturalheight
fn NaturalHeight(&self) -> u32 {
let ref metadata = self.current_request.borrow().metadata;
let request = self.current_request.borrow();
let pixel_density = request.current_pixel_density.unwrap_or(1f64);
match *metadata {
Some(ref metadata) => metadata.height,
match request.metadata {
Some(ref metadata) => (metadata.height as f64 / pixel_density) as u32,
None => 0,
}
}