Fix document load event firing after pipeline is closed.

This commit is contained in:
Glenn Watson 2015-05-21 08:05:58 +10:00
parent fada39164c
commit b84c6fa5db
3 changed files with 32 additions and 9 deletions

View file

@ -296,7 +296,7 @@ impl<C> PaintTask<C> where C: PaintListener + Send + 'static {
// If we own buffers in the compositor and we are not exiting completely, wait
// for the compositor to return buffers, so that we can release them properly.
// When doing a complete exit, the compositor lets all buffers leak.
println!("PaintTask {:?}: Saw ExitMsg, {} buffers in use", self.id, self.used_buffer_count);
debug!("PaintTask {:?}: Saw ExitMsg, {} buffers in use", self.id, self.used_buffer_count);
waiting_for_compositor_buffers_to_exit = true;
exit_response_channel = response_channel;
}

View file

@ -1830,13 +1830,17 @@ impl DocumentProgressHandler {
impl Runnable for DocumentProgressHandler {
fn handler(self: Box<DocumentProgressHandler>) {
match self.task {
DocumentProgressTask::DOMContentLoaded => {
self.dispatch_dom_content_loaded();
}
DocumentProgressTask::Load => {
self.set_ready_state_complete();
self.dispatch_load();
let document = self.addr.to_temporary().root();
let window = document.r().window().root();
if window.r().is_alive() {
match self.task {
DocumentProgressTask::DOMContentLoaded => {
self.dispatch_dom_content_loaded();
}
DocumentProgressTask::Load => {
self.set_ready_state_complete();
self.dispatch_load();
}
}
}
}

View file

@ -69,6 +69,14 @@ use std::sync::mpsc::{channel, Receiver, Sender};
use std::sync::mpsc::TryRecvError::{Empty, Disconnected};
use time;
/// Current state of the window object
#[derive(Copy, Clone, Debug, PartialEq)]
#[jstraceable]
enum WindowState {
Alive,
Zombie, // Pipeline is closed, but the window hasn't been GCed yet.
}
/// Extra information concerning the reason for reflowing.
#[derive(Debug)]
pub enum ReflowReason {
@ -170,7 +178,10 @@ pub struct Window {
pending_reflow_count: Cell<u32>,
/// A channel for communicating results of async scripts back to the webdriver server
webdriver_script_chan: RefCell<Option<Sender<WebDriverJSResult>>>
webdriver_script_chan: RefCell<Option<Sender<WebDriverJSResult>>>,
/// The current state of the window object
current_state: Cell<WindowState>,
}
impl Window {
@ -179,6 +190,7 @@ impl Window {
unsafe {
*self.js_runtime.borrow_for_script_deallocation() = None;
*self.browser_context.borrow_for_script_deallocation() = None;
self.current_state.set(WindowState::Zombie);
}
}
@ -544,6 +556,7 @@ pub trait WindowHelpers {
fn set_devtools_timeline_marker(self, marker: TimelineMarkerType, reply: Sender<TimelineMarker>);
fn drop_devtools_timeline_markers(self);
fn set_webdriver_script_chan(self, chan: Option<Sender<WebDriverJSResult>>);
fn is_alive(self) -> bool;
}
pub trait ScriptHelpers {
@ -595,6 +608,7 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
// which causes a panic!
self.Gc();
self.current_state.set(WindowState::Zombie);
*self.js_runtime.borrow_mut() = None;
*self.browser_context.borrow_mut() = None;
}
@ -916,6 +930,10 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
fn set_webdriver_script_chan(self, chan: Option<Sender<WebDriverJSResult>>) {
*self.webdriver_script_chan.borrow_mut() = chan;
}
fn is_alive(self) -> bool {
self.current_state.get() == WindowState::Alive
}
}
impl Window {
@ -979,6 +997,7 @@ impl Window {
layout_join_port: DOMRefCell::new(None),
window_size: Cell::new(window_size),
pending_reflow_count: Cell::new(0),
current_state: Cell::new(WindowState::Alive),
devtools_marker_sender: RefCell::new(None),
devtools_markers: RefCell::new(HashSet::new()),