blob: 124626821c2a664c99c1cef7b84c3cffdcad2b11 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_NAVIGATION_BODY_LOADER_H_
#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_NAVIGATION_BODY_LOADER_H_
#include <optional>
#include <variant>
#include "base/containers/span.h"
#include "base/containers/span_or_size.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "services/network/public/mojom/url_loader.mojom-forward.h"
#include "services/network/public/mojom/url_response_head.mojom-forward.h"
#include "third_party/blink/public/mojom/navigation/navigation_params.mojom-forward.h"
#include "third_party/blink/public/platform/web_common.h"
#include "third_party/blink/public/platform/web_loader_freeze_mode.h"
#include "third_party/blink/public/platform/web_url_error.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
namespace blink {
class ResourceLoadInfoNotifierWrapper;
struct WebEncodingData;
struct WebNavigationParams;
// This class is used to load the body of main resource during navigation.
// It is provided by the client which commits a navigation.
// See WebNavigationParams for more details.
class BLINK_EXPORT WebNavigationBodyLoader {
public:
class Client {
public:
virtual ~Client() {}
// Notifies about more data available. Called multiple times.
// If main resource is empty, can be not called at all. This will not be
// called if DecodedBodyDataReceived() has been called.
virtual void BodyDataReceived(base::span<const char> data) = 0;
// Called with decoded data. This will be called instead of
// BodyDataReceived() if the data is able to be decoded off thread.
// |encoded_data| will contain the original data if
// |should_keep_encoded_data| was passed to StartLoadingBodyInBackground().
virtual void DecodedBodyDataReceived(
const WebString& data,
const WebEncodingData& encoding_data,
base::SpanOrSize<const char> encoded_data) {
NOTREACHED_IN_MIGRATION();
}
// Called once at the end. If something went wrong, |error| will be set.
// No more calls are issued after this one.
virtual void BodyLoadingFinished(
base::TimeTicks completion_time,
int64_t total_encoded_data_length,
int64_t total_encoded_body_length,
int64_t total_decoded_body_length,
const std::optional<WebURLError>& error) = 0;
// The client can return a ProcessBackgroundDataCallback which will be
// called on a background thread with the decoded data. The returned
// callback will be called on a background thread with the same decoded data
// which will be given to DecodedBodyDataReceived().
using ProcessBackgroundDataCallback =
WTF::CrossThreadRepeatingFunction<void(const WebString&)>;
virtual ProcessBackgroundDataCallback TakeProcessBackgroundDataCallback() {
return ProcessBackgroundDataCallback();
}
};
// This method fills navigation params related to the navigation request,
// redirects and response, and also creates a body loader if needed.
static void FillNavigationParamsResponseAndBodyLoader(
mojom::CommonNavigationParamsPtr common_params,
mojom::CommitNavigationParamsPtr commit_params,
int request_id,
network::mojom::URLResponseHeadPtr response_head,
mojo::ScopedDataPipeConsumerHandle response_body,
network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
std::unique_ptr<ResourceLoadInfoNotifierWrapper>
resource_load_info_notifier_wrapper,
bool is_main_frame,
WebNavigationParams* navigation_params,
bool is_ad_frame);
// It should be safe to destroy WebNavigationBodyLoader at any moment,
// including from inside any client notification.
virtual ~WebNavigationBodyLoader() {}
// While frozen, data will be read on the renderer side but will not invoke
// any web-exposed behavior such as dispatching messages or handling
// redirects. This method can be called multiple times at any moment.
virtual void SetDefersLoading(WebLoaderFreezeMode mode) = 0;
// Starts loading the body. Client must be non-null, and will receive the
// body, and final result.
virtual void StartLoadingBody(Client*) = 0;
enum class BodyLoaderType {
kStatic,
kNetwork,
};
virtual BodyLoaderType GetType() const = 0;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_NAVIGATION_BODY_LOADER_H_