diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 727ba7e561d..7261f34b8ca 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -303,38 +303,43 @@ impl HTMLImageElement { document.loader_mut().fetch_async_background(request, action_sender); } - /// Step 14 of https://html.spec.whatwg.org/multipage/#update-the-image-data + // Steps common to when an image has been loaded. + fn handle_loaded_image(&self, image: Arc, url: ServoUrl) { + self.current_request.borrow_mut().metadata = Some(ImageMetadata { + height: image.height, + width: image.width + }); + self.current_request.borrow_mut().final_url = Some(url); + self.current_request.borrow_mut().image = Some(image); + self.current_request.borrow_mut().state = State::CompletelyAvailable; + LoadBlocker::terminate(&mut self.current_request.borrow_mut().blocker); + // Mark the node dirty + self.upcast::().dirty(NodeDamage::OtherNodeDamage); + } + + /// Step 24 of https://html.spec.whatwg.org/multipage/#update-the-image-data fn process_image_response(&self, image: ImageResponse) { // TODO: Handle multipart/x-mixed-replace let (trigger_image_load, trigger_image_error) = match (image, self.image_request.get()) { - (ImageResponse::Loaded(image, url), ImageRequestPhase::Current) | - (ImageResponse::PlaceholderLoaded(image, url), ImageRequestPhase::Current) => { - self.current_request.borrow_mut().metadata = Some(ImageMetadata { - height: image.height, - width: image.width - }); - self.current_request.borrow_mut().final_url = Some(url); - self.current_request.borrow_mut().image = Some(image); - self.current_request.borrow_mut().state = State::CompletelyAvailable; - LoadBlocker::terminate(&mut self.current_request.borrow_mut().blocker); - // Mark the node dirty - self.upcast::().dirty(NodeDamage::OtherNodeDamage); + (ImageResponse::Loaded(image, url), ImageRequestPhase::Current) => { + self.handle_loaded_image(image, url); + (true, false) + }, + (ImageResponse::PlaceholderLoaded(image, url), ImageRequestPhase::Current) => { + self.handle_loaded_image(image, url); + (false, true) + }, + (ImageResponse::Loaded(image, url), ImageRequestPhase::Pending) => { + self.abort_request(State::Unavailable, ImageRequestPhase::Pending); + self.image_request.set(ImageRequestPhase::Current); + self.handle_loaded_image(image, url); (true, false) }, - (ImageResponse::Loaded(image, url), ImageRequestPhase::Pending) | (ImageResponse::PlaceholderLoaded(image, url), ImageRequestPhase::Pending) => { self.abort_request(State::Unavailable, ImageRequestPhase::Pending); self.image_request.set(ImageRequestPhase::Current); - self.current_request.borrow_mut().metadata = Some(ImageMetadata { - height: image.height, - width: image.width - }); - self.current_request.borrow_mut().final_url = Some(url); - self.current_request.borrow_mut().image = Some(image); - self.current_request.borrow_mut().state = State::CompletelyAvailable; - LoadBlocker::terminate(&mut self.current_request.borrow_mut().blocker); - self.upcast::().dirty(NodeDamage::OtherNodeDamage); - (true, false) + self.handle_loaded_image(image, url); + (false, true) }, (ImageResponse::MetadataLoaded(meta), ImageRequestPhase::Current) => { self.current_request.borrow_mut().state = State::PartiallyAvailable; diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 59f6c3ea86b..6363abb2abc 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -13976,6 +13976,12 @@ {} ] ], + "mozilla/img_placeholder_load.html": [ + [ + "/_mozilla/mozilla/img_placeholder_load.html", + {} + ] + ], "mozilla/img_width_height.html": [ [ "/_mozilla/mozilla/img_width_height.html", @@ -27043,6 +27049,10 @@ "e9f1b56ac4c49c146868123a9a73f55c85ae3771", "testharness" ], + "mozilla/img_placeholder_load.html": [ + "c90b0041a4bc4c255819839cec7265ae65454674", + "testharness" + ], "mozilla/img_width_height.html": [ "ec68ac34ee2a35aebb38eb297a33a1cd98f5893c", "testharness" diff --git a/tests/wpt/mozilla/tests/mozilla/img_placeholder_load.html b/tests/wpt/mozilla/tests/mozilla/img_placeholder_load.html new file mode 100644 index 00000000000..c90b0041a4b --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/img_placeholder_load.html @@ -0,0 +1,21 @@ + + +Loading a placeholder image should trigger an error on the img element + + + + + +