mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Fixes issue #6866
This commit is contained in:
parent
f1c26c59f1
commit
49c5408e65
8 changed files with 67 additions and 40 deletions
|
@ -9,6 +9,7 @@ use std::net::TcpStream;
|
||||||
|
|
||||||
pub struct WorkerActor {
|
pub struct WorkerActor {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
pub console: String,
|
||||||
pub id: WorkerId,
|
pub id: WorkerId,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -240,6 +240,7 @@ fn run_server(sender: Sender<DevtoolsControlMsg>,
|
||||||
if let Some(id) = worker_id {
|
if let Some(id) = worker_id {
|
||||||
let worker = WorkerActor {
|
let worker = WorkerActor {
|
||||||
name: actors.new_name("worker"),
|
name: actors.new_name("worker"),
|
||||||
|
console: console.name(),
|
||||||
id: id,
|
id: id,
|
||||||
};
|
};
|
||||||
actor_workers.insert((pipeline, id), worker.name.clone());
|
actor_workers.insert((pipeline, id), worker.name.clone());
|
||||||
|
@ -255,9 +256,12 @@ fn run_server(sender: Sender<DevtoolsControlMsg>,
|
||||||
|
|
||||||
fn handle_console_message(actors: Arc<Mutex<ActorRegistry>>,
|
fn handle_console_message(actors: Arc<Mutex<ActorRegistry>>,
|
||||||
id: PipelineId,
|
id: PipelineId,
|
||||||
|
worker_id: Option<WorkerId>,
|
||||||
console_message: ConsoleMessage,
|
console_message: ConsoleMessage,
|
||||||
actor_pipelines: &HashMap<PipelineId, String>) {
|
actor_pipelines: &HashMap<PipelineId, String>,
|
||||||
let console_actor_name = match find_console_actor(actors.clone(), id, actor_pipelines) {
|
actor_workers: &HashMap<(PipelineId, WorkerId), String>) {
|
||||||
|
let console_actor_name = match find_console_actor(actors.clone(), id, worker_id, actor_workers,
|
||||||
|
actor_pipelines) {
|
||||||
Some(name) => name,
|
Some(name) => name,
|
||||||
None => return,
|
None => return,
|
||||||
};
|
};
|
||||||
|
@ -288,27 +292,36 @@ fn run_server(sender: Sender<DevtoolsControlMsg>,
|
||||||
|
|
||||||
fn find_console_actor(actors: Arc<Mutex<ActorRegistry>>,
|
fn find_console_actor(actors: Arc<Mutex<ActorRegistry>>,
|
||||||
id: PipelineId,
|
id: PipelineId,
|
||||||
|
worker_id: Option<WorkerId>,
|
||||||
|
actor_workers: &HashMap<(PipelineId, WorkerId), String>,
|
||||||
actor_pipelines: &HashMap<PipelineId, String>) -> Option<String> {
|
actor_pipelines: &HashMap<PipelineId, String>) -> Option<String> {
|
||||||
let actors = actors.lock().unwrap();
|
let actors = actors.lock().unwrap();
|
||||||
let tab_actor_name = match (*actor_pipelines).get(&id) {
|
if let Some(worker_id) = worker_id {
|
||||||
|
let actor_name = match (*actor_workers).get(&(id, worker_id)) {
|
||||||
Some(name) => name,
|
Some(name) => name,
|
||||||
None => return None,
|
None => return None,
|
||||||
};
|
};
|
||||||
let tab_actor = actors.find::<TabActor>(tab_actor_name);
|
Some(actors.find::<WorkerActor>(actor_name).console.clone())
|
||||||
let console_actor_name = tab_actor.console.clone();
|
} else {
|
||||||
return Some(console_actor_name);
|
let actor_name = match (*actor_pipelines).get(&id) {
|
||||||
|
Some(name) => name,
|
||||||
|
None => return None,
|
||||||
|
};
|
||||||
|
Some(actors.find::<TabActor>(actor_name).console.clone())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_network_event(actors: Arc<Mutex<ActorRegistry>>,
|
fn handle_network_event(actors: Arc<Mutex<ActorRegistry>>,
|
||||||
mut connections: Vec<TcpStream>,
|
mut connections: Vec<TcpStream>,
|
||||||
actor_pipelines: &HashMap<PipelineId, String>,
|
actor_pipelines: &HashMap<PipelineId, String>,
|
||||||
actor_requests: &mut HashMap<String, String>,
|
actor_requests: &mut HashMap<String, String>,
|
||||||
|
actor_workers: &HashMap<(PipelineId, WorkerId), String>,
|
||||||
pipeline_id: PipelineId,
|
pipeline_id: PipelineId,
|
||||||
request_id: String,
|
request_id: String,
|
||||||
network_event: NetworkEvent) {
|
network_event: NetworkEvent) {
|
||||||
|
|
||||||
let console_actor_name = match find_console_actor(actors.clone(), pipeline_id,
|
let console_actor_name = match find_console_actor(actors.clone(), pipeline_id, None,
|
||||||
actor_pipelines) {
|
actor_workers, actor_pipelines) {
|
||||||
Some(name) => name,
|
Some(name) => name,
|
||||||
None => return,
|
None => return,
|
||||||
};
|
};
|
||||||
|
@ -401,9 +414,10 @@ fn run_server(sender: Sender<DevtoolsControlMsg>,
|
||||||
&mut actor_workers, pageinfo),
|
&mut actor_workers, pageinfo),
|
||||||
Ok(DevtoolsControlMsg::FromScript(ScriptToDevtoolsControlMsg::SendConsoleMessage(
|
Ok(DevtoolsControlMsg::FromScript(ScriptToDevtoolsControlMsg::SendConsoleMessage(
|
||||||
id,
|
id,
|
||||||
console_message))) =>
|
console_message,
|
||||||
handle_console_message(actors.clone(), id, console_message,
|
worker_id))) =>
|
||||||
&actor_pipelines),
|
handle_console_message(actors.clone(), id, worker_id, console_message,
|
||||||
|
&actor_pipelines, &actor_workers),
|
||||||
Ok(DevtoolsControlMsg::FromChrome(ChromeToDevtoolsControlMsg::NetworkEventMessage(
|
Ok(DevtoolsControlMsg::FromChrome(ChromeToDevtoolsControlMsg::NetworkEventMessage(
|
||||||
request_id, network_event))) => {
|
request_id, network_event))) => {
|
||||||
// copy the accepted_connections vector
|
// copy the accepted_connections vector
|
||||||
|
@ -414,7 +428,7 @@ fn run_server(sender: Sender<DevtoolsControlMsg>,
|
||||||
//TODO: Get pipeline_id from NetworkEventMessage after fixing the send in http_loader
|
//TODO: Get pipeline_id from NetworkEventMessage after fixing the send in http_loader
|
||||||
// For now, the id of the first pipeline is passed
|
// For now, the id of the first pipeline is passed
|
||||||
handle_network_event(actors.clone(), connections, &actor_pipelines, &mut actor_requests,
|
handle_network_event(actors.clone(), connections, &actor_pipelines, &mut actor_requests,
|
||||||
PipelineId(0), request_id, network_event);
|
&actor_workers, PipelineId(0), request_id, network_event);
|
||||||
},
|
},
|
||||||
Ok(DevtoolsControlMsg::FromChrome(ChromeToDevtoolsControlMsg::ServerExitMsg)) |
|
Ok(DevtoolsControlMsg::FromChrome(ChromeToDevtoolsControlMsg::ServerExitMsg)) |
|
||||||
Err(RecvError) => break
|
Err(RecvError) => break
|
||||||
|
|
|
@ -69,7 +69,7 @@ pub enum ScriptToDevtoolsControlMsg {
|
||||||
NewGlobal((PipelineId, Option<WorkerId>),
|
NewGlobal((PipelineId, Option<WorkerId>),
|
||||||
IpcSender<DevtoolScriptControlMsg>,
|
IpcSender<DevtoolScriptControlMsg>,
|
||||||
DevtoolsPageInfo),
|
DevtoolsPageInfo),
|
||||||
SendConsoleMessage(PipelineId, ConsoleMessage),
|
SendConsoleMessage(PipelineId, ConsoleMessage, Option<WorkerId>),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Serialized JS return values
|
/// Serialized JS return values
|
||||||
|
@ -268,4 +268,3 @@ impl PreciseTime {
|
||||||
Duration::nanoseconds((later.0 - self.0) as i64)
|
Duration::nanoseconds((later.0 - self.0) as i64)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -121,6 +121,14 @@ impl<'a> GlobalRef<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the worker's id.
|
||||||
|
pub fn get_worker_id(&self) -> Option<WorkerId> {
|
||||||
|
match *self {
|
||||||
|
GlobalRef::Window(_) => None,
|
||||||
|
GlobalRef::Worker(ref worker) => worker.get_worker_id(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Get next worker id.
|
/// Get next worker id.
|
||||||
pub fn get_next_worker_id(&self) -> WorkerId {
|
pub fn get_next_worker_id(&self) -> WorkerId {
|
||||||
match *self {
|
match *self {
|
||||||
|
|
|
@ -98,17 +98,9 @@ fn prepare_message(logLevel: LogLevel, message: String) -> ConsoleMessage {
|
||||||
|
|
||||||
fn propagate_console_msg(console: &&Console, console_message: ConsoleMessage) {
|
fn propagate_console_msg(console: &&Console, console_message: ConsoleMessage) {
|
||||||
let global = console.global.root();
|
let global = console.global.root();
|
||||||
match global.r() {
|
let pipelineId = global.r().pipeline();
|
||||||
GlobalRef::Window(window_ref) => {
|
global.r().devtools_chan().as_ref().map(|chan| {
|
||||||
let pipelineId = window_ref.pipeline();
|
|
||||||
console.global.root().r().as_window().devtools_chan().as_ref().map(|chan| {
|
|
||||||
chan.send(ScriptToDevtoolsControlMsg::SendConsoleMessage(
|
chan.send(ScriptToDevtoolsControlMsg::SendConsoleMessage(
|
||||||
pipelineId, console_message.clone())).unwrap();
|
pipelineId, console_message.clone(), global.r().get_worker_id())).unwrap();
|
||||||
});
|
});
|
||||||
},
|
|
||||||
|
|
||||||
GlobalRef::Worker(_) => {
|
|
||||||
// TODO: support worker console logs
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ use dom::workerglobalscope::WorkerGlobalScopeTypeId;
|
||||||
use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource, ScriptPort};
|
use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource, ScriptPort};
|
||||||
use script_task::StackRootTLS;
|
use script_task::StackRootTLS;
|
||||||
|
|
||||||
use msg::constellation_msg::{ConstellationChan, PipelineId};
|
use msg::constellation_msg::{ConstellationChan, PipelineId, WorkerId};
|
||||||
|
|
||||||
use devtools_traits::{ScriptToDevtoolsControlMsg, DevtoolScriptControlMsg};
|
use devtools_traits::{ScriptToDevtoolsControlMsg, DevtoolScriptControlMsg};
|
||||||
|
|
||||||
|
@ -118,12 +118,14 @@ impl DedicatedWorkerGlobalScope {
|
||||||
constellation_chan: ConstellationChan,
|
constellation_chan: ConstellationChan,
|
||||||
parent_sender: Box<ScriptChan+Send>,
|
parent_sender: Box<ScriptChan+Send>,
|
||||||
own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>,
|
own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>,
|
||||||
receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>)
|
receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>,
|
||||||
|
worker_id: Option<WorkerId>)
|
||||||
-> DedicatedWorkerGlobalScope {
|
-> DedicatedWorkerGlobalScope {
|
||||||
DedicatedWorkerGlobalScope {
|
DedicatedWorkerGlobalScope {
|
||||||
workerglobalscope: WorkerGlobalScope::new_inherited(
|
workerglobalscope: WorkerGlobalScope::new_inherited(
|
||||||
WorkerGlobalScopeTypeId::DedicatedGlobalScope, worker_url, runtime, resource_task,
|
WorkerGlobalScopeTypeId::DedicatedGlobalScope, worker_url, runtime, resource_task,
|
||||||
mem_profiler_chan, devtools_chan, devtools_sender, devtools_port, constellation_chan),
|
mem_profiler_chan, devtools_chan, devtools_sender, devtools_port, constellation_chan,
|
||||||
|
worker_id),
|
||||||
id: id,
|
id: id,
|
||||||
receiver: receiver,
|
receiver: receiver,
|
||||||
own_sender: own_sender,
|
own_sender: own_sender,
|
||||||
|
@ -143,11 +145,13 @@ impl DedicatedWorkerGlobalScope {
|
||||||
constellation_chan: ConstellationChan,
|
constellation_chan: ConstellationChan,
|
||||||
parent_sender: Box<ScriptChan+Send>,
|
parent_sender: Box<ScriptChan+Send>,
|
||||||
own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>,
|
own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>,
|
||||||
receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>)
|
receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>,
|
||||||
|
worker_id: Option<WorkerId>)
|
||||||
-> Root<DedicatedWorkerGlobalScope> {
|
-> Root<DedicatedWorkerGlobalScope> {
|
||||||
let scope = box DedicatedWorkerGlobalScope::new_inherited(
|
let scope = box DedicatedWorkerGlobalScope::new_inherited(
|
||||||
worker_url, id, mem_profiler_chan, devtools_chan, devtools_sender, devtools_port,
|
worker_url, id, mem_profiler_chan, devtools_chan, devtools_sender, devtools_port,
|
||||||
runtime.clone(), resource_task, constellation_chan, parent_sender, own_sender, receiver);
|
runtime.clone(), resource_task, constellation_chan, parent_sender, own_sender, receiver,
|
||||||
|
worker_id);
|
||||||
DedicatedWorkerGlobalScopeBinding::Wrap(runtime.cx(), scope)
|
DedicatedWorkerGlobalScopeBinding::Wrap(runtime.cx(), scope)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -165,7 +169,8 @@ impl DedicatedWorkerGlobalScope {
|
||||||
constellation_chan: ConstellationChan,
|
constellation_chan: ConstellationChan,
|
||||||
parent_sender: Box<ScriptChan+Send>,
|
parent_sender: Box<ScriptChan+Send>,
|
||||||
own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>,
|
own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>,
|
||||||
receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>) {
|
receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>,
|
||||||
|
worker_id: Option<WorkerId>) {
|
||||||
let serialized_worker_url = worker_url.serialize();
|
let serialized_worker_url = worker_url.serialize();
|
||||||
spawn_named(format!("WebWorker for {}", serialized_worker_url), move || {
|
spawn_named(format!("WebWorker for {}", serialized_worker_url), move || {
|
||||||
task_state::initialize(SCRIPT | IN_WORKER);
|
task_state::initialize(SCRIPT | IN_WORKER);
|
||||||
|
@ -194,7 +199,8 @@ impl DedicatedWorkerGlobalScope {
|
||||||
|
|
||||||
let global = DedicatedWorkerGlobalScope::new(
|
let global = DedicatedWorkerGlobalScope::new(
|
||||||
url, id, mem_profiler_chan.clone(), devtools_chan, devtools_ipc_chan, devtools_mpsc_port,
|
url, id, mem_profiler_chan.clone(), devtools_chan, devtools_ipc_chan, devtools_mpsc_port,
|
||||||
runtime.clone(), resource_task, constellation_chan, parent_sender, own_sender, receiver);
|
runtime.clone(), resource_task, constellation_chan, parent_sender, own_sender, receiver,
|
||||||
|
worker_id);
|
||||||
// FIXME(njn): workers currently don't have a unique ID suitable for using in reporter
|
// FIXME(njn): workers currently don't have a unique ID suitable for using in reporter
|
||||||
// registration (#6631), so we instead use a random number and cross our fingers.
|
// registration (#6631), so we instead use a random number and cross our fingers.
|
||||||
let scope = WorkerGlobalScopeCast::from_ref(global.r());
|
let scope = WorkerGlobalScopeCast::from_ref(global.r());
|
||||||
|
|
|
@ -76,6 +76,7 @@ impl Worker {
|
||||||
let (sender, receiver) = channel();
|
let (sender, receiver) = channel();
|
||||||
let worker = Worker::new(global, sender.clone());
|
let worker = Worker::new(global, sender.clone());
|
||||||
let worker_ref = Trusted::new(global.get_cx(), worker.r(), global.script_chan());
|
let worker_ref = Trusted::new(global.get_cx(), worker.r(), global.script_chan());
|
||||||
|
let worker_id = global.get_next_worker_id();
|
||||||
|
|
||||||
let (devtools_sender, devtools_receiver) = ipc::channel().unwrap();
|
let (devtools_sender, devtools_receiver) = ipc::channel().unwrap();
|
||||||
let optional_sender = match global.devtools_chan() {
|
let optional_sender = match global.devtools_chan() {
|
||||||
|
@ -86,7 +87,6 @@ impl Worker {
|
||||||
title: title,
|
title: title,
|
||||||
url: worker_url.clone(),
|
url: worker_url.clone(),
|
||||||
};
|
};
|
||||||
let worker_id = global.get_next_worker_id();
|
|
||||||
chan.send(ScriptToDevtoolsControlMsg::NewGlobal((pipeline_id, Some(worker_id)),
|
chan.send(ScriptToDevtoolsControlMsg::NewGlobal((pipeline_id, Some(worker_id)),
|
||||||
devtools_sender.clone(),
|
devtools_sender.clone(),
|
||||||
page_info)).unwrap();
|
page_info)).unwrap();
|
||||||
|
@ -98,7 +98,7 @@ impl Worker {
|
||||||
DedicatedWorkerGlobalScope::run_worker_scope(
|
DedicatedWorkerGlobalScope::run_worker_scope(
|
||||||
worker_url, global.pipeline(), global.mem_profiler_chan(), global.devtools_chan(),
|
worker_url, global.pipeline(), global.mem_profiler_chan(), global.devtools_chan(),
|
||||||
optional_sender, devtools_receiver, worker_ref, resource_task,
|
optional_sender, devtools_receiver, worker_ref, resource_task,
|
||||||
constellation_chan, global.script_chan(), sender, receiver);
|
constellation_chan, global.script_chan(), sender, receiver, Some(worker_id));
|
||||||
|
|
||||||
Ok(worker)
|
Ok(worker)
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,7 @@ pub enum WorkerGlobalScopeTypeId {
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct WorkerGlobalScope {
|
pub struct WorkerGlobalScope {
|
||||||
eventtarget: EventTarget,
|
eventtarget: EventTarget,
|
||||||
|
worker_id: Option<WorkerId>,
|
||||||
worker_url: Url,
|
worker_url: Url,
|
||||||
runtime: Rc<Runtime>,
|
runtime: Rc<Runtime>,
|
||||||
next_worker_id: Cell<WorkerId>,
|
next_worker_id: Cell<WorkerId>,
|
||||||
|
@ -82,11 +83,13 @@ impl WorkerGlobalScope {
|
||||||
devtools_chan: Option<IpcSender<ScriptToDevtoolsControlMsg>>,
|
devtools_chan: Option<IpcSender<ScriptToDevtoolsControlMsg>>,
|
||||||
devtools_sender: Option<IpcSender<DevtoolScriptControlMsg>>,
|
devtools_sender: Option<IpcSender<DevtoolScriptControlMsg>>,
|
||||||
devtools_receiver: Receiver<DevtoolScriptControlMsg>,
|
devtools_receiver: Receiver<DevtoolScriptControlMsg>,
|
||||||
constellation_chan: ConstellationChan)
|
constellation_chan: ConstellationChan,
|
||||||
|
worker_id: Option<WorkerId>)
|
||||||
-> WorkerGlobalScope {
|
-> WorkerGlobalScope {
|
||||||
WorkerGlobalScope {
|
WorkerGlobalScope {
|
||||||
eventtarget: EventTarget::new_inherited(EventTargetTypeId::WorkerGlobalScope(type_id)),
|
eventtarget: EventTarget::new_inherited(EventTargetTypeId::WorkerGlobalScope(type_id)),
|
||||||
next_worker_id: Cell::new(WorkerId(0)),
|
next_worker_id: Cell::new(WorkerId(0)),
|
||||||
|
worker_id: worker_id,
|
||||||
worker_url: worker_url,
|
worker_url: worker_url,
|
||||||
runtime: runtime,
|
runtime: runtime,
|
||||||
resource_task: resource_task,
|
resource_task: resource_task,
|
||||||
|
@ -141,6 +144,10 @@ impl WorkerGlobalScope {
|
||||||
&self.worker_url
|
&self.worker_url
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_worker_id(&self) -> Option<WorkerId> {
|
||||||
|
self.worker_id.clone()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_next_worker_id(&self) -> WorkerId {
|
pub fn get_next_worker_id(&self) -> WorkerId {
|
||||||
let worker_id = self.next_worker_id.get();
|
let worker_id = self.next_worker_id.get();
|
||||||
let WorkerId(id_num) = worker_id;
|
let WorkerId(id_num) = worker_id;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue