blob: 56364895db99104e9f001ff39320393331c240c4 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_INSTRUMENTATION_H_
#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_INSTRUMENTATION_H_
/*
The functions in this file are for routing instrumentation signals
to the relevant set of devtools protocol handlers.
*/
#include <vector>
#include "base/optional.h"
#include "content/common/navigation_params.mojom.h"
#include "content/public/browser/certificate_request_result_type.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "services/network/public/mojom/network_service.mojom.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "services/network/public/mojom/url_response_head.mojom-forward.h"
#include "third_party/blink/public/mojom/devtools/inspector_issue.mojom-forward.h"
class GURL;
namespace base {
class UnguessableToken;
}
namespace blink {
struct UserAgentMetadata;
}
namespace net {
class SSLInfo;
class X509Certificate;
struct QuicTransportError;
} // namespace net
namespace download {
struct DownloadCreateInfo;
class DownloadItem;
} // namespace download
namespace content {
class BrowserContext;
class DevToolsAgentHostImpl;
class FrameTreeNode;
class NavigationHandle;
class NavigationRequest;
class NavigationThrottle;
class RenderFrameHostImpl;
class RenderProcessHost;
class SharedWorkerHost;
class SignedExchangeEnvelope;
class WebContents;
struct SignedExchangeError;
namespace protocol {
namespace Audits {
class InspectorIssue;
} // namespace Audits
} // namespace protocol
namespace devtools_instrumentation {
void ApplyNetworkRequestOverrides(FrameTreeNode* frame_tree_node,
mojom::BeginNavigationParams* begin_params,
bool* report_raw_headers);
// Returns true if devtools want |*override_out| to be used.
// (A true return and |*override_out| being nullopt means no user agent client
// hints should be sent; a false return means devtools doesn't want to affect
// the behavior).
bool ApplyUserAgentMetadataOverrides(
FrameTreeNode* frame_tree_node,
base::Optional<blink::UserAgentMetadata>* override_out);
bool WillCreateURLLoaderFactory(
RenderFrameHostImpl* rfh,
bool is_navigation,
bool is_download,
mojo::PendingReceiver<network::mojom::URLLoaderFactory>*
loader_factory_receiver,
network::mojom::URLLoaderFactoryOverridePtr* factory_override);
bool WillCreateURLLoaderFactoryForWorker(
DevToolsAgentHostImpl* host,
const base::UnguessableToken& worker_token,
network::mojom::URLLoaderFactoryOverridePtr* factory_override);
bool WillCreateURLLoaderFactoryForServiceWorker(
RenderProcessHost* rph,
int routing_id,
network::mojom::URLLoaderFactoryOverridePtr* factory_override);
bool WillCreateURLLoaderFactoryForSharedWorker(
SharedWorkerHost* host,
network::mojom::URLLoaderFactoryOverridePtr* factory_override);
bool WillCreateURLLoaderFactory(
RenderFrameHostImpl* rfh,
bool is_navigation,
bool is_download,
std::unique_ptr<network::mojom::URLLoaderFactory>* factory);
void OnResetNavigationRequest(NavigationRequest* navigation_request);
void OnNavigationRequestWillBeSent(const NavigationRequest& navigation_request);
void OnNavigationResponseReceived(
const NavigationRequest& nav_request,
const network::mojom::URLResponseHead& response);
void OnNavigationRequestFailed(
const NavigationRequest& nav_request,
const network::URLLoaderCompletionStatus& status);
void WillBeginDownload(download::DownloadCreateInfo* info,
download::DownloadItem* item);
void OnSignedExchangeReceived(
FrameTreeNode* frame_tree_node,
base::Optional<const base::UnguessableToken> devtools_navigation_token,
const GURL& outer_request_url,
const network::mojom::URLResponseHead& outer_response,
const base::Optional<SignedExchangeEnvelope>& header,
const scoped_refptr<net::X509Certificate>& certificate,
const base::Optional<net::SSLInfo>& ssl_info,
const std::vector<SignedExchangeError>& errors);
void OnSignedExchangeCertificateRequestSent(
FrameTreeNode* frame_tree_node,
const base::UnguessableToken& request_id,
const base::UnguessableToken& loader_id,
const network::ResourceRequest& request,
const GURL& signed_exchange_url);
void OnSignedExchangeCertificateResponseReceived(
FrameTreeNode* frame_tree_node,
const base::UnguessableToken& request_id,
const base::UnguessableToken& loader_id,
const GURL& url,
const network::mojom::URLResponseHead& head);
void OnSignedExchangeCertificateRequestCompleted(
FrameTreeNode* frame_tree_node,
const base::UnguessableToken& request_id,
const network::URLLoaderCompletionStatus& status);
void OnRequestWillBeSentExtraInfo(
int process_id,
int routing_id,
const std::string& devtools_request_id,
const net::CookieAccessResultList& request_cookie_list,
const std::vector<network::mojom::HttpRawHeaderPairPtr>& request_headers,
const network::mojom::ClientSecurityStatePtr security_state);
void OnResponseReceivedExtraInfo(
int process_id,
int routing_id,
const std::string& devtools_request_id,
const net::CookieAndLineAccessResultList& response_cookie_list,
const std::vector<network::mojom::HttpRawHeaderPairPtr>& response_headers,
const base::Optional<std::string>& response_headers_text);
void OnCorsPreflightRequest(int32_t process_id,
int32_t render_frame_id,
const base::UnguessableToken& devtools_request_id,
const network::ResourceRequest& request,
const GURL& signed_exchange_url);
void OnCorsPreflightResponse(int32_t process_id,
int32_t render_frame_id,
const base::UnguessableToken& devtools_request_id,
const GURL& url,
network::mojom::URLResponseHeadPtr head);
void OnCorsPreflightRequestCompleted(
int32_t process_id,
int32_t render_frame_id,
const base::UnguessableToken& devtools_request_id,
const network::URLLoaderCompletionStatus& status);
std::vector<std::unique_ptr<NavigationThrottle>> CreateNavigationThrottles(
NavigationHandle* navigation_handle);
bool ShouldWaitForDebuggerInWindowOpen();
// Asks any interested agents to handle the given certificate error. Returns
// |true| if the error was handled, |false| otherwise.
using CertErrorCallback =
base::RepeatingCallback<void(content::CertificateRequestResultType)>;
bool HandleCertificateError(WebContents* web_contents,
int cert_error,
const GURL& request_url,
CertErrorCallback callback);
void PortalAttached(RenderFrameHostImpl* render_frame_host_impl);
void PortalDetached(RenderFrameHostImpl* render_frame_host_impl);
void PortalActivated(RenderFrameHostImpl* render_frame_host_impl);
void ReportSameSiteCookieIssue(
RenderFrameHostImpl* render_frame_host_impl,
const net::CookieWithAccessResult& excluded_cookie,
const GURL& url,
const net::SiteForCookies& site_for_cookies,
blink::mojom::SameSiteCookieOperation operation,
const base::Optional<std::string>& devtools_request_id);
// This function works similar to RenderFrameHostImpl::AddInspectorIssue, in
// that it reports an InspectorIssue to DevTools clients. The difference is that
// |ReportBrowserInitiatedIssue| sends issues directly to clients instead of
// going through the issue storage in the renderer process. Sending issues
// directly prevents them from being (potentially) lost during navigations.
//
// DevTools must be attached, otherwise issues reported through
// |ReportBrowserInitiatedIssue| are lost.
void CONTENT_EXPORT
ReportBrowserInitiatedIssue(RenderFrameHostImpl* frame,
protocol::Audits::InspectorIssue* issue);
// Produces a Heavy Ad Issue based on the parameters passed in.
std::unique_ptr<protocol::Audits::InspectorIssue> GetHeavyAdIssue(
RenderFrameHostImpl* frame,
blink::mojom::HeavyAdResolutionStatus resolution,
blink::mojom::HeavyAdReason reason);
void OnQuicTransportHandshakeFailed(
RenderFrameHostImpl* frame_host,
const GURL& url,
const base::Optional<net::QuicTransportError>& error);
void ApplyNetworkContextParamsOverrides(
BrowserContext* browser_context,
network::mojom::NetworkContextParams* network_context_params);
} // namespace devtools_instrumentation
} // namespace content
#endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_INSTRUMENTATION_H_