devtools: Use request destination as cause_type in NetworkEventActor (#38162)

The cause_type in NetworkEventActor was derived from a hard-coded
pattern match on the request URL file extension.

This patch replaces the hard-coded pattern matching with the Destination
field of Request, to provide a better alignment with the Fetch
specification.

Testing: Updated unit tests.
Fixes: #38151

---------

Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>
This commit is contained in:
Kingsley Yung 2025-07-19 06:20:26 +08:00 committed by GitHub
parent a52f9fd9a9
commit 0537c29064
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 15 additions and 9 deletions

View file

@ -11,6 +11,7 @@ use chrono::{Local, LocalResult, TimeZone};
use devtools_traits::{HttpRequest as DevtoolsHttpRequest, HttpResponse as DevtoolsHttpResponse};
use headers::{ContentType, Cookie, HeaderMapExt};
use http::{HeaderMap, Method, header};
use net_traits::request::Destination as RequestDestination;
use serde::Serialize;
use serde_json::{Map, Value};
@ -27,6 +28,7 @@ pub struct NetworkEventActor {
pub request_method: Method,
pub request_started: SystemTime,
pub request_time_stamp: i64,
pub request_destination: RequestDestination,
pub request_headers_raw: Option<HeaderMap>,
pub request_body: Option<Vec<u8>>,
pub request_cookies: Option<RequestCookiesMsg>,
@ -350,6 +352,7 @@ impl NetworkEventActor {
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_secs() as i64,
request_destination: RequestDestination::None,
request_headers_raw: None,
request_body: None,
request_cookies: None,
@ -377,6 +380,7 @@ impl NetworkEventActor {
self.request_method = request.method;
self.request_started = request.started_date_time;
self.request_time_stamp = request.time_stamp;
self.request_destination = request.destination;
self.request_body = request.body.clone();
self.request_headers_raw = Some(request.headers.clone());
}
@ -404,14 +408,6 @@ impl NetworkEventActor {
LocalResult::Ambiguous(date_time, _) => date_time.to_rfc3339().to_string(),
};
let cause_type = match self.request_url.as_str() {
// Adjust based on request data
url if url.ends_with(".css") => "stylesheet",
url if url.ends_with(".js") => "script",
url if url.ends_with(".png") || url.ends_with(".jpg") => "img",
_ => "document",
};
EventActor {
actor: self.name(),
resource_id: self.resource_id,
@ -422,7 +418,7 @@ impl NetworkEventActor {
is_xhr: self.is_xhr,
private: false,
cause: Cause {
type_: cause_type.to_string(),
type_: self.request_destination.as_str().to_string(),
loading_document_uri: None, // Set if available
},
}

View file

@ -397,6 +397,7 @@ fn prepare_devtools_request(
pipeline_id: PipelineId,
connect_time: Duration,
send_time: Duration,
destination: Destination,
is_xhr: bool,
browsing_context_id: BrowsingContextId,
) -> ChromeToDevtoolsControlMsg {
@ -414,6 +415,7 @@ fn prepare_devtools_request(
.as_secs() as i64,
connect_time,
send_time,
destination,
is_xhr,
browsing_context_id,
};
@ -488,6 +490,7 @@ pub fn send_early_httprequest_to_devtools(request: &mut Request, context: &Fetch
time_stamp: 0,
connect_time: Duration::from_millis(0),
send_time: Duration::from_millis(0),
destination: request.destination,
is_xhr: false,
browsing_context_id,
};
@ -586,6 +589,7 @@ async fn obtain_response(
source_is_null: bool,
pipeline_id: &Option<PipelineId>,
request_id: Option<&str>,
destination: Destination,
is_xhr: bool,
context: &FetchContext,
fetch_terminated: UnboundedSender<bool>,
@ -780,6 +784,7 @@ async fn obtain_response(
pipeline_id,
(connect_end - connect_start).unsigned_abs(),
(send_end - send_start).unsigned_abs(),
destination,
is_xhr,
browsing_context_id,
))
@ -1959,6 +1964,7 @@ async fn http_network_fetch(
.unwrap_or(false),
&request.pipeline_id,
Some(&request_id),
request.destination,
is_xhr,
context,
fetch_terminated_sender,

View file

@ -1339,6 +1339,7 @@ fn test_fetch_with_devtools() {
time_stamp: devhttprequests.1.time_stamp,
connect_time: devhttprequests.1.connect_time,
send_time: devhttprequests.1.send_time,
destination: Destination::None,
is_xhr: true,
browsing_context_id: TEST_WEBVIEW_ID.0,
};

View file

@ -333,6 +333,7 @@ fn test_request_and_response_data_with_network_messages() {
time_stamp: devhttprequests.1.time_stamp,
connect_time: devhttprequests.1.connect_time,
send_time: devhttprequests.1.send_time,
destination: Destination::Document,
is_xhr: false,
browsing_context_id: TEST_WEBVIEW_ID.0,
};

View file

@ -23,6 +23,7 @@ use http::{HeaderMap, Method};
use ipc_channel::ipc::IpcSender;
use malloc_size_of_derive::MallocSizeOf;
use net_traits::http_status::HttpStatus;
use net_traits::request::Destination;
use serde::{Deserialize, Serialize};
use servo_url::ServoUrl;
use uuid::Uuid;
@ -443,6 +444,7 @@ pub struct HttpRequest {
pub time_stamp: i64,
pub connect_time: Duration,
pub send_time: Duration,
pub destination: Destination,
pub is_xhr: bool,
pub browsing_context_id: BrowsingContextId,
}