// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_LOADER_KEEP_ALIVE_URL_LOADER_H_ #define CONTENT_BROWSER_LOADER_KEEP_ALIVE_URL_LOADER_H_ #include <stdint.h> #include <memory> #include <queue> #include <string> #include <string_view> #include <vector> #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/memory/weak_ptr.h" #include "base/timer/timer.h" #include "base/types/pass_key.h" #include "content/common/content_export.h" #include "content/public/browser/weak_document_ptr.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" #include "services/network/public/mojom/url_loader.mojom.h" #include "services/network/public/mojom/url_response_head.mojom.h" #include "third_party/blink/public/common/loader/throttling_url_loader.h" #include "third_party/blink/public/mojom/loader/fetch_later.mojom.h" #include "url/gurl.h" namespace network { class SharedURLLoaderFactory; } namespace blink { class URLLoaderThrottle; } namespace content { class BrowserContext; class KeepAliveAttributionRequestHelper; class KeepAliveURLBrowserTestBase; class KeepAliveURLLoaderService; class PolicyContainerHost; class RenderFrameHostImpl; class WeakDocumentPtr; // A URLLoader for loading a fetch keepalive request via the browser process, // including requests generated from the following JS API calls: // - fetch(..., {keepalive: true}) // - navigator.sendBeacon(...) // - fetchLater(...) // // To load a keepalive request initiated by a renderer, this loader performs the // following logic: // // 1. In ctor, stores request data sent from a renderer. // 2. In `Start()`, asks the network service to start loading the request, and // then runs throttles to perform checks. // 3. Handles request loading results from the network service, i.e. from the // remote of `url_loader_` (blink::ThrottlingURLLoader): // A. If it is `OnReceiveRedirect()`, this loader performs checks and runs // throttles, and then asks the network service to proceed with redirects // without interacting with renderer. The redirect params are stored for // later use. // B. If it is `OnReceiveResponse()` or `OnComplete()`, this loader does not // process response. Instead, it calls `ForwardURLLoad()` to begin to // forward previously saved mojom::URLLoaderClient calls to the renderer, // if the renderer is still alive; Otherwise, terminating this loader. // C. If a throttle asynchronously asks to cancel the request, similar to B, // the previously stored calls will be forwarded to the renderer. // D. The renderer's response to `ForwardURLLoad()` may be any of // mojom::URLLoader calls, in which they should continue forwarding by // calling `ForwardURLLoader()` again. // // See the "Longer Redirect Chain" section of the Design Doc for an example // call sequence diagram. // // This class must only be constructed by `KeepAliveURLLoaderService`. // // The lifetime of an instance is roughly equal to the lifetime of a keepalive // request, which may surpass the initiator renderer's lifetime. // // * Design Doc: // https://docs.google.com/document/d/1ZzxMMBvpqn8VZBZKnb7Go8TWjnrGcXuLS_USwVVRUvY // * Mojo Connections: // https://docs.google.com/document/d/1RKPgoLBrrLZBPn01XtwHJiLlH9rA7nIRXQJIR7BUqJA/edit#heading=h.y1og20bzkuf7 class CONTENT_EXPORT KeepAliveURLLoader : public network::mojom::URLLoader, public blink::ThrottlingURLLoader::ClientReceiverDelegate, public blink::mojom::FetchLaterLoader { … }; } // namespace content #endif // CONTENT_BROWSER_LOADER_KEEP_ALIVE_URL_LOADER_H_