blob: 42c94f71f09cf9067bac9fd9004dda36708ec441 [file] [log] [blame] [edit]
// Copyright 2012 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_PUBLIC_RENDERER_CONTENT_RENDERER_CLIENT_H_
#define CONTENT_PUBLIC_RENDERER_CONTENT_RENDERER_CLIENT_H_
#include <stddef.h>
#include <map>
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include <vector>
#include "base/files/file_path.h"
#include "base/functional/callback_forward.h"
#include "base/memory/ref_counted.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/thread_pool/thread_pool_instance.h"
#include "build/build_config.h"
#include "build/chromecast_buildflags.h"
#include "content/common/content_export.h"
#include "content/public/common/alternative_error_page_override_info.mojom.h"
#include "content/public/common/content_client.h"
#include "media/base/audio_parameters.h"
#include "media/base/key_system_info.h"
#include "media/base/key_systems_support_registration.h"
#include "media/base/supported_types.h"
#include "third_party/blink/public/common/tokens/tokens.h"
#include "third_party/blink/public/platform/url_loader_throttle_provider.h"
#include "third_party/blink/public/platform/web_content_settings_client.h"
#include "third_party/blink/public/platform/websocket_handshake_throttle_provider.h"
#include "third_party/blink/public/web/web_link_preview_triggerer.h"
#include "third_party/blink/public/web/web_navigation_policy.h"
#include "third_party/blink/public/web/web_navigation_type.h"
#include "ui/base/page_transition_types.h"
#include "v8/include/v8-forward.h"
#if !BUILDFLAG(IS_ANDROID)
#include "media/base/speech_recognition_client.h"
#endif
class GURL;
class SkBitmap;
namespace base {
class FilePath;
class SingleThreadTaskRunner;
}
namespace blink {
class WebElement;
class WebFrame;
class WebLocalFrame;
class WebPlugin;
class WebPrescientNetworking;
class WebServiceWorkerContextProxy;
class WebURL;
class WebURLRequest;
class WebView;
struct WebContentSecurityPolicyHeader;
struct WebPluginParams;
struct WebURLError;
enum class ProtocolHandlerSecurityLevel;
} // namespace blink
#if BUILDFLAG(ENABLE_CAST_RECEIVER)
namespace cast_streaming {
class ResourceProvider;
} // namespace cast_streaming
#endif
namespace media {
class DecoderFactory;
class Demuxer;
class ExternalMemoryAllocator;
class GpuVideoAcceleratorFactories;
class MediaLog;
class RendererFactory;
}
namespace mojo {
class BinderMap;
}
namespace url {
class Origin;
}
namespace content {
class RenderFrame;
// Embedder API for participating in renderer logic.
class CONTENT_EXPORT ContentRendererClient {
public:
virtual ~ContentRendererClient() {}
// Notifies us that the RenderThread has been created.
virtual void RenderThreadStarted() {}
// Allows the embedder to make Mojo interfaces available to the browser
// process. Binders can be added to |*binders| to service incoming interface
// binding requests from RenderProcessHost::BindReceiver().
virtual void ExposeInterfacesToBrowser(mojo::BinderMap* binders) {}
// Sets up trap handling for WebAssembly. Default implementation assumes that
// a crash handler (such as crashpad) is already in use.
virtual void SetUpWebAssemblyTrapHandler();
// Notifies that a new RenderFrame has been created.
virtual void RenderFrameCreated(RenderFrame* render_frame) {}
// Notifies that a new WebView has been created.
// `outermost_origin` is only set if it is an extension scheme, otherwise
// it will be null. It is null to avoid leaking unnecessary information into
// the renderer.
virtual void WebViewCreated(blink::WebView* web_view,
bool was_created_by_renderer,
const url::Origin* outermost_origin) {}
// Returns the bitmap to show when a plugin crashed, or NULL for none.
virtual SkBitmap* GetSadPluginBitmap();
// Returns the bitmap to show when a <webview> guest has crashed, or NULL for
// none.
virtual SkBitmap* GetSadWebViewBitmap();
// Returns true if the embedder renders the contents of the |plugin_element|,
// using external handlers, in a cross-process frame.
virtual bool IsPluginHandledExternally(
RenderFrame* embedder_frame,
const blink::WebElement& plugin_element,
const GURL& original_url,
const std::string& original_mime_type);
// Specifies whether to disable DOM storage interfaces such as localStorage
// and sessionStorage.
virtual bool IsDomStorageDisabled() const;
// Returns a scriptable object which implements custom javascript API for the
// given element. This is used for external plugin handlers for providing
// custom API such as|postMessage| for <embed> and <object>.
virtual v8::Local<v8::Object> GetScriptableObject(
const blink::WebElement& plugin_element,
v8::Isolate* isolate);
// Allows the embedder to override creating a plugin. If it returns true,
// then |plugin| will contain the created plugin, although it could be
// NULL. If it returns false, the content layer will create the plugin.
virtual bool OverrideCreatePlugin(RenderFrame* render_frame,
const blink::WebPluginParams& params,
blink::WebPlugin** plugin);
// Creates a replacement plugin that is shown when the plugin at |file_path|
// couldn't be loaded. This allows the embedder to show a custom placeholder.
// This may return nullptr. However, if it does return a WebPlugin, it must
// never fail to initialize.
virtual blink::WebPlugin* CreatePluginReplacement(
RenderFrame* render_frame,
const base::FilePath& plugin_path);
// Returns the information to display when a navigation error occurs.
// |error_html| should be set to null if this is a custom error page that will
// set its own html content, otherwise if |error_html| is not null then it may
// be set to a HTML page containing the details of the error and maybe links
// to more info. Note that |error_html| may be not written to in certain cases
// (lack of information on the error code) so the caller should take care to
// initialize it with a safe default before the call. |info| contains PWA
// information used to customise error page, and is set to null if
// the webpage that goes offline is not within the scope of a PWA.
virtual void PrepareErrorPage(
content::RenderFrame* render_frame,
const blink::WebURLError& error,
const std::string& http_method,
mojom::AlternativeErrorPageOverrideInfoPtr alternative_error_page_info,
std::string* error_html) {}
virtual void PrepareErrorPageForHttpStatusError(
content::RenderFrame* render_frame,
const blink::WebURLError& error,
const std::string& http_method,
int http_status,
mojom::AlternativeErrorPageOverrideInfoPtr alternative_error_page_info,
std::string* error_html);
// Allows the embedder to control when media resources are loaded. Embedders
// can run |closure| immediately if they don't wish to defer media resource
// loading. If |has_played_media_before| is true, the render frame has
// previously started media playback (i.e. played audio and video).
// Returns true if running of |closure| is deferred; false if run immediately.
virtual bool DeferMediaLoad(RenderFrame* render_frame,
bool has_played_media_before,
base::OnceClosure closure);
// Allows the embedder to override the Demuxer used for certain URLs.
// If a non-null value is returned, the object will be used as the source of
// media data by the media player instance for which this method was called.
virtual std::unique_ptr<media::Demuxer> OverrideDemuxerForUrl(
RenderFrame* render_frame,
const GURL& url,
scoped_refptr<base::SequencedTaskRunner> task_runner);
// Allows the embedder to provide a WebSocketHandshakeThrottleProvider. If it
// returns NULL then none will be used.
virtual std::unique_ptr<blink::WebSocketHandshakeThrottleProvider>
CreateWebSocketHandshakeThrottleProvider();
// Allows the embedder to control whether the renderer should leverage the
// compiled code cache with hashing for a given `request_url`.
virtual bool ShouldUseCodeCacheWithHashing(
const blink::WebURL& request_url) const;
// Called immediately after the sandbox is initialized on the main thread.
// (If the renderer is run with --no-sandbox, it is still called in
// RendererMain at about the same time.)
virtual void PostSandboxInitialized() {}
// Called on the main-thread immediately after the io thread is
// created.
virtual void PostIOThreadCreated(
base::SingleThreadTaskRunner* io_thread_task_runner);
// Called on the main-thread immediately after the compositor thread is
// created.
virtual void PostCompositorThreadCreated(
base::SingleThreadTaskRunner* compositor_thread_task_runner);
// Returns true if the renderer process should schedule the idle handler when
// all widgets are hidden.
virtual bool RunIdleHandlerWhenWidgetsHidden();
// Returns true if a popup window should be allowed.
virtual bool AllowPopup();
// Service worker may react on the activity. For example, reset the idle
// timer.
virtual bool ShouldNotifyServiceWorkerOnWebSocketActivity(
v8::Local<v8::Context> context);
// Returns the security level to use for Navigator.RegisterProtocolHandler().
virtual blink::ProtocolHandlerSecurityLevel GetProtocolHandlerSecurityLevel(
const url::Origin& origin);
#if BUILDFLAG(IS_ANDROID)
// TODO(sgurun) This callback is deprecated and will be removed as soon
// as android webview completes implementation of a resource throttle based
// shouldoverrideurl implementation. See crbug.com/325351
//
// Returns true if the navigation was handled by the embedder and should be
// ignored by WebKit. This method is used by CEF and android_webview.
virtual bool HandleNavigation(RenderFrame* render_frame,
blink::WebFrame* frame,
const blink::WebURLRequest& request,
blink::WebNavigationType type,
blink::WebNavigationPolicy default_policy,
bool is_redirect);
#endif
// Notifies the embedder that the given frame is requesting the resource at
// `target_url`. If the function returns a valid `new_url`, the request must
// be updated to use it.
//
// `upstream_url`: URL of the frame that initiated the request.
// `target_url`: URL being requested by `upstream_url`.
// `site_for_cookies`: Approximately the URL of the request of the main
// frame. It is empty in the case of cross-site iframes.
virtual void WillSendRequest(blink::WebLocalFrame* frame,
ui::PageTransition transition_type,
const blink::WebURL& upstream_url,
const blink::WebURL& target_url,
const net::SiteForCookies& site_for_cookies,
const url::Origin* initiator_origin,
GURL* new_url);
// Returns true if the render frame is used for NoStatePrefetch and will not
// be rendered.
virtual bool IsPrefetchOnly(RenderFrame* render_frame);
// See blink::Platform.
virtual uint64_t VisitedLinkHash(std::string_view canonical_url);
virtual uint64_t PartitionedVisitedLinkFingerprint(
std::string_view canonical_link_url,
const net::SchemefulSite& top_level_site,
const url::Origin& frame_origin);
virtual bool IsLinkVisited(uint64_t link_hash);
virtual void AddOrUpdateVisitedLinkSalt(const url::Origin& origin,
uint64_t salt);
// Creates a WebPrescientNetworking instance for |render_frame|. The returned
// instance is owned by the frame. May return null.
virtual std::unique_ptr<blink::WebPrescientNetworking>
CreatePrescientNetworking(RenderFrame* render_frame);
// Returns true if the given Pepper plugin is external (requiring special
// startup steps).
virtual bool IsExternalPepperPlugin(const std::string& module_name);
// Returns true if the given Pepper plugin should process content from
// different origins in different PPAPI processes. This is generally a
// worthwhile precaution when the plugin provides an active scripting
// language.
virtual bool IsOriginIsolatedPepperPlugin(const base::FilePath& plugin_path);
// Allows embedder to register the key system(s) it supports.
virtual std::unique_ptr<media::KeySystemSupportRegistration>
GetSupportedKeySystems(RenderFrame* render_frame,
media::GetSupportedKeySystemsCB cb);
// Allows embedder to describe customized audio decoder capabilities.
virtual bool IsDecoderSupportedAudioType(const media::AudioType& type);
// Allows embedder to describe customized video decoder capabilities.
virtual bool IsDecoderSupportedVideoType(const media::VideoType& type);
// Allows embedder to describe customized video encoder capabilities.
virtual bool IsEncoderSupportedVideoType(const media::VideoType& type);
// Return true if the bitstream format |codec| is supported by the audio sink.
virtual bool IsSupportedBitstreamAudioCodec(media::AudioCodec codec);
// Returns custom allocator if exists, else nullptr
// Allocator will live as long as ContentRendererClient.
virtual media::ExternalMemoryAllocator* GetMediaAllocator();
// Returns true if we should report a detailed message (including a stack
// trace) for console [logs|errors|exceptions]. |source| is the WebKit-
// reported source for the error; this can point to a page or a script,
// and can be external or internal.
virtual bool ShouldReportDetailedMessageForSource(
const std::u16string& source);
// Creates a permission client for in-renderer worker.
virtual std::unique_ptr<blink::WebContentSettingsClient>
CreateWorkerContentSettingsClient(RenderFrame* render_frame);
#if !BUILDFLAG(IS_ANDROID)
// Creates a speech recognition client used to transcribe audio into captions.
virtual std::unique_ptr<media::SpeechRecognitionClient>
CreateSpeechRecognitionClient(RenderFrame* render_frame);
#endif
// Returns true if the page at |url| can use Pepper CameraDevice APIs.
virtual bool IsPluginAllowedToUseCameraDeviceAPI(const GURL& url);
// Notifies that a document element has been inserted in the frame's document.
// This may be called multiple times for the same document. This method may
// invalidate the frame.
virtual void RunScriptsAtDocumentStart(RenderFrame* render_frame) {}
// Notifies that the DOM is ready in the frame's document.
// This method may invalidate the frame.
virtual void RunScriptsAtDocumentEnd(RenderFrame* render_frame) {}
// Notifies that the window.onload event is about to fire.
// This method may invalidate the frame.
virtual void RunScriptsAtDocumentIdle(RenderFrame* render_frame) {}
// Allows subclasses to enable some runtime features before Blink has
// started.
virtual void SetRuntimeFeaturesDefaultsBeforeBlinkInitialization() {}
// Returns whether or not V8 script extensions should be allowed for a
// service worker.
virtual bool AllowScriptExtensionForServiceWorker(
const url::Origin& script_origin);
// Notifies that a service worker context is going to be initialized. No
// meaningful task has run on the worker thread at this point. This
// function is called from the worker thread.
virtual void WillInitializeServiceWorkerContextOnWorkerThread() {}
// Notifies that a service worker context has been created. This function is
// called from the worker thread.
// |context_proxy| is valid until
// WillDestroyServiceWorkerContextOnWorkerThread() is called.
virtual void DidInitializeServiceWorkerContextOnWorkerThread(
blink::WebServiceWorkerContextProxy* context_proxy,
const GURL& service_worker_scope,
const GURL& script_url) {}
// Notifies that the main script of a service worker is about to evaluate.
// This function is called from the worker thread.
// |context_proxy| is valid until
// WillDestroyServiceWorkerContextOnWorkerThread() is called.
virtual void WillEvaluateServiceWorkerOnWorkerThread(
blink::WebServiceWorkerContextProxy* context_proxy,
v8::Local<v8::Context> v8_context,
int64_t service_worker_version_id,
const GURL& service_worker_scope,
const GURL& script_url,
const blink::ServiceWorkerToken& service_worker_token) {}
// Notifies that a service worker context has finished executing its top-level
// JavaScript. This function is called from the worker thread.
virtual void DidStartServiceWorkerContextOnWorkerThread(
int64_t service_worker_version_id,
const GURL& service_worker_scope,
const GURL& script_url) {}
// Notifies that a service worker context will be destroyed. This function
// is called from the worker thread.
virtual void WillDestroyServiceWorkerContextOnWorkerThread(
v8::Local<v8::Context> context,
int64_t service_worker_version_id,
const GURL& service_worker_scope,
const GURL& script_url) {}
// Whether this renderer should enforce preferences related to the WebRTC
// routing logic, i.e. allowing multiple routes and non-proxied UDP.
virtual bool ShouldEnforceWebRTCRoutingPreferences();
// Notifies that a worker context has been created. This function is called
// from the worker thread.
virtual void DidInitializeWorkerContextOnWorkerThread(
v8::Local<v8::Context> context) {}
// Overwrites the given URL to use an HTML5 embed if possible.
// An empty URL is returned if the URL is not overriden.
virtual GURL OverrideFlashEmbedWithHTML(const GURL& url);
// Whether the renderer allows idle media players to be automatically
// suspended after a period of inactivity.
virtual bool IsIdleMediaSuspendEnabled();
// Allows the embedder to return a (possibly null)
// blink::URLLoaderThrottleProvider for a frame or worker. For frames this is
// called on the main thread, and for workers it's called on the main or
// worker threads depending on http://crbug.com/692909.
virtual std::unique_ptr<blink::URLLoaderThrottleProvider>
CreateURLLoaderThrottleProvider(
blink::URLLoaderThrottleProviderType provider_type);
// Called when Blink cannot find a frame with the given name in the frame's
// browsing instance. This gives the embedder a chance to return a frame
// from outside of the browsing instance.
virtual blink::WebFrame* FindFrame(blink::WebLocalFrame* relative_to_frame,
const std::string& name);
// Returns true only if it's safe to redirect `from_url` to `to_url`.
virtual bool IsSafeRedirectTarget(const GURL& from_url, const GURL& to_url);
// The user agent string is given from the browser process. This is called at
// most once.
virtual void DidSetUserAgent(const std::string& user_agent);
// Optionally returns audio renderer algorithm parameters.
virtual std::optional<::media::AudioRendererAlgorithmParameters>
GetAudioRendererAlgorithmParameters(
::media::AudioParameters audio_parameters);
// Appends to `csp`, the default CSP which should be applied to the given
// `url`. This allows the embedder to customize the applied CSP.
virtual void AppendContentSecurityPolicy(
const blink::WebURL& url,
blink::WebVector<blink::WebContentSecurityPolicyHeader>* csp);
// Returns a RendererFactory to use as the "base" for a
// RendererFactorySelector. Returns `nullptr` to get the default behaviour.
// The arguments will outlive the returned factory.
virtual std::unique_ptr<media::RendererFactory> GetBaseRendererFactory(
content::RenderFrame* render_frame,
media::MediaLog* media_log,
media::DecoderFactory* decoder_factory,
base::RepeatingCallback<media::GpuVideoAcceleratorFactories*()>
get_gpu_factories_cb,
int element_id);
#if BUILDFLAG(ENABLE_CAST_RECEIVER)
// Creates a new cast_streaming::ResourceProvider. Will only be called once
// per RenderFrame.
virtual std::unique_ptr<cast_streaming::ResourceProvider>
CreateCastStreamingResourceProvider();
#endif
// Creates a WebLinkPreviewTriggerer if an embedder wants to observe events
// and trigger preview. It is allowed to return nullptr.
//
// See blink::WebLinkPreviewTriggerer for more details.
virtual std::unique_ptr<blink::WebLinkPreviewTriggerer>
CreateLinkPreviewTriggerer();
};
} // namespace content
#endif // CONTENT_PUBLIC_RENDERER_CONTENT_RENDERER_CLIENT_H_