mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
net: Use RequestId
to cancel fetches instead of creating an IPC channel (#34883)
Instead of creating an IPC channel for every fetch, allow cancelling fetches based on the `RequestId` of the original request. This requires that `RequestId`s be UUIDs so that they are unique between processes that might communicating with the resource process. In addition, the resource process loop now keeps a `HashMap` or `Weak` handles to cancellers and cleans them up. This allows for creating mutiple `FetchCanceller`s in `script` for a single fetch request, allowing integration of the media and video elements to integrate with the `Document` canceller list -- meaning these fetches also get cancelled when the `Document` unloads. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
e2be55b873
commit
748954d610
23 changed files with 179 additions and 226 deletions
|
@ -898,15 +898,12 @@ impl HTMLMediaElement {
|
|||
if let Some(ref mut current_fetch_context) = *current_fetch_context {
|
||||
current_fetch_context.cancel(CancelReason::Overridden);
|
||||
}
|
||||
let (fetch_context, cancel_receiver) = HTMLMediaElementFetchContext::new();
|
||||
*current_fetch_context = Some(fetch_context);
|
||||
|
||||
*current_fetch_context = Some(HTMLMediaElementFetchContext::new(request.id));
|
||||
let listener =
|
||||
HTMLMediaElementFetchListener::new(self, url.clone(), offset.unwrap_or(0), seek_lock);
|
||||
|
||||
// TODO: If this is supposed to to be a "fetch" as defined in the specification
|
||||
// this should probably be integrated into the Document's list of cancellable fetches.
|
||||
self.owner_document()
|
||||
.fetch_background(request, listener, Some(cancel_receiver));
|
||||
self.owner_document().fetch_background(request, listener);
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#concept-media-load-resource
|
||||
|
@ -2598,17 +2595,12 @@ pub(crate) struct HTMLMediaElementFetchContext {
|
|||
}
|
||||
|
||||
impl HTMLMediaElementFetchContext {
|
||||
fn new() -> (HTMLMediaElementFetchContext, ipc::IpcReceiver<()>) {
|
||||
let mut fetch_canceller = FetchCanceller::new();
|
||||
let cancel_receiver = fetch_canceller.initialize();
|
||||
(
|
||||
HTMLMediaElementFetchContext {
|
||||
cancel_reason: None,
|
||||
is_seekable: false,
|
||||
fetch_canceller,
|
||||
},
|
||||
cancel_receiver,
|
||||
)
|
||||
fn new(request_id: RequestId) -> HTMLMediaElementFetchContext {
|
||||
HTMLMediaElementFetchContext {
|
||||
cancel_reason: None,
|
||||
is_seekable: false,
|
||||
fetch_canceller: FetchCanceller::new(request_id),
|
||||
}
|
||||
}
|
||||
|
||||
fn is_seekable(&self) -> bool {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue