blob: 700e93a9ed053e4141658c86a26ec230aed42916 [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_PLATFORM_H_
#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_PLATFORM_H_
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include <tuple>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/scoped_refptr.h"
#include "base/task/sequenced_task_runner.h"
#include "base/threading/platform_thread.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "cc/tiles/raster_dark_mode_filter.h"
#include "cc/trees/raster_context_provider_wrapper.h"
#include "components/viz/common/surfaces/frame_sink_id.h"
#include "media/base/audio_capturer_source.h"
#include "media/base/audio_latency.h"
#include "media/base/audio_renderer_sink.h"
#include "third_party/blink/public/common/security/protocol_handler_security_level.h"
#include "third_party/blink/public/common/user_agent/user_agent_metadata.h"
#include "third_party/blink/public/platform/audio/web_audio_device_source_type.h"
#include "third_party/blink/public/platform/cross_variant_mojo_util.h"
#include "third_party/blink/public/platform/url_loader_throttle_provider.h"
#include "third_party/blink/public/platform/web_audio_device.h"
#include "third_party/blink/public/platform/web_common.h"
#include "third_party/blink/public/platform/web_data.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_v8_value_converter.h"
#include "third_party/blink/public/platform/websocket_handshake_throttle_provider.h"
#include "third_party/webrtc/api/video/video_codec_type.h"
#include "ui/base/resource/resource_scale_factor.h"
#include "ui/gl/angle_implementation.h"
#include "v8/include/v8-local-handle.h"
class SkCanvas;
class SkBitmap;
namespace base {
class SingleThreadTaskRunner;
} // namespace base
namespace cc {
class RasterDarkModeFilter;
}
namespace gfx {
class ColorSpace;
}
namespace gpu {
class GpuChannelHost;
class GpuMemoryBufferManager;
}
namespace media {
struct AudioSinkParameters;
struct AudioSourceParameters;
class DecoderFactory;
class MediaLog;
class MediaPermission;
class GpuVideoAcceleratorFactories;
} // namespace media
namespace net {
class SchemefulSite;
}
namespace network {
namespace mojom {
class URLLoaderFactory;
}
class PendingSharedURLLoaderFactory;
}
namespace url {
class Origin;
}
namespace v8 {
class Context;
} // namespace v8
namespace viz {
class RasterContextProvider;
}
namespace blink {
class BrowserInterfaceBrokerProxy;
class MediaInspectorContext;
class MainThread;
class ThreadSafeBrowserInterfaceBrokerProxy;
class URLLoaderThrottle;
class UserMetricsAction;
class WebAudioBus;
class WebAudioLatencyHint;
class WebAudioSinkDescriptor;
class WebCrypto;
class WebDedicatedWorker;
class WebDedicatedWorkerHostFactoryClient;
class WebGraphicsContext3DProvider;
class WebLocalFrame;
class WebSandboxSupport;
class WebSecurityOrigin;
class WebThemeEngine;
class WebVideoCaptureImplManager;
class WebSecurityOrigin;
struct WebContentSecurityPolicyHeader;
namespace scheduler {
class WebThreadScheduler;
}
namespace mojom {
class ServiceWorkerContainerHostInterfaceBase;
}
class BLINK_PLATFORM_EXPORT Platform {
public:
// Initialize platform and wtf. If you need to initialize the entire Blink,
// you should use blink::Initialize. WebThreadScheduler must be owned by
// the embedder. InitializeBlink must be called before WebThreadScheduler is
// created and passed to InitializeMainThread.
static void InitializeBlink();
static void InitializeMainThread(
Platform*,
scheduler::WebThreadScheduler* main_thread_scheduler);
static Platform* Current();
// This is another entry point for embedders that only require simple
// execution environment of Blink. This version automatically sets up Blink
// with a minimally viable implementation of WebThreadScheduler and
// blink::Thread for the main thread.
//
// TODO(yutak): Fix function name as it seems obsolete at this point.
static void CreateMainThreadAndInitialize(Platform*);
// Used to switch the current platform only for testing.
// You should not pass in a Platform object that is not fully instantiated.
//
// NOTE: Instead of calling this directly, us a ScopedTestingPlatformSupport
// which will restore the previous platform on exit, preventing tests from
// clobbering each other.
static void SetCurrentPlatformForTesting(Platform*);
// This sets up a minimally viable implementation of blink::Thread without
// changing the current Platform. This is essentially a workaround for the
// initialization order in ScopedUnittestsEnvironmentSetup, and nobody else
// should use this.
static void CreateMainThreadForTesting();
// These are dirty workaround for tests requiring the main thread task runner
// from a non-main thread. If your test needs base::TaskEnvironment
// and a non-main thread may call MainThread()->GetTaskRunner(), call
// SetMainThreadTaskRunnerForTesting() in your test fixture's SetUp(), and
// call UnsetMainThreadTaskRunnerForTesting() in TearDown().
//
// TODO(yutak): Ideally, these should be packed in a custom test fixture
// along with TaskEnvironment for reusability.
static void SetMainThreadTaskRunnerForTesting();
static void UnsetMainThreadTaskRunnerForTesting();
Platform();
virtual ~Platform();
// May return null if sandbox support is not necessary
virtual WebSandboxSupport* GetSandboxSupport() { return nullptr; }
// Returns a theme engine. Should be non-null.
WebThemeEngine* ThemeEngine();
// Audio --------------------------------------------------------------
virtual double AudioHardwareSampleRate() { return 0; }
virtual size_t AudioHardwareBufferSize() { return 0; }
virtual unsigned AudioHardwareOutputChannels() { return 0; }
virtual base::TimeDelta GetHungRendererDelay() { return base::TimeDelta(); }
// Creates an audio output device platform interface for Web Audio API.
virtual std::unique_ptr<WebAudioDevice> CreateAudioDevice(
const WebAudioSinkDescriptor& sink_descriptor,
unsigned number_of_output_channels,
const WebAudioLatencyHint& latency_hint,
media::AudioRendererSink::RenderCallback*) {
return nullptr;
}
// IDN conversion ------------------------------------------------------
virtual WebString ConvertIDNToUnicode(const WebString& host) { return host; }
// History -------------------------------------------------------------
// Returns the hash for the given canonicalized URL for use in visited
// link coloring.
virtual uint64_t VisitedLinkHash(std::string_view canonical_url) { return 0; }
// Returns the hash for the given triple-partition key for use in partitioned
// visited link coloring.
virtual uint64_t PartitionedVisitedLinkFingerprint(
std::string_view canonical_link_url,
const net::SchemefulSite& top_level_site,
const WebSecurityOrigin& frame_origin) {
// Return the null-fingerprint value.
return 0;
}
// Returns whether the given link hash is in the user's history. The
// hash must have been generated by calling VisitedLinkHash().
virtual bool IsLinkVisited(uint64_t link_hash) { return false; }
// Each render process has an associated VisitedLinkReader, where all
// per-origin salts for the process are stored. Documents that receive a salt
// via the VisitedLinkNavigationThrottle should notify the VisitedLinkReader
// so its value can be stored in its canonical `salts_` map.
virtual void AddOrUpdateVisitedLinkSalt(const url::Origin& origin,
uint64_t salt) {}
// Keep it the same as ImageDecoder::kNoDecodedImageByteLimit
static const size_t kNoDecodedImageByteLimit = static_cast<size_t>(-1);
// Returns the maximum amount of memory a decoded image should be allowed.
// See comments on ImageDecoder::max_decoded_bytes_.
virtual size_t MaxDecodedImageBytes() { return kNoDecodedImageByteLimit; }
// Returns MaxDecodedImageBytes() from the current platform. If the current
// platform is not available, it returns |kNoDecodedImageByteLimit| as
// default instead;
static size_t GetMaxDecodedImageBytes();
// See: SysUtils::IsLowEndDevice for the full details of what "low-end" means.
// This returns true for devices that can use more extreme tradeoffs for
// performance. Many low memory devices (<=1GB) are not considered low-end.
virtual bool IsLowEndDevice() { return false; }
// Process -------------------------------------------------------------
// Returns a unique FrameSinkID for the current renderer process
virtual viz::FrameSinkId GenerateFrameSinkId() { return viz::FrameSinkId(); }
// Returns whether this process is locked to a single site (i.e. a scheme
// plus eTLD+1, such as https://google.com), or to a more specific origin.
// This means the process will not be used to load documents or workers from
// URLs outside that site.
virtual bool IsLockedToSite() const { return false; }
// Network -------------------------------------------------------------
// Returns the default User-Agent string, it can either full User-Agent string
// or reduced User-Agent string based on policy setting.
virtual WebString UserAgent() { return WebString(); }
// Returns the User Agent metadata. This will replace `UserAgent()` if we
// end up shipping https://github.com/WICG/ua-client-hints.
virtual blink::UserAgentMetadata UserAgentMetadata() {
return blink::UserAgentMetadata();
}
// Determines whether it is safe to redirect from |from_url| to |to_url|.
virtual bool IsRedirectSafe(const GURL& from_url, const GURL& to_url) {
return false;
}
// Appends throttles if the browser has sent a variations header to the
// renderer.
virtual void AppendVariationsThrottles(
const url::Origin& top_origin,
std::vector<std::unique_ptr<blink::URLLoaderThrottle>>* throttles) {}
// Allows the embedder to return a (possibly null)
// blink::URLLoaderThrottleProvider for a worker.
virtual std::unique_ptr<URLLoaderThrottleProvider>
CreateURLLoaderThrottleProviderForWorker(
URLLoaderThrottleProviderType provider_type) {
return nullptr;
}
// Allows the embedder to provide a WebSocketHandshakeThrottleProvider. If it
// returns nullptr then none will be used.
virtual std::unique_ptr<WebSocketHandshakeThrottleProvider>
CreateWebSocketHandshakeThrottleProvider() {
return nullptr;
}
// Whether or not newly created Isolates are indicated to be in the background
// or not.
virtual bool IsolateStartsInBackground() { return false; }
// 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 WebURL& request_url) const {
return true;
}
// Resources -----------------------------------------------------------
// Returns a localized string resource (with substitution parameters).
virtual WebString QueryLocalizedString(int resource_id) {
return WebString();
}
virtual WebString QueryLocalizedString(int resource_id,
const WebString& parameter) {
return WebString();
}
virtual WebString QueryLocalizedString(int resource_id,
const WebString& parameter1,
const WebString& parameter2) {
return WebString();
}
// SavableResource ----------------------------------------------------
virtual bool IsURLSavableForSavableResource(const WebURL& url) {
return false;
}
// Threads -------------------------------------------------------
// The two compositor-related functions below are called by the embedder.
// TODO(yutak): Perhaps we should move these to somewhere else?
// Create and initialize the compositor thread. After this function
// completes, you can access CompositorThreadTaskRunner().
void CreateAndSetCompositorThread();
// Returns the task runner of the compositor thread. This is available
// once CreateAndSetCompositorThread() is called.
scoped_refptr<base::SingleThreadTaskRunner> CompositorThreadTaskRunner();
// Returns the video frame compositor thread task runner. This may
// conditionally be the same as the compositor thread task runner.
virtual scoped_refptr<base::SingleThreadTaskRunner>
VideoFrameCompositorTaskRunner() {
return CompositorThreadTaskRunner();
}
// Returns the task runner of the media thread.
// This method should only be called on the main thread, or it crashes.
virtual scoped_refptr<base::SequencedTaskRunner> MediaThreadTaskRunner() {
return nullptr;
}
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
// This is called after the thread is created, so the embedder
// can initiate an IPC to change its thread type (on Linux we can't
// increase the nice value, so we need to ask the browser process). This
// function is only called from the main thread.
virtual void SetThreadType(base::PlatformThreadId, base::ThreadType) {}
#endif
// Resources -----------------------------------------------------------
// Returns a blob of data corresponding to |resource_id|. This should not be
// used for resources which have compress="gzip" in *.grd.
virtual WebData GetDataResource(
int resource_id,
ui::ResourceScaleFactor scale_factor = ui::kScaleFactorNone) {
return WebData();
}
// Returns string data from a data resource. compress="gzip" and "brotli" are
// detected automatically.
virtual std::string GetDataResourceString(int resource_id) {
return std::string();
}
// Decodes the in-memory audio file data and returns the linear PCM audio data
// in the |destination_bus|.
// Returns true on success.
virtual bool DecodeAudioFileData(WebAudioBus* destination_bus,
const char* audio_file_data,
size_t data_size) {
return false;
}
// Process lifetime management -----------------------------------------
// Disable/Enable sudden termination on a process level. When possible, it
// is preferable to disable sudden termination on a per-frame level via
// mojom::LocalFrameHost::SuddenTerminationDisablerChanged.
// This method should only be called on the main thread.
virtual void SuddenTerminationChanged(bool enabled) {}
// System --------------------------------------------------------------
// Returns a value such as "en-US".
virtual WebString DefaultLocale() { return WebString(); }
// Returns an interface to the IO task runner.
virtual scoped_refptr<base::SingleThreadTaskRunner> GetIOTaskRunner() const {
return nullptr;
}
virtual base::PlatformThreadId GetIOThreadId() const {
return base::kInvalidThreadId;
}
// Returns the sequenced task runner used to funnel video frames from
// MediaStreamVideoSource. It may conditionally be the same as the result
// from GetIOTaskRunner().
virtual scoped_refptr<base::SequencedTaskRunner>
GetMediaStreamVideoSourceVideoTaskRunner() const {
return GetIOTaskRunner();
}
// Returns an interface to run nested message loop. Used for debugging.
class NestedMessageLoopRunner {
public:
virtual ~NestedMessageLoopRunner() = default;
virtual void Run() = 0;
virtual void QuitNow() = 0;
};
virtual std::unique_ptr<NestedMessageLoopRunner>
CreateNestedMessageLoopRunner() const {
return nullptr;
}
// Testing -------------------------------------------------------------
// Record a UMA sequence action. The UserMetricsAction construction must
// be on a single line for extract_actions.py to find it. Please see
// that script for more details. Intended use is:
// RecordAction(UserMetricsAction("MyAction"))
virtual void RecordAction(const UserMetricsAction&) {}
typedef uint64_t WebMemoryAllocatorDumpGuid;
// GPU ----------------------------------------------------------------
//
enum ContextType {
kWebGL1ContextType, // WebGL 1.0 context, use only for WebGL canvases
kWebGL2ContextType, // WebGL 2.0 context, use only for WebGL canvases
kGLES2ContextType, // GLES 2.0 context, default, good for using skia
kGLES3ContextType, // GLES 3.0 context
kWebGPUContextType, // WebGPU context
};
struct ContextAttributes {
bool prefer_low_power_gpu = false;
bool fail_if_major_performance_caveat = false;
ContextType context_type = kGLES2ContextType;
// Offscreen contexts created for WebGL should not need the RasterInterface
// or GrContext. If either of these are set to false, it will not be
// possible to use the corresponding interface for the lifetime of the
// context.
bool enable_raster_interface = false;
bool support_grcontext = false;
};
struct GraphicsInfo {
unsigned vendor_id = 0;
unsigned device_id = 0;
unsigned reset_notification_strategy = 0;
bool sandboxed = false;
bool amd_switchable = false;
bool optimus = false;
bool using_gpu_compositing = false;
bool using_passthrough_command_decoder = false;
gl::ANGLEImplementation angle_implementation =
gl::ANGLEImplementation::kNone;
WebString vendor_info;
WebString renderer_info;
WebString driver_version;
WebString error_message;
};
// Returns a newly allocated and initialized offscreen context provider,
// backed by an independent context. Returns null if the context cannot be
// created or initialized.
virtual std::unique_ptr<WebGraphicsContext3DProvider>
CreateOffscreenGraphicsContext3DProvider(const ContextAttributes&,
const WebURL& document_url,
GraphicsInfo*);
// Returns a newly allocated and initialized offscreen context provider,
// backed by the process-wide shared main thread context. Returns null if
// the context cannot be created or initialized.
virtual std::unique_ptr<WebGraphicsContext3DProvider>
CreateSharedOffscreenGraphicsContext3DProvider();
// Returns a newly allocated and initialized WebGPU context provider,
// backed by an independent context. Returns null if the context cannot be
// created or initialized.
virtual std::unique_ptr<WebGraphicsContext3DProvider>
CreateWebGPUGraphicsContext3DProvider(const WebURL& document_url);
virtual void CreateWebGPUGraphicsContext3DProviderAsync(
const blink::WebURL& document_url,
base::OnceCallback<
void(std::unique_ptr<blink::WebGraphicsContext3DProvider>)> callback);
virtual gpu::GpuMemoryBufferManager* GetGpuMemoryBufferManager() {
return nullptr;
}
// When true, animations will run on a compositor thread independently from
// the blink main thread.
// This is true when there exists a renderer compositor in this process. But
// for unit tests, a single-threaded compositor may be used so it may remain
// false.
virtual bool IsThreadedAnimationEnabled() { return false; }
// Whether the compositor is using gpu and expects gpu resources as inputs,
// or software based resources.
// NOTE: This function should not be called from core/ and modules/, but
// called by platform/graphics/ is fine.
virtual bool IsGpuCompositingDisabled() const { return true; }
#if BUILDFLAG(IS_ANDROID)
// Returns if synchronous compositing is enabled. Only used for Android
// webview.
virtual bool IsSynchronousCompositingEnabledForAndroidWebView() {
return false;
}
// Returns if zero copy synchronouse software draw is enabled. Only used
// when SynchronousCompositing is enabled and only when in single process
// mode.
virtual bool IsZeroCopySynchronousSwDrawEnabledForAndroidWebView() {
return false;
}
// Return the SkCanvas that is to be used if
// ZeroCopySynchronousSwDrawEnabled returns true.
virtual SkCanvas* SynchronousCompositorGetSkCanvasForAndroidWebView() {
return nullptr;
}
#endif
// Whether LCD text is enabled.
virtual bool IsLcdTextEnabled() { return false; }
// Whether rubberbanding/elatic on overscrolling is enabled. This usually
// varies between each OS and can be configured via user settings in the OS.
virtual bool IsElasticOverscrollEnabled() { return false; }
// Whether the scroll animator that produces smooth scrolling is enabled.
virtual bool IsScrollAnimatorEnabled() { return true; }
// Returns a context provider that will be bound on the main thread
// thread.
virtual scoped_refptr<viz::RasterContextProvider>
SharedMainThreadContextProvider();
// Returns a worker context provider that will be bound on the compositor
// thread.
virtual scoped_refptr<cc::RasterContextProviderWrapper>
SharedCompositorWorkerContextProvider(
cc::RasterDarkModeFilter* dark_mode_filter);
// Synchronously establish a channel to the GPU plugin if not previously
// established or if it has been lost (for example if the GPU plugin crashed).
// If there is a pending asynchronous request, it will be completed by the
// time this routine returns.
virtual scoped_refptr<gpu::GpuChannelHost> EstablishGpuChannelSync();
// Is mojo::Remote<mojom::Gpu> disconnected?
virtual bool IsGpuRemoteDisconnected();
// Same as above, but asynchronous.
using EstablishGpuChannelCallback =
base::OnceCallback<void(scoped_refptr<gpu::GpuChannelHost>)>;
virtual void EstablishGpuChannel(EstablishGpuChannelCallback callback);
// Media stream ----------------------------------------------------
virtual scoped_refptr<media::AudioCapturerSource> NewAudioCapturerSource(
blink::WebLocalFrame* web_frame,
const media::AudioSourceParameters& params) {
return nullptr;
}
virtual bool RTCSmoothnessAlgorithmEnabled() { return true; }
// WebRTC ----------------------------------------------------------
virtual std::optional<double> GetWebRtcMaxCaptureFrameRate() {
return std::nullopt;
}
virtual scoped_refptr<media::AudioRendererSink> NewAudioRendererSink(
blink::WebAudioDeviceSourceType source_type,
blink::WebLocalFrame* web_frame,
const media::AudioSinkParameters& params) {
return nullptr;
}
virtual media::AudioLatency::Type GetAudioSourceLatencyType(
blink::WebAudioDeviceSourceType source_type) {
return media::AudioLatency::Type::kPlayback;
}
virtual bool ShouldEnforceWebRTCRoutingPreferences() { return true; }
virtual media::MediaPermission* GetWebRTCMediaPermission(
WebLocalFrame* web_frame) {
return nullptr;
}
virtual bool UsesFakeCodecForPeerConnection() { return false; }
virtual bool IsWebRtcEncryptionEnabled() { return true; }
virtual bool IsWebRtcSrtpEncryptedHeadersEnabled() { return false; }
// TODO(qingsi): Consolidate the legacy |ip_handling_policy| with
// |allow_mdns_obfuscation| following the latest spec on IP handling modes
// with mDNS introduced
// (https://tools.ietf.org/html/draft-ietf-rtcweb-ip-handling-12);
virtual void GetWebRTCRendererPreferences(WebLocalFrame* web_frame,
WebString* ip_handling_policy,
uint16_t* udp_min_port,
uint16_t* udp_max_port,
bool* allow_mdns_obfuscation) {}
virtual bool IsWebRtcHWEncodingEnabled() { return true; }
virtual bool IsWebRtcHWDecodingEnabled() { return true; }
virtual bool AllowsLoopbackInPeerConnection() { return false; }
// VideoCapture -------------------------------------------------------
virtual WebVideoCaptureImplManager* GetVideoCaptureImplManager() {
return nullptr;
}
// WebWorker ----------------------------------------------------------
virtual std::unique_ptr<WebDedicatedWorkerHostFactoryClient>
CreateDedicatedWorkerHostFactoryClient(WebDedicatedWorker*,
const BrowserInterfaceBrokerProxy&);
virtual void DidStartWorkerThread() {}
virtual void WillStopWorkerThread() {}
virtual void WorkerContextCreated(const v8::Local<v8::Context>& worker) {}
virtual bool AllowScriptExtensionForServiceWorker(
const WebSecurityOrigin& script_origin) {
return false;
}
virtual ProtocolHandlerSecurityLevel GetProtocolHandlerSecurityLevel(
const WebSecurityOrigin& origin) {
return ProtocolHandlerSecurityLevel::kStrict;
}
// Returns true if the origin can register a service worker. Scheme must be
// http (localhost only), https, or a custom-set secure scheme.
virtual bool OriginCanAccessServiceWorkers(const GURL& url) { return false; }
// Clones the current `service_worker_container_host` and returns the original
// host and the cloned one together.
//
// TODO(https://crbug.com/1110176): Remove this method once the mojom
// interface ServiceWorkerContainerHost is moved out of mojom_core, which is
// not available from renderer/platform.
virtual std::tuple<
CrossVariantMojoRemote<mojom::ServiceWorkerContainerHostInterfaceBase>,
CrossVariantMojoRemote<mojom::ServiceWorkerContainerHostInterfaceBase>>
CloneServiceWorkerContainerHost(
CrossVariantMojoRemote<mojom::ServiceWorkerContainerHostInterfaceBase>
service_worker_container_host) {
return std::make_tuple(
/*original_service_worker_container_host=*/CrossVariantMojoRemote<
mojom::ServiceWorkerContainerHostInterfaceBase>(),
/*cloned_service_worker_container_host=*/CrossVariantMojoRemote<
mojom::ServiceWorkerContainerHostInterfaceBase>());
}
// Creates a ServiceWorkerSubresourceLoaderFactory.
virtual void CreateServiceWorkerSubresourceLoaderFactory(
CrossVariantMojoRemote<mojom::ServiceWorkerContainerHostInterfaceBase>
service_worker_container_host,
const WebString& client_id,
std::unique_ptr<network::PendingSharedURLLoaderFactory> fallback_factory,
mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
scoped_refptr<base::SequencedTaskRunner> task_runner);
// WebCrypto ----------------------------------------------------------
virtual WebCrypto* Crypto() { return nullptr; }
// Mojo ---------------------------------------------------------------
// Callable from any thread. Asks the browser to bind an interface receiver on
// behalf of this renderer.
//
// Note that all GetInterface requests made on this object will hop to the IO
// thread before being passed to the browser process.
//
// Callers should consider scoping their interfaces to a more specific context
// before resorting to use of process-scoped interface bindings. Frames and
// workers have their own contexts, and their BrowserInterfaceBrokerProxy
// instances have less overhead since they don't need to be thread-safe.
// Using a more narrowly defined scope when possible is also generally better
// for security.
virtual ThreadSafeBrowserInterfaceBrokerProxy* GetBrowserInterfaceBroker();
// Media Log -----------------------------------------------------------
// MediaLog is used by WebCodecs to report events and errors up to the
// chrome://media-internals page and the DevTools media tab.
// |owner_task_runner| must be bound to the main thead or the worker thread
// on which WebCodecs will using the MediaLog. It is safe to add logs to
// MediaLog from any thread, but it must be destroyed on |owner_task_runner|.
// MediaLog owners should destroy the MediaLog if the ExecutionContext is
// destroyed, since |inspector_context| may no longer be valid at that point.
// |is_on_worker| is used to avoid logging to the chrome://media-internal
// page, which can only be logged to from the window main thread.
// Note: |inspector_context| is only used on |owner_task_runner|, so
// destroying the MediaLog on |owner_task_runner| should avoid races.
virtual std::unique_ptr<media::MediaLog> GetMediaLog(
MediaInspectorContext* inspector_context,
scoped_refptr<base::SingleThreadTaskRunner> owner_task_runner,
bool is_on_worker);
// GpuVideoAcceleratorFactories --------------------------------------
virtual media::GpuVideoAcceleratorFactories* GetGpuFactories() {
return nullptr;
}
virtual base::WeakPtr<media::DecoderFactory> GetMediaDecoderFactory() {
return nullptr;
}
virtual void SetRenderingColorSpace(const gfx::ColorSpace& color_space) {}
virtual gfx::ColorSpace GetRenderingColorSpace() const;
// V8 Metrics -----------------------------------------------------------
// Called when adding a histogram entry. Allows customizing the name the
// histogram is logged as.
virtual std::string GetNameForHistogram(const char* name) {
return std::string{name};
}
// V8 Context Snapshot --------------------------------------------------
// This method returns true only when
// tools/v8_context_snapshot/v8_context_snapshot_generator is running (which
// runs during Chromium's build step).
virtual bool IsTakingV8ContextSnapshot() { return false; }
// Crash Reporting -----------------------------------------------------
// Set the active URL for crash reporting. The active URL is stored as crash
// keys and is usually set for the duration of processing an IPC message. To
// unset pass an empty WebURL and WebString.
virtual void SetActiveURL(const WebURL& url, const WebString& top_url) {}
// Sad Page -----------------------------------------------------
// Returns a sad page bitmap used when the child frame has crashed.
virtual SkBitmap* GetSadPageBitmap() { return nullptr; }
// V8 Converter -------------------------------------------------
// Returns WebV8ValueConverter that converts between v8::Value and
// base::Value.
virtual std::unique_ptr<WebV8ValueConverter> CreateWebV8ValueConverter() {
return nullptr;
}
// Content Security Policy --------------------------------------
// 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 WebURL& url,
blink::WebVector<blink::WebContentSecurityPolicyHeader>* csp) {}
#if BUILDFLAG(IS_ANDROID)
// User Level Memory Pressure Signal Generator ------------------
virtual void SetPrivateMemoryFootprint(
uint64_t private_memory_footprint_bytes) {}
virtual bool IsUserLevelMemoryPressureSignalEnabled() { return false; }
virtual std::pair<base::TimeDelta, base::TimeDelta>
InertAndMinimumIntervalOfUserLevelMemoryPressureSignal() {
return std::make_pair(base::TimeDelta(), base::TimeDelta());
}
#endif
private:
static void InitializeMainThreadCommon(
Platform* platform,
std::unique_ptr<MainThread> main_thread);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_PLATFORM_H_