Auto merge of #12921 - paulrouget:imgOnError, r=nox

Trigger image.onerror

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

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

<!-- 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/12921)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-08-23 02:31:48 -05:00 committed by GitHub
commit fe09cb5504
4 changed files with 35 additions and 4 deletions

View file

@ -86,14 +86,14 @@ impl Runnable for ImageResponseHandlerRunnable {
// Update the image field // Update the image field
let element = self.element.root(); let element = self.element.root();
let element_ref = element.r(); let element_ref = element.r();
let (image, metadata, trigger_image_load) = match self.image { let (image, metadata, trigger_image_load, trigger_image_error) = match self.image {
ImageResponse::Loaded(image) | ImageResponse::PlaceholderLoaded(image) => { ImageResponse::Loaded(image) | ImageResponse::PlaceholderLoaded(image) => {
(Some(image.clone()), Some(ImageMetadata { height: image.height, width: image.width } ), true) (Some(image.clone()), Some(ImageMetadata { height: image.height, width: image.width } ), true, false)
} }
ImageResponse::MetadataLoaded(meta) => { ImageResponse::MetadataLoaded(meta) => {
(None, Some(meta), false) (None, Some(meta), false, false)
} }
ImageResponse::None => (None, None, true) ImageResponse::None => (None, None, false, true)
}; };
element_ref.current_request.borrow_mut().image = image; element_ref.current_request.borrow_mut().image = image;
element_ref.current_request.borrow_mut().metadata = metadata; element_ref.current_request.borrow_mut().metadata = metadata;
@ -107,6 +107,11 @@ impl Runnable for ImageResponseHandlerRunnable {
element.upcast::<EventTarget>().fire_simple_event("load"); element.upcast::<EventTarget>().fire_simple_event("load");
} }
// Fire image.onerror
if trigger_image_error {
element.upcast::<EventTarget>().fire_simple_event("error");
}
// Trigger reflow // Trigger reflow
let window = window_from_node(document.r()); let window = window_from_node(document.r());
window.add_pending_reflow(); window.add_pending_reflow();

View file

@ -19305,6 +19305,10 @@
"path": "html/semantics/embedded-content/the-img-element/invalid-src.html", "path": "html/semantics/embedded-content/the-img-element/invalid-src.html",
"url": "/html/semantics/embedded-content/the-img-element/invalid-src.html" "url": "/html/semantics/embedded-content/the-img-element/invalid-src.html"
}, },
{
"path": "html/semantics/embedded-content/the-img-element/nonexistent-image.html",
"url": "/html/semantics/embedded-content/the-img-element/nonexistent-image.html"
},
{ {
"path": "html/semantics/embedded-content/the-img-element/relevant-mutations.html", "path": "html/semantics/embedded-content/the-img-element/relevant-mutations.html",
"url": "/html/semantics/embedded-content/the-img-element/relevant-mutations.html" "url": "/html/semantics/embedded-content/the-img-element/relevant-mutations.html"

View file

@ -1,5 +1,6 @@
[tex-image-and-sub-image-2d-with-svg-image.html] [tex-image-and-sub-image-2d-with-svg-image.html]
type: testharness type: testharness
expected: TIMEOUT
[WebGL test #0: at (4, 4) expected: 0,255,0 was 0,0,0] [WebGL test #0: at (4, 4) expected: 0,255,0 was 0,0,0]
expected: FAIL expected: FAIL

View file

@ -0,0 +1,21 @@
<!DOCTYPE HTML>
<meta charset="utf-8">
<title>Loading an nonexisting image should fail; triggering appropriate events</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 = "404";
});
</script>