Implement WebResourceRequested Event. (#34961)

* Implement WebResourceRequested Event on the Embedder Layer

Signed-off-by: zhuhaichao518 <zhuhaichao518@gmail.com>

* fix and add test

Signed-off-by: zhuhaichao518 <zhuhaichao518@gmail.com>

* resolve comments

Signed-off-by: zhuhaichao518 <zhuhaichao518@gmail.com>

* remove sample code in webview

Signed-off-by: zhuhaichao518 <zhuhaichao518@gmail.com>

* remove typo

Signed-off-by: zhuhaichao518 <zhuhaichao518@gmail.com>

* ./mach format

Signed-off-by: zhuhaichao518 <zhuhaichao518@gmail.com>

* fix test fail caused by interception message

Signed-off-by: zhuhaichao518 <zhuhaichao518@gmail.com>

* update impl for is_for_main_frame

Signed-off-by: zhuhaichao518 <zhuhaichao518@gmail.com>

---------

Signed-off-by: zhuhaichao518 <zhuhaichao518@gmail.com>
This commit is contained in:
zhuhaichao518 2025-01-16 15:44:16 +08:00 committed by GitHub
parent 7256590599
commit a1326a7cf6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 364 additions and 9 deletions

View file

@ -8,9 +8,11 @@ use std::fmt::{Debug, Error, Formatter};
use base::id::{PipelineId, TopLevelBrowsingContextId, WebViewId};
use crossbeam_channel::{Receiver, Sender};
use http::{HeaderMap, Method, StatusCode};
use ipc_channel::ipc::IpcSender;
use keyboard_types::KeyboardEvent;
use log::warn;
use malloc_size_of_derive::MallocSizeOf;
use num_derive::FromPrimitive;
use serde::{Deserialize, Serialize};
use servo_url::ServoUrl;
@ -212,6 +214,7 @@ pub enum EmbedderMsg {
LoadStart,
/// The load of a page has completed
LoadComplete,
WebResourceRequested(WebResourceRequest, IpcSender<WebResourceResponseMsg>),
/// A pipeline panicked. First string is the reason, second one is the backtrace.
Panic(String, Option<String>),
/// Open dialog to select bluetooth device.
@ -282,6 +285,7 @@ impl Debug for EmbedderMsg {
EmbedderMsg::SetFullscreenState(..) => write!(f, "SetFullscreenState"),
EmbedderMsg::LoadStart => write!(f, "LoadStart"),
EmbedderMsg::LoadComplete => write!(f, "LoadComplete"),
EmbedderMsg::WebResourceRequested(..) => write!(f, "WebResourceRequested"),
EmbedderMsg::Panic(..) => write!(f, "Panic"),
EmbedderMsg::GetSelectedBluetoothDevice(..) => write!(f, "GetSelectedBluetoothDevice"),
EmbedderMsg::SelectFiles(..) => write!(f, "SelectFiles"),
@ -437,3 +441,101 @@ pub struct DualRumbleEffectParams {
pub enum GamepadHapticEffectType {
DualRumble(DualRumbleEffectParams),
}
#[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)]
pub struct WebResourceRequest {
#[serde(
deserialize_with = "::hyper_serde::deserialize",
serialize_with = "::hyper_serde::serialize"
)]
#[ignore_malloc_size_of = "Defined in hyper"]
pub method: Method,
#[serde(
deserialize_with = "::hyper_serde::deserialize",
serialize_with = "::hyper_serde::serialize"
)]
#[ignore_malloc_size_of = "Defined in hyper"]
pub headers: HeaderMap,
pub url: ServoUrl,
pub is_for_main_frame: bool,
pub is_redirect: bool,
}
impl WebResourceRequest {
pub fn new(
method: Method,
headers: HeaderMap,
url: ServoUrl,
is_for_main_frame: bool,
is_redirect: bool,
) -> Self {
WebResourceRequest {
method,
url,
headers,
is_for_main_frame,
is_redirect,
}
}
}
#[derive(Clone, Deserialize, Serialize)]
pub enum WebResourceResponseMsg {
// Response of WebResourceRequest, no body included.
Start(WebResourceResponse),
// send a body chunk. It is expected Response sent before body.
Body(HttpBodyData),
// not to override the response.
None,
}
#[derive(Clone, Deserialize, Serialize)]
pub enum HttpBodyData {
Chunk(Vec<u8>),
Done,
Cancelled,
}
#[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)]
pub struct WebResourceResponse {
pub url: ServoUrl,
#[serde(
deserialize_with = "::hyper_serde::deserialize",
serialize_with = "::hyper_serde::serialize"
)]
#[ignore_malloc_size_of = "Defined in hyper"]
pub headers: HeaderMap,
#[serde(
deserialize_with = "::hyper_serde::deserialize",
serialize_with = "::hyper_serde::serialize"
)]
#[ignore_malloc_size_of = "Defined in hyper"]
pub status_code: StatusCode,
pub status_message: Vec<u8>,
}
impl WebResourceResponse {
pub fn new(url: ServoUrl) -> WebResourceResponse {
WebResourceResponse {
url,
headers: HeaderMap::new(),
status_code: StatusCode::OK,
status_message: b"OK".to_vec(),
}
}
pub fn headers(mut self, headers: HeaderMap) -> WebResourceResponse {
self.headers = headers;
self
}
pub fn status_code(mut self, status_code: StatusCode) -> WebResourceResponse {
self.status_code = status_code;
self
}
pub fn status_message(mut self, status_message: Vec<u8>) -> WebResourceResponse {
self.status_message = status_message;
self
}
}