Skip to content

Commit

Permalink
Replace XHR events for generic ones in ScriptTask
Browse files Browse the repository at this point in the history
fixup! Replace XHR events for generic ones in ScriptTask

fixup! Replace XHR events for generic ones in ScriptTask
  • Loading branch information
thiagopnts committed Dec 24, 2014
1 parent c92a789 commit 271aa27
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 21 deletions.
2 changes: 1 addition & 1 deletion components/script/dom/bindings/error.rs
Expand Up @@ -19,7 +19,7 @@ use libc;
use std::ptr;

/// DOM exceptions that can be thrown by a native DOM method.
#[deriving(Show)]
#[deriving(Show, Clone)]
pub enum Error {
IndexSize,
FailureUnknown,
Expand Down
8 changes: 2 additions & 6 deletions components/script/dom/dedicatedworkerglobalscope.rs
Expand Up @@ -17,7 +17,6 @@ use dom::messageevent::MessageEvent;
use dom::worker::{Worker, TrustedWorkerAddress};
use dom::workerglobalscope::{WorkerGlobalScope, WorkerGlobalScopeHelpers};
use dom::workerglobalscope::WorkerGlobalScopeTypeId;
use dom::xmlhttprequest::XMLHttpRequest;
use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource};
use script_task::StackRootTLS;

Expand Down Expand Up @@ -131,11 +130,8 @@ impl DedicatedWorkerGlobalScope {
MessageEvent::dispatch_jsval(target, GlobalRef::Worker(scope), message);
global.delayed_release_worker();
},
Ok(ScriptMsg::XHRProgress(addr, progress)) => {
XMLHttpRequest::handle_progress(addr, progress)
},
Ok(ScriptMsg::XHRRelease(addr)) => {
XMLHttpRequest::handle_release(addr)
Ok(ScriptMsg::RunnableMsg(runnable)) => {
runnable.handler()
},
Ok(ScriptMsg::WorkerPostMessage(addr, data, nbytes)) => {
Worker::handle_message(addr, data, nbytes);
Expand Down
37 changes: 32 additions & 5 deletions components/script/dom/xmlhttprequest.rs
Expand Up @@ -25,7 +25,7 @@ use dom::urlsearchparams::URLSearchParamsHelpers;
use dom::xmlhttprequesteventtarget::XMLHttpRequestEventTarget;
use dom::xmlhttprequesteventtarget::XMLHttpRequestEventTargetTypeId;
use dom::xmlhttprequestupload::XMLHttpRequestUpload;
use script_task::{ScriptChan, ScriptMsg};
use script_task::{ScriptChan, ScriptMsg, Runnable};

use encoding::all::UTF_8;
use encoding::label::encoding_from_whatwg_label;
Expand Down Expand Up @@ -73,10 +73,37 @@ enum XMLHttpRequestState {
XHRDone = 4, // So as not to conflict with the ProgressMsg `Done`
}

#[deriving(PartialEq)]
struct XHRReleaseHandler(TrustedXHRAddress);

impl Runnable for XHRReleaseHandler {
fn handler(&self) {
let XHRReleaseHandler(addr) = *self;
XMLHttpRequest::handle_release(addr);
}
}

struct XHRProgressHandler {
addr: TrustedXHRAddress,
progress: XHRProgress,
}

impl XHRProgressHandler {
fn new(addr: TrustedXHRAddress, progress: XHRProgress) -> XHRProgressHandler {
XHRProgressHandler { addr: addr, progress: progress }
}
}

impl Runnable for XHRProgressHandler {
fn handler(&self) {
XMLHttpRequest::handle_progress(self.addr, self.progress.clone());
}
}

#[deriving(PartialEq, Clone)]
#[jstraceable]
pub struct GenerationId(uint);

#[deriving(Clone)]
pub enum XHRProgress {
/// Notify that headers have been received
HeadersReceived(GenerationId, Option<Headers>, Option<RawStatus>),
Expand Down Expand Up @@ -208,7 +235,7 @@ impl XMLHttpRequest {
},
SyncOrAsync::Async(addr, script_chan) => {
let ScriptChan(ref chan) = *script_chan;
chan.send(ScriptMsg::XHRProgress(addr, msg));
chan.send(ScriptMsg::RunnableMsg(box XHRProgressHandler::new(addr, msg)));
}
}
}
Expand Down Expand Up @@ -609,7 +636,7 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
self.fetch_time.set(time::now().to_timespec().sec);
let script_chan = global.root_ref().script_chan().clone();
// Pin the object before launching the fetch task.
// The `ScriptMsg::XHRRelease` sent when the fetch task completes will
// The `ScriptMsg::RunnableMsg` sent when the fetch task completes will
// unpin it. This is to ensure that the object will stay alive
// as long as there are (possibly cancelled) inflight events queued up
// in the script task's port
Expand All @@ -625,7 +652,7 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
gen_id,
start_port);
let ScriptChan(ref chan) = script_chan;
chan.send(ScriptMsg::XHRRelease(addr));
chan.send(ScriptMsg::RunnableMsg(box XHRReleaseHandler(addr)));
});
let timeout = self.timeout.get();
if timeout > 0 {
Expand Down
17 changes: 8 additions & 9 deletions components/script/script_task.rs
Expand Up @@ -26,7 +26,6 @@ use dom::keyboardevent::KeyboardEvent;
use dom::node::{mod, Node, NodeHelpers, NodeDamage, NodeTypeId};
use dom::window::{Window, WindowHelpers};
use dom::worker::{Worker, TrustedWorkerAddress};
use dom::xmlhttprequest::{TrustedXHRAddress, XMLHttpRequest, XHRProgress};
use parse::html::{HTMLInput, parse_html};
use layout_interface::{ScriptLayoutChan, LayoutChan, ReflowGoal, ReflowQueryType};
use layout_interface;
Expand Down Expand Up @@ -86,6 +85,10 @@ pub enum TimerSource {
FromWorker
}

pub trait Runnable {
fn handler(&self);
}

/// Messages used to control script event loops, such as ScriptTask and
/// DedicatedWorkerGlobalScope.
pub enum ScriptMsg {
Expand All @@ -105,17 +108,15 @@ pub enum ScriptMsg {
/// Notifies the script that a window associated with a particular pipeline
/// should be closed (only dispatched to ScriptTask).
ExitWindow(PipelineId),
/// Notifies the script of progress on a fetch (dispatched to all tasks).
XHRProgress(TrustedXHRAddress, XHRProgress),
/// Releases one reference to the XHR object (dispatched to all tasks).
XHRRelease(TrustedXHRAddress),
/// Message sent through Worker.postMessage (only dispatched to
/// DedicatedWorkerGlobalScope).
DOMMessage(*mut u64, size_t),
/// Posts a message to the Worker object (dispatched to all tasks).
WorkerPostMessage(TrustedWorkerAddress, *mut u64, size_t),
/// Releases one reference to the Worker object (dispatched to all tasks).
WorkerRelease(TrustedWorkerAddress),
/// Generic message that encapsulates event handling.
RunnableMsg(Box<Runnable+Send>),
}

/// Encapsulates internal communication within the script task.
Expand Down Expand Up @@ -571,16 +572,14 @@ impl ScriptTask {
self.handle_navigate_msg(direction),
ScriptMsg::ExitWindow(id) =>
self.handle_exit_window_msg(id),
ScriptMsg::XHRProgress(addr, progress) =>
XMLHttpRequest::handle_progress(addr, progress),
ScriptMsg::XHRRelease(addr) =>
XMLHttpRequest::handle_release(addr),
ScriptMsg::DOMMessage(..) =>
panic!("unexpected message"),
ScriptMsg::WorkerPostMessage(addr, data, nbytes) =>
Worker::handle_message(addr, data, nbytes),
ScriptMsg::WorkerRelease(addr) =>
Worker::handle_release(addr),
ScriptMsg::RunnableMsg(runnable) =>
runnable.handler(),
}
}

Expand Down

10 comments on commit 271aa27

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from jdm
at thiagopnts@271aa27

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging thiagopnts/servo/generic-msgs = 271aa27 into auto

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thiagopnts/servo/generic-msgs = 271aa27 merged ok, testing candidate = 41d3e94

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Ms2ger
Copy link
Contributor

@Ms2ger Ms2ger commented on 271aa27 Dec 24, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from jdm
at thiagopnts@271aa27

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging thiagopnts/servo/generic-msgs = 271aa27 into auto

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thiagopnts/servo/generic-msgs = 271aa27 merged ok, testing candidate = 194ce20

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors-servo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding master to auto = 194ce20

Please sign in to comment.