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
+
+
+
+
+
+