mirror of
https://github.com/servo/servo.git
synced 2025-07-16 03:43:38 +01:00
Send WillNavigate earlier during navigation startup (#37778)
The will-navigate message tells the devtools client to expect a navigation for a browsing context. This makes the network monitor clear any previous entries and show the requests for the new page that is loaded. In order to support this correctly, we need to send the navigation notification from the constellation instead of the script thread, otherwise we silently ignore navigations triggered by the browser URL bar. Testing: Ran servo in devtools mode , now the requests appear for new loaded page Fixes: https://github.com/servo/servo/issues/37334 --------- Signed-off-by: Uthman Yahaya Baba <uthmanyahayababa@gmail.com>
This commit is contained in:
parent
864c877be5
commit
2ad5b24225
13 changed files with 197 additions and 112 deletions
|
@ -45,6 +45,7 @@ use crate::actors::process::ProcessActor;
|
|||
use crate::actors::root::RootActor;
|
||||
use crate::actors::source::SourceActor;
|
||||
use crate::actors::thread::ThreadActor;
|
||||
use crate::actors::watcher::WatcherActor;
|
||||
use crate::actors::worker::{WorkerActor, WorkerType};
|
||||
use crate::id::IdMap;
|
||||
use crate::network_handler::handle_network_event;
|
||||
|
@ -289,11 +290,7 @@ impl DevtoolsInstance {
|
|||
connections.push(stream.try_clone().unwrap());
|
||||
}
|
||||
|
||||
let pipeline_id = match network_event {
|
||||
NetworkEvent::HttpResponse(ref response) => response.pipeline_id,
|
||||
NetworkEvent::HttpRequest(ref request) => request.pipeline_id,
|
||||
};
|
||||
self.handle_network_event(connections, pipeline_id, request_id, network_event);
|
||||
self.handle_network_event(connections, request_id, network_event);
|
||||
},
|
||||
DevtoolsControlMsg::FromChrome(ChromeToDevtoolsControlMsg::ServerExitMsg) => break,
|
||||
}
|
||||
|
@ -313,11 +310,23 @@ impl DevtoolsInstance {
|
|||
|
||||
fn handle_navigate(&self, browsing_context_id: BrowsingContextId, state: NavigationState) {
|
||||
let actor_name = self.browsing_contexts.get(&browsing_context_id).unwrap();
|
||||
self.actors
|
||||
.lock()
|
||||
.unwrap()
|
||||
.find::<BrowsingContextActor>(actor_name)
|
||||
.navigate(state, &mut self.id_map.lock().expect("Mutex poisoned"));
|
||||
let actors = self.actors.lock().unwrap();
|
||||
let actor = actors.find::<BrowsingContextActor>(actor_name);
|
||||
let mut id_map = self.id_map.lock().expect("Mutex poisoned");
|
||||
if let NavigationState::Start(url) = &state {
|
||||
let mut connections = Vec::<TcpStream>::new();
|
||||
for stream in self.connections.values() {
|
||||
connections.push(stream.try_clone().unwrap());
|
||||
}
|
||||
let watcher_actor = actors.find::<WatcherActor>(&actor.watcher);
|
||||
watcher_actor.emit_will_navigate(
|
||||
browsing_context_id,
|
||||
url.clone(),
|
||||
&mut connections,
|
||||
&mut id_map,
|
||||
);
|
||||
};
|
||||
actor.navigate(state, &mut id_map);
|
||||
}
|
||||
|
||||
// We need separate actor representations for each script global that exists;
|
||||
|
@ -479,31 +488,39 @@ impl DevtoolsInstance {
|
|||
fn handle_network_event(
|
||||
&mut self,
|
||||
connections: Vec<TcpStream>,
|
||||
pipeline_id: PipelineId,
|
||||
request_id: String,
|
||||
network_event: NetworkEvent,
|
||||
) {
|
||||
let netevent_actor_name = self.find_network_event_actor(request_id);
|
||||
let browsing_context_id = match &network_event {
|
||||
NetworkEvent::HttpRequest(req) => req.browsing_context_id,
|
||||
NetworkEvent::HttpResponse(resp) => resp.browsing_context_id,
|
||||
};
|
||||
|
||||
let Some(id) = self.pipelines.get(&pipeline_id) else {
|
||||
return;
|
||||
};
|
||||
let Some(browsing_context_actor_name) = self.browsing_contexts.get(id) else {
|
||||
let Some(browsing_context_actor_name) = self.browsing_contexts.get(&browsing_context_id)
|
||||
else {
|
||||
return;
|
||||
};
|
||||
let watcher_name = self
|
||||
.actors
|
||||
.lock()
|
||||
.unwrap()
|
||||
.find::<BrowsingContextActor>(browsing_context_actor_name)
|
||||
.watcher
|
||||
.clone();
|
||||
|
||||
let netevent_actor_name = self.find_network_event_actor(request_id, watcher_name);
|
||||
|
||||
handle_network_event(
|
||||
Arc::clone(&self.actors),
|
||||
netevent_actor_name,
|
||||
connections,
|
||||
network_event,
|
||||
browsing_context_actor_name.to_string(),
|
||||
)
|
||||
}
|
||||
|
||||
// Find the name of NetworkEventActor corresponding to request_id
|
||||
// Create a new one if it does not exist, add it to the actor_requests hashmap
|
||||
fn find_network_event_actor(&mut self, request_id: String) -> String {
|
||||
fn find_network_event_actor(&mut self, request_id: String, watcher_name: String) -> String {
|
||||
let mut actors = self.actors.lock().unwrap();
|
||||
match self.actor_requests.entry(request_id) {
|
||||
Occupied(name) => {
|
||||
|
@ -514,7 +531,7 @@ impl DevtoolsInstance {
|
|||
let resource_id = self.next_resource_id;
|
||||
self.next_resource_id += 1;
|
||||
let actor_name = actors.new_name("netevent");
|
||||
let actor = NetworkEventActor::new(actor_name.clone(), resource_id);
|
||||
let actor = NetworkEventActor::new(actor_name.clone(), resource_id, watcher_name);
|
||||
entry.insert(actor_name.clone());
|
||||
actors.register(Box::new(actor));
|
||||
actor_name
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue