aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/script_thread.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-05-21 01:12:54 -0700
committerbors-servo <lbergstrom+bors@mozilla.com>2016-05-21 01:12:54 -0700
commit1a34137ac41276239850d91073bec2c0ef2344d9 (patch)
tree0522967016e402d5816075d9e5b6f0adee9b5266 /components/script/script_thread.rs
parent63bbc13fffeaa14f15ff9270f7d6355fab4d3d56 (diff)
parent3766cd167365187bfabbb00f5dc41ba923fe23d4 (diff)
downloadservo-1a34137ac41276239850d91073bec2c0ef2344d9.tar.gz
servo-1a34137ac41276239850d91073bec2c0ef2344d9.zip
Auto merge of #10961 - creativcoder:custom_response_iface, r=jdm
adding interface for custom responses Fixes #10960 <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/10961) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/script_thread.rs')
-rw-r--r--components/script/script_thread.rs39
1 files changed, 35 insertions, 4 deletions
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index 8f43e1b1bfc..f7bb765651d 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -65,8 +65,8 @@ use msg::webdriver_msg::WebDriverScriptCommand;
use net_traits::LoadData as NetLoadData;
use net_traits::bluetooth_thread::BluetoothMethodMsg;
use net_traits::image_cache_thread::{ImageCacheChan, ImageCacheResult, ImageCacheThread};
-use net_traits::{AsyncResponseTarget, CoreResourceMsg, LoadConsumer, LoadContext, Metadata};
-use net_traits::{ResourceThreads, IpcSend};
+use net_traits::{AsyncResponseTarget, CoreResourceMsg, LoadConsumer, LoadContext, Metadata, ResourceThreads};
+use net_traits::{RequestSource, CustomResponse, CustomResponseSender, IpcSend};
use network_listener::NetworkListener;
use parse::ParserRoot;
use parse::html::{ParseContext, parse_html};
@@ -205,6 +205,7 @@ enum MixedMessage {
FromDevtools(DevtoolScriptControlMsg),
FromImageCache(ImageCacheResult),
FromScheduler(TimerEvent),
+ FromNetwork(IpcSender<Option<CustomResponse>>),
}
/// Messages used to control the script event loop
@@ -321,6 +322,12 @@ pub struct ScriptThread {
/// events in the event queue.
chan: MainThreadScriptChan,
+ /// A handle to network event messages
+ custom_message_chan: IpcSender<CustomResponseSender>,
+
+ /// The port which receives a sender from the network
+ custom_message_port: Receiver<CustomResponseSender>,
+
dom_manipulation_task_source: DOMManipulationTaskSource,
user_interaction_task_source: UserInteractionTaskSource,
@@ -536,6 +543,9 @@ impl ScriptThread {
let (ipc_devtools_sender, ipc_devtools_receiver) = ipc::channel().unwrap();
let devtools_port = ROUTER.route_ipc_receiver_to_new_mpsc_receiver(ipc_devtools_receiver);
+ let (ipc_custom_resp_chan, ipc_custom_resp_port) = ipc::channel().unwrap();
+ let custom_msg_port = ROUTER.route_ipc_receiver_to_new_mpsc_receiver(ipc_custom_resp_port);
+
// Ask the router to proxy IPC messages from the image cache thread to us.
let (ipc_image_cache_channel, ipc_image_cache_port) = ipc::channel().unwrap();
let image_cache_port =
@@ -558,6 +568,9 @@ impl ScriptThread {
bluetooth_thread: state.bluetooth_thread,
port: port,
+ custom_message_chan: ipc_custom_resp_chan,
+ custom_message_port: custom_msg_port,
+
chan: MainThreadScriptChan(chan.clone()),
dom_manipulation_task_source: DOMManipulationTaskSource(chan.clone()),
user_interaction_task_source: UserInteractionTaskSource(chan.clone()),
@@ -619,7 +632,8 @@ impl ScriptThread {
/// Handle incoming control messages.
fn handle_msgs(&self) -> bool {
- use self::MixedMessage::{FromScript, FromConstellation, FromScheduler, FromDevtools, FromImageCache};
+ use self::MixedMessage::{FromConstellation, FromDevtools, FromImageCache};
+ use self::MixedMessage::{FromScheduler, FromScript, FromNetwork};
// Handle pending resize events.
// Gather them first to avoid a double mut borrow on self.
@@ -653,6 +667,7 @@ impl ScriptThread {
let mut timer_event_port = sel.handle(&self.timer_event_port);
let mut devtools_port = sel.handle(&self.devtools_port);
let mut image_cache_port = sel.handle(&self.image_cache_port);
+ let mut custom_message_port = sel.handle(&self.custom_message_port);
unsafe {
script_port.add();
control_port.add();
@@ -661,6 +676,7 @@ impl ScriptThread {
devtools_port.add();
}
image_cache_port.add();
+ custom_message_port.add();
}
let ret = sel.wait();
if ret == script_port.id() {
@@ -673,6 +689,8 @@ impl ScriptThread {
FromDevtools(self.devtools_port.recv().unwrap())
} else if ret == image_cache_port.id() {
FromImageCache(self.image_cache_port.recv().unwrap())
+ } else if ret == custom_message_port.id() {
+ FromNetwork(self.custom_message_port.recv().unwrap())
} else {
panic!("unexpected select result")
}
@@ -735,7 +753,10 @@ impl ScriptThread {
Err(_) => match self.timer_event_port.try_recv() {
Err(_) => match self.devtools_port.try_recv() {
Err(_) => match self.image_cache_port.try_recv() {
- Err(_) => break,
+ Err(_) => match self.custom_message_port.try_recv() {
+ Err(_) => break,
+ Ok(ev) => event = FromNetwork(ev)
+ },
Ok(ev) => event = FromImageCache(ev),
},
Ok(ev) => event = FromDevtools(ev),
@@ -761,6 +782,7 @@ impl ScriptThread {
},
FromConstellation(inner_msg) => self.handle_msg_from_constellation(inner_msg),
FromScript(inner_msg) => self.handle_msg_from_script(inner_msg),
+ FromNetwork(inner_msg) => self.handle_msg_from_network(inner_msg),
FromScheduler(inner_msg) => self.handle_timer_event(inner_msg),
FromDevtools(inner_msg) => self.handle_msg_from_devtools(inner_msg),
FromImageCache(inner_msg) => self.handle_msg_from_image_cache(inner_msg),
@@ -820,6 +842,7 @@ impl ScriptThread {
}
},
MixedMessage::FromScheduler(_) => ScriptThreadEventCategory::TimerEvent,
+ MixedMessage::FromNetwork(_) => ScriptThreadEventCategory::NetworkEvent
}
}
@@ -989,6 +1012,12 @@ impl ScriptThread {
msg.responder.unwrap().respond(msg.image_response);
}
+ fn handle_msg_from_network(&self, msg: IpcSender<Option<CustomResponse>>) {
+ // We may detect controlling service workers here
+ // We send None as default
+ let _ = msg.send(None);
+ }
+
fn handle_webdriver_msg(&self, pipeline_id: PipelineId, msg: WebDriverScriptCommand) {
let context = self.root_browsing_context();
match msg {
@@ -1437,6 +1466,7 @@ impl ScriptThread {
HistoryTraversalTaskSource(history_sender.clone()),
FileReadingTaskSource(file_sender.clone()),
self.image_cache_channel.clone(),
+ self.custom_message_chan.clone(),
self.compositor.borrow_mut().clone(),
self.image_cache_thread.clone(),
self.resource_threads.clone(),
@@ -1905,6 +1935,7 @@ impl ScriptThread {
credentials_flag: true,
referrer_policy: load_data.referrer_policy,
referrer_url: load_data.referrer_url,
+ source: RequestSource::Window(self.custom_message_chan.clone())
}, LoadConsumer::Listener(response_target), None)).unwrap();
self.incomplete_loads.borrow_mut().push(incomplete);