mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
fire error when placeholder image is loaded
This commit is contained in:
parent
6b6fc7de92
commit
7b8d903d57
3 changed files with 60 additions and 24 deletions
|
@ -303,38 +303,43 @@ impl HTMLImageElement {
|
||||||
document.loader_mut().fetch_async_background(request, action_sender);
|
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<Image>, 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::<Node>().dirty(NodeDamage::OtherNodeDamage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Step 24 of https://html.spec.whatwg.org/multipage/#update-the-image-data
|
||||||
fn process_image_response(&self, image: ImageResponse) {
|
fn process_image_response(&self, image: ImageResponse) {
|
||||||
// TODO: Handle multipart/x-mixed-replace
|
// TODO: Handle multipart/x-mixed-replace
|
||||||
let (trigger_image_load, trigger_image_error) = match (image, self.image_request.get()) {
|
let (trigger_image_load, trigger_image_error) = match (image, self.image_request.get()) {
|
||||||
(ImageResponse::Loaded(image, url), ImageRequestPhase::Current) |
|
(ImageResponse::Loaded(image, url), ImageRequestPhase::Current) => {
|
||||||
(ImageResponse::PlaceholderLoaded(image, url), ImageRequestPhase::Current) => {
|
self.handle_loaded_image(image, url);
|
||||||
self.current_request.borrow_mut().metadata = Some(ImageMetadata {
|
(true, false)
|
||||||
height: image.height,
|
},
|
||||||
width: image.width
|
(ImageResponse::PlaceholderLoaded(image, url), ImageRequestPhase::Current) => {
|
||||||
});
|
self.handle_loaded_image(image, url);
|
||||||
self.current_request.borrow_mut().final_url = Some(url);
|
(false, true)
|
||||||
self.current_request.borrow_mut().image = Some(image);
|
},
|
||||||
self.current_request.borrow_mut().state = State::CompletelyAvailable;
|
(ImageResponse::Loaded(image, url), ImageRequestPhase::Pending) => {
|
||||||
LoadBlocker::terminate(&mut self.current_request.borrow_mut().blocker);
|
self.abort_request(State::Unavailable, ImageRequestPhase::Pending);
|
||||||
// Mark the node dirty
|
self.image_request.set(ImageRequestPhase::Current);
|
||||||
self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
|
self.handle_loaded_image(image, url);
|
||||||
(true, false)
|
(true, false)
|
||||||
},
|
},
|
||||||
(ImageResponse::Loaded(image, url), ImageRequestPhase::Pending) |
|
|
||||||
(ImageResponse::PlaceholderLoaded(image, url), ImageRequestPhase::Pending) => {
|
(ImageResponse::PlaceholderLoaded(image, url), ImageRequestPhase::Pending) => {
|
||||||
self.abort_request(State::Unavailable, ImageRequestPhase::Pending);
|
self.abort_request(State::Unavailable, ImageRequestPhase::Pending);
|
||||||
self.image_request.set(ImageRequestPhase::Current);
|
self.image_request.set(ImageRequestPhase::Current);
|
||||||
self.current_request.borrow_mut().metadata = Some(ImageMetadata {
|
self.handle_loaded_image(image, url);
|
||||||
height: image.height,
|
(false, true)
|
||||||
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::<Node>().dirty(NodeDamage::OtherNodeDamage);
|
|
||||||
(true, false)
|
|
||||||
},
|
},
|
||||||
(ImageResponse::MetadataLoaded(meta), ImageRequestPhase::Current) => {
|
(ImageResponse::MetadataLoaded(meta), ImageRequestPhase::Current) => {
|
||||||
self.current_request.borrow_mut().state = State::PartiallyAvailable;
|
self.current_request.borrow_mut().state = State::PartiallyAvailable;
|
||||||
|
|
|
@ -13976,6 +13976,12 @@
|
||||||
{}
|
{}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
"mozilla/img_placeholder_load.html": [
|
||||||
|
[
|
||||||
|
"/_mozilla/mozilla/img_placeholder_load.html",
|
||||||
|
{}
|
||||||
|
]
|
||||||
|
],
|
||||||
"mozilla/img_width_height.html": [
|
"mozilla/img_width_height.html": [
|
||||||
[
|
[
|
||||||
"/_mozilla/mozilla/img_width_height.html",
|
"/_mozilla/mozilla/img_width_height.html",
|
||||||
|
@ -27043,6 +27049,10 @@
|
||||||
"e9f1b56ac4c49c146868123a9a73f55c85ae3771",
|
"e9f1b56ac4c49c146868123a9a73f55c85ae3771",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
|
"mozilla/img_placeholder_load.html": [
|
||||||
|
"c90b0041a4bc4c255819839cec7265ae65454674",
|
||||||
|
"testharness"
|
||||||
|
],
|
||||||
"mozilla/img_width_height.html": [
|
"mozilla/img_width_height.html": [
|
||||||
"ec68ac34ee2a35aebb38eb297a33a1cd98f5893c",
|
"ec68ac34ee2a35aebb38eb297a33a1cd98f5893c",
|
||||||
"testharness"
|
"testharness"
|
||||||
|
|
21
tests/wpt/mozilla/tests/mozilla/img_placeholder_load.html
Normal file
21
tests/wpt/mozilla/tests/mozilla/img_placeholder_load.html
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Loading a placeholder image should trigger an error on the img element</title>
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
|
||||||
|
<img>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
async_test(function(t) {
|
||||||
|
var img = document.querySelector("img");
|
||||||
|
img.onload = this.step_func_done(function() {
|
||||||
|
assert_unreached("image.onload() was not supposed to be called");
|
||||||
|
});
|
||||||
|
img.onerror = this.step_func_done(function(e) {
|
||||||
|
assert_equals(e.type, "error", "image.onerror() called");
|
||||||
|
t.done();
|
||||||
|
});
|
||||||
|
img.src = "http://whatevertheheckawefawefawe.org/img.gif";
|
||||||
|
});
|
||||||
|
</script>
|
Loading…
Add table
Add a link
Reference in a new issue