Auto merge of #21399 - gterzian:error_on_placeholder_load, r=jdm

Fire error when placeholder is loaded

<!-- Please describe your changes on the following line: -->

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [ ] `./mach build -d` does not report any errors
- [ ] `./mach test-tidy` does not report any errors
- [ ] These changes fix #21397 (github issue number if applicable).

<!-- Either: -->
- [ ] There are tests for these changes OR
- [ ] These changes do not require tests because _____

<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21399)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-08-26 15:25:33 -04:00 committed by GitHub
commit da36740f0b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 60 additions and 24 deletions

View file

@ -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;

View file

@ -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"

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