mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
Ignore image cache updates for image requests that have been aborted.
This commit is contained in:
parent
f0f43ad9b0
commit
208f97420a
1 changed files with 16 additions and 3 deletions
|
@ -46,6 +46,8 @@ use network_listener::{NetworkListener, PreInvoke};
|
||||||
use num_traits::ToPrimitive;
|
use num_traits::ToPrimitive;
|
||||||
use script_thread::Runnable;
|
use script_thread::Runnable;
|
||||||
use servo_url::ServoUrl;
|
use servo_url::ServoUrl;
|
||||||
|
use std::cell::Cell;
|
||||||
|
use std::default::Default;
|
||||||
use std::i32;
|
use std::i32;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use style::attr::{AttrValue, LengthOrPercentageOrAuto};
|
use style::attr::{AttrValue, LengthOrPercentageOrAuto};
|
||||||
|
@ -75,6 +77,7 @@ pub struct HTMLImageElement {
|
||||||
htmlelement: HTMLElement,
|
htmlelement: HTMLElement,
|
||||||
current_request: DOMRefCell<ImageRequest>,
|
current_request: DOMRefCell<ImageRequest>,
|
||||||
pending_request: DOMRefCell<ImageRequest>,
|
pending_request: DOMRefCell<ImageRequest>,
|
||||||
|
generation: Cell<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLImageElement {
|
impl HTMLImageElement {
|
||||||
|
@ -86,14 +89,16 @@ impl HTMLImageElement {
|
||||||
struct ImageResponseHandlerRunnable {
|
struct ImageResponseHandlerRunnable {
|
||||||
element: Trusted<HTMLImageElement>,
|
element: Trusted<HTMLImageElement>,
|
||||||
image: ImageResponse,
|
image: ImageResponse,
|
||||||
|
generation: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ImageResponseHandlerRunnable {
|
impl ImageResponseHandlerRunnable {
|
||||||
fn new(element: Trusted<HTMLImageElement>, image: ImageResponse)
|
fn new(element: Trusted<HTMLImageElement>, image: ImageResponse, generation: u32)
|
||||||
-> ImageResponseHandlerRunnable {
|
-> ImageResponseHandlerRunnable {
|
||||||
ImageResponseHandlerRunnable {
|
ImageResponseHandlerRunnable {
|
||||||
element: element,
|
element: element,
|
||||||
image: image,
|
image: image,
|
||||||
|
generation: generation,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,7 +108,10 @@ impl Runnable for ImageResponseHandlerRunnable {
|
||||||
|
|
||||||
fn handler(self: Box<Self>) {
|
fn handler(self: Box<Self>) {
|
||||||
let element = self.element.root();
|
let element = self.element.root();
|
||||||
element.process_image_response(self.image);
|
// Ignore any image response for a previous request that has been discarded.
|
||||||
|
if element.generation.get() == self.generation {
|
||||||
|
element.process_image_response(self.image);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,11 +204,12 @@ impl HTMLImageElement {
|
||||||
let window = window_from_node(elem);
|
let window = window_from_node(elem);
|
||||||
let task_source = window.networking_task_source();
|
let task_source = window.networking_task_source();
|
||||||
let wrapper = window.get_runnable_wrapper();
|
let wrapper = window.get_runnable_wrapper();
|
||||||
|
let generation = elem.generation.get();
|
||||||
ROUTER.add_route(responder_receiver.to_opaque(), box move |message| {
|
ROUTER.add_route(responder_receiver.to_opaque(), box move |message| {
|
||||||
// Return the image via a message to the script thread, which marks the element
|
// Return the image via a message to the script thread, which marks the element
|
||||||
// as dirty and triggers a reflow.
|
// as dirty and triggers a reflow.
|
||||||
let runnable = ImageResponseHandlerRunnable::new(
|
let runnable = ImageResponseHandlerRunnable::new(
|
||||||
trusted_node.clone(), message.to().unwrap());
|
trusted_node.clone(), message.to().unwrap(), generation);
|
||||||
let _ = task_source.queue_with_wrapper(box runnable, &wrapper);
|
let _ = task_source.queue_with_wrapper(box runnable, &wrapper);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -308,6 +317,9 @@ impl HTMLImageElement {
|
||||||
/// Makes the local `image` member match the status of the `src` attribute and starts
|
/// Makes the local `image` member match the status of the `src` attribute and starts
|
||||||
/// prefetching the image. This method must be called after `src` is changed.
|
/// prefetching the image. This method must be called after `src` is changed.
|
||||||
fn update_image(&self, value: Option<(DOMString, ServoUrl)>) {
|
fn update_image(&self, value: Option<(DOMString, ServoUrl)>) {
|
||||||
|
// Force any in-progress request to be ignored.
|
||||||
|
self.generation.set(self.generation.get() + 1);
|
||||||
|
|
||||||
let document = document_from_node(self);
|
let document = document_from_node(self);
|
||||||
let window = document.window();
|
let window = document.window();
|
||||||
match value {
|
match value {
|
||||||
|
@ -380,6 +392,7 @@ impl HTMLImageElement {
|
||||||
metadata: None,
|
metadata: None,
|
||||||
blocker: None,
|
blocker: None,
|
||||||
}),
|
}),
|
||||||
|
generation: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue