| // Copyright 2013 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_RENDERER_HOST_RENDER_FRAME_HOST_DELEGATE_H_ |
| #define CONTENT_BROWSER_RENDERER_HOST_RENDER_FRAME_HOST_DELEGATE_H_ |
| |
| #include <stdint.h> |
| |
| #include <optional> |
| #include <string> |
| #include <vector> |
| |
| #include "base/functional/callback_forward.h" |
| #include "base/i18n/rtl.h" |
| #include "base/memory/safe_ref.h" |
| #include "build/build_config.h" |
| #include "components/viz/common/surfaces/surface_id.h" |
| #include "content/browser/renderer_host/render_frame_host_impl.h" |
| #include "content/browser/webui/web_ui_impl.h" |
| #include "content/common/content_export.h" |
| #include "content/public/browser/javascript_dialog_manager.h" |
| #include "content/public/browser/media_player_watch_time.h" |
| #include "content/public/browser/media_stream_request.h" |
| #include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/select_audio_output_request.h" |
| #include "content/public/browser/site_instance.h" |
| #include "content/public/browser/visibility.h" |
| #include "content/public/common/javascript_dialog_type.h" |
| #include "media/base/picture_in_picture_events_info.h" |
| #include "media/mojo/mojom/media_player.mojom.h" |
| #include "media/mojo/services/media_metrics_provider.h" |
| #include "mojo/public/cpp/bindings/pending_associated_receiver.h" |
| #include "mojo/public/cpp/bindings/pending_associated_remote.h" |
| #include "mojo/public/cpp/bindings/pending_receiver.h" |
| #include "mojo/public/cpp/bindings/pending_remote.h" |
| #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" |
| #include "net/cert/cert_status_flags.h" |
| #include "net/http/http_response_headers.h" |
| #include "services/device/public/mojom/geolocation_context.mojom.h" |
| #include "services/device/public/mojom/wake_lock.mojom.h" |
| #include "services/metrics/public/cpp/ukm_source_id.h" |
| #include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h" |
| #include "third_party/blink/public/common/mediastream/media_stream_request.h" |
| #include "third_party/blink/public/mojom/choosers/popup_menu.mojom.h" |
| #include "third_party/blink/public/mojom/devtools/console_message.mojom.h" |
| #include "third_party/blink/public/mojom/favicon/favicon_url.mojom.h" |
| #include "third_party/blink/public/mojom/frame/blocked_navigation_types.mojom.h" |
| #include "third_party/blink/public/mojom/frame/frame.mojom-forward.h" |
| #include "third_party/blink/public/mojom/loader/resource_load_info.mojom.h" |
| #include "third_party/blink/public/mojom/media/capture_handle_config.mojom.h" |
| #include "third_party/blink/public/mojom/page/draggable_region.mojom-forward.h" |
| #include "third_party/skia/include/core/SkColor.h" |
| #include "ui/accessibility/ax_mode.h" |
| #include "ui/base/clipboard/clipboard_metadata.h" |
| #include "ui/base/window_open_disposition.h" |
| |
| #if BUILDFLAG(IS_WIN) |
| #include "ui/gfx/native_widget_types.h" |
| #endif |
| |
| #if BUILDFLAG(IS_ANDROID) |
| #include "base/android/scoped_java_ref.h" |
| #endif |
| |
| #if BUILDFLAG(IS_ANDROID) || (BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_IOS_TVOS)) |
| #include "services/device/public/mojom/nfc.mojom.h" |
| #endif |
| |
| class GURL; |
| |
| namespace IPC { |
| class Message; |
| } |
| |
| namespace gfx { |
| class Rect; |
| class Size; |
| } // namespace gfx |
| |
| namespace url { |
| class Origin; |
| } |
| |
| namespace blink { |
| namespace mojom { |
| class DisplayCutoutHost; |
| class FullscreenOptions; |
| class WindowFeatures; |
| } // namespace mojom |
| class PageState; |
| namespace web_pref { |
| struct WebPreferences; |
| } |
| } // namespace blink |
| |
| namespace device { |
| namespace mojom { |
| class ScreenOrientation; |
| } |
| } // namespace device |
| |
| namespace network { |
| struct ResourceRequest; |
| } // namespace network |
| |
| namespace network::mojom { |
| class SharedDictionaryAccessDetails; |
| } // namespace network::mojom |
| |
| namespace ui { |
| class ClipboardFormatType; |
| struct AXUpdatesAndEvents; |
| struct AXLocationAndScrollUpdates; |
| } // namespace ui |
| |
| namespace content { |
| class FrameTreeNode; |
| class PrerenderHostRegistry; |
| class RenderWidgetHostImpl; |
| class SessionStorageNamespace; |
| class SiteInstanceGroup; |
| struct ContextMenuParams; |
| struct CookieAccessDetails; |
| struct GlobalRequestID; |
| struct TrustTokenAccessDetails; |
| |
| namespace mojom { |
| class CreateNewWindowParams; |
| } |
| |
| // When calculating storage access for a partitioned popin the |
| // `top_frame_origin` and `ancestor_chain_bit` are needed to calculate the |
| // storage key and the `site_for_cookies` is needed to properly filter cookie |
| // access. |
| // https://explainers-by-googlers.github.io/partitioned-popins/ |
| struct PartitionedPopinOpenerProperties { |
| url::Origin top_frame_origin; |
| net::SiteForCookies site_for_cookies; |
| blink::mojom::AncestorChainBit ancestor_chain_bit; |
| |
| blink::mojom::PartitionedPopinParamsPtr AsMojom() const; |
| }; |
| |
| // An interface implemented by an object interested in knowing about the state |
| // of the RenderFrameHost. |
| // |
| // Layering note: Generally, WebContentsImpl should be the only implementation |
| // of this interface. In particular, WebContents::FromRenderFrameHost() assumes |
| // this. This delegate interface is useful for renderer_host/ to make requests |
| // to WebContentsImpl, as renderer_host/ is not permitted to know the |
| // WebContents type (see //renderer_host/DEPS). |
| class CONTENT_EXPORT RenderFrameHostDelegate { |
| public: |
| // Callback used with IsClipboardPasteAllowedByPolicy() method. If the |
| // clipboard paste is allowed to proceed, the callback is called with the data |
| // that's allowed to be pasted. |
| using IsClipboardPasteAllowedCallback = |
| RenderFrameHostImpl::IsClipboardPasteAllowedCallback; |
| |
| using JavaScriptDialogCallback = |
| content::JavaScriptDialogManager::DialogClosedCallback; |
| |
| using ClipboardPasteData = content::ClipboardPasteData; |
| using ClipboardEndpoint = content::ClipboardEndpoint; |
| using ClipboardMetadata = ui::ClipboardMetadata; |
| |
| // This is used to give the delegate a chance to filter IPC messages. |
| virtual bool OnMessageReceived(RenderFrameHostImpl* render_frame_host, |
| const IPC::Message& message); |
| |
| // Notification from the renderer host that a suspicious navigation of the |
| // main frame has been blocked. Allows the delegate to provide some UI to let |
| // the user know about the blocked navigation and give them the option to |
| // recover from it. |
| // |blocked_url| is the blocked navigation target, |initiator_url| is the URL |
| // of the frame initiating the navigation, |reason| specifies why the |
| // navigation was blocked. |
| virtual void OnDidBlockNavigation( |
| const GURL& blocked_url, |
| const GURL& initiator_url, |
| blink::mojom::NavigationBlockedReason reason) {} |
| |
| // Called when blink.mojom.LocalFrameHost::DidFinishLoad() is invoked. |
| virtual void OnDidFinishLoad(RenderFrameHostImpl* render_frame_host, |
| const GURL& url) {} |
| |
| // Notifies that the manifest URL is updated. |
| virtual void OnManifestUrlChanged(PageImpl& page) {} |
| |
| // A message was added to to the console. |source_id| is a URL. |
| // |untrusted_stack_trace| is not present for most messages; only when |
| // requested in advance and only for exceptions. |
| virtual bool DidAddMessageToConsole( |
| RenderFrameHostImpl* source_frame, |
| blink::mojom::ConsoleMessageLevel log_level, |
| const std::u16string& message, |
| int32_t line_no, |
| const std::u16string& source_id, |
| const std::optional<std::u16string>& untrusted_stack_trace); |
| |
| // Called when a RenderFrame for |render_frame_host| is created in the |
| // renderer process. Use |RenderFrameDeleted| to listen for when this |
| // RenderFrame goes away. |
| virtual void RenderFrameCreated(RenderFrameHostImpl* render_frame_host) {} |
| |
| // Called when a RenderFrame for |render_frame_host| is deleted or the |
| // renderer process in which it runs it has died. Use |RenderFrameCreated| to |
| // listen for when RenderFrame objects are created. |
| virtual void RenderFrameDeleted(RenderFrameHostImpl* render_frame_host) {} |
| |
| // A context menu should be shown, to be built using the context information |
| // provided in the supplied params. |
| virtual void ShowContextMenu( |
| RenderFrameHostImpl& render_frame_host, |
| mojo::PendingAssociatedRemote<blink::mojom::ContextMenuClient> |
| context_menu_client, |
| const ContextMenuParams& params) {} |
| |
| // A JavaScript alert, confirmation or prompt dialog should be shown. |
| // Will only be called for active frames belonging to a primary page. |
| virtual void RunJavaScriptDialog(RenderFrameHostImpl* render_frame_host, |
| const std::u16string& message, |
| const std::u16string& default_prompt, |
| JavaScriptDialogType type, |
| bool disable_third_party_subframe_suppresion, |
| JavaScriptDialogCallback callback) {} |
| |
| // Will only be called for active frames belonging to a primary page. |
| virtual void RunBeforeUnloadConfirm(RenderFrameHostImpl* render_frame_host, |
| bool is_reload, |
| JavaScriptDialogCallback callback) {} |
| |
| // Notifies when new blink::mojom::FaviconURLPtr candidates are received from |
| // the renderer process. |
| virtual void UpdateFaviconURL( |
| RenderFrameHostImpl* source, |
| const std::vector<blink::mojom::FaviconURLPtr>& candidates) {} |
| |
| // The frame changed its window.name property. |
| virtual void DidChangeName(RenderFrameHostImpl* render_frame_host, |
| const std::string& name) {} |
| |
| // Called when a frame receives user activation. This may be called multiple |
| // times for the same frame. Does not include frames activated by the |
| // same-origin visibility heuristic, see `UserActivationState` for details. |
| virtual void DidReceiveUserActivation( |
| RenderFrameHostImpl* render_frame_host) {} |
| |
| // Called when a RenderFrameHost gets a successful web authn assertion |
| // request. |
| virtual void WebAuthnAssertionRequestSucceeded( |
| RenderFrameHostImpl* render_frame_host) {} |
| |
| // Binds a DisplayCutoutHost object associated to |render_frame_host|. |
| virtual void BindDisplayCutoutHost( |
| RenderFrameHostImpl* render_frame_host, |
| mojo::PendingAssociatedReceiver<blink::mojom::DisplayCutoutHost> |
| receiver) {} |
| |
| // The display style of the frame has changed. |
| virtual void DidChangeDisplayState(RenderFrameHostImpl* render_frame_host, |
| bool is_display_none) {} |
| |
| // The size of the frame has changed. |
| virtual void FrameSizeChanged(RenderFrameHostImpl* render_frame_host, |
| const gfx::Size& frame_size) {} |
| |
| // The DOMContentLoaded handler in the frame has completed. |
| virtual void DOMContentLoaded(RenderFrameHostImpl* render_frame_host) {} |
| |
| // The onload handler in the frame has completed. Only called for the main |
| // frames. |
| virtual void DocumentOnLoadCompleted(RenderFrameHostImpl* render_frame_host) { |
| } |
| |
| // The page's title was changed and should be updated. Only called for the |
| // top-level frame. |
| virtual void UpdateTitle(RenderFrameHostImpl* render_frame_host, |
| const std::u16string& title, |
| base::i18n::TextDirection title_direction) {} |
| |
| // Update application title. |
| virtual void UpdateApplicationTitle(RenderFrameHostImpl* render_frame_host, |
| const std::u16string& application_title) { |
| } |
| |
| // The destination URL has changed and should be updated. |
| virtual void UpdateTargetURL(RenderFrameHostImpl* render_frame_host, |
| const GURL& url) {} |
| |
| // Creates a MediaPlayerHost object associated to |frame_host| via its |
| // associated MediaWebContentsObserver, and binds |receiver| to it. |
| virtual void CreateMediaPlayerHostForRenderFrameHost( |
| RenderFrameHostImpl* frame_host, |
| mojo::PendingAssociatedReceiver<media::mojom::MediaPlayerHost> receiver) { |
| } |
| |
| // The render frame has requested access to media devices listed in |
| // |request|, and the client should grant or deny that permission by |
| // calling |callback|. |
| virtual void RequestMediaAccessPermission( |
| RenderFrameHostImpl* render_frame_host, |
| const MediaStreamRequest& request, |
| MediaResponseCallback callback); |
| |
| // Called when a renderer requests to select an audio output device. |
| // |request| contains parameters for audio output device selection. |
| // |callback| is called with the unique ID of the selected device, or |
| // std::nullopt if selection fails. |
| virtual void ProcessSelectAudioOutput(const SelectAudioOutputRequest& request, |
| SelectAudioOutputCallback callback); |
| |
| // Checks if we have permission to access the microphone or camera. Note that |
| // this does not query the user. |type| must be MEDIA_DEVICE_AUDIO_CAPTURE |
| // or MEDIA_DEVICE_VIDEO_CAPTURE. |
| virtual bool CheckMediaAccessPermission( |
| RenderFrameHostImpl* render_frame_host, |
| const url::Origin& security_origin, |
| blink::mojom::MediaStreamType type); |
| |
| // Setter for the capture handle config, which allows a captured application |
| // to opt-in to exposing information to its capturer(s). |
| virtual void SetCaptureHandleConfig( |
| blink::mojom::CaptureHandleConfigPtr config) {} |
| |
| // Get the accessibility mode for the WebContents that owns this frame. |
| virtual ui::AXMode GetAccessibilityMode(); |
| |
| // Called whenever the AXTreeID for the topmost RenderFrameHost has changed. |
| virtual void AXTreeIDForMainFrameHasChanged() {} |
| |
| // Called when accessibility events or location changes are received |
| // from a render frame, when the accessibility mode has the |
| // ui::AXMode::kWebContents flag set. |
| virtual void ProcessAccessibilityUpdatesAndEvents( |
| ui::AXUpdatesAndEvents& details) {} |
| virtual void AccessibilityLocationChangesReceived( |
| const ui::AXTreeID& tree_id, |
| ui::AXLocationAndScrollUpdates& details) {} |
| |
| // Indicates an unrecoverable error in accessibility. Gracefully turns off |
| // accessibility in all frames. |
| virtual void UnrecoverableAccessibilityError() {} |
| |
| // Gets the GeolocationContext associated with this delegate. |
| virtual device::mojom::GeolocationContext* GetGeolocationContext(); |
| |
| #if BUILDFLAG(IS_ANDROID) || (BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_IOS_TVOS)) |
| // Gets an NFC implementation within the context of this delegate. |
| virtual void GetNFC(RenderFrameHostImpl* render_frame_host, |
| mojo::PendingReceiver<device::mojom::NFC> receiver); |
| #endif |
| |
| // Returns whether entering fullscreen with EnterFullscreenMode() is allowed. |
| virtual bool CanEnterFullscreenMode(RenderFrameHostImpl* requesting_frame); |
| |
| // Notification that the frame with the given host wants to enter fullscreen |
| // mode. Must only be called if CanEnterFullscreenMode returns true. |
| virtual void EnterFullscreenMode( |
| RenderFrameHostImpl* requesting_frame, |
| const blink::mojom::FullscreenOptions& options) {} |
| |
| // Notification that the frame wants to go out of fullscreen mode. |
| // |will_cause_resize| indicates whether the fullscreen change causes a |
| // view resize. e.g. This will be false when going from tab fullscreen to |
| // browser fullscreen. |
| virtual void ExitFullscreenMode(bool will_cause_resize) {} |
| |
| // Notification that this frame has changed fullscreen state. |
| virtual void FullscreenStateChanged( |
| RenderFrameHostImpl* rfh, |
| bool is_fullscreen, |
| blink::mojom::FullscreenOptionsPtr options); |
| |
| // Returns whether the RFH can use Additional Windowing Controls (AWC) APIs. |
| // https://github.com/explainers-by-googlers/additional-windowing-controls/blob/main/README.md |
| virtual bool CanUseWindowingControls(RenderFrameHostImpl* requesting_frame); |
| |
| // Request to maximize window. |
| virtual void Maximize() {} |
| |
| // Request to minimize window. |
| virtual void Minimize() {} |
| |
| // Request to restore window. |
| virtual void Restore() {} |
| |
| #if BUILDFLAG(IS_ANDROID) |
| // Updates information to determine whether a user gesture should carryover to |
| // future navigations. This is needed so navigations within a certain |
| // timeframe of a request initiated by a gesture will be treated as if they |
| // were initiated by a gesture too, otherwise the navigation may be blocked. |
| virtual void UpdateUserGestureCarryoverInfo() {} |
| #endif |
| |
| // The frame called |window.focus()|. |
| virtual void DidCallFocus() {} |
| |
| // Returns whether this delegate is an inner WebContents for a guest. |
| // TODO(crbug.com/40214326): Remove in favor of tracking pending guest |
| // initializations instead. |
| virtual bool IsInnerWebContentsForGuest(); |
| |
| // Returns the focused frame if it exists, potentially in an inner frame tree. |
| virtual RenderFrameHostImpl* GetFocusedFrame(); |
| |
| // Called by when |source_rfh| advances focus to a RenderFrameProxyHost. |
| virtual void OnAdvanceFocus(RenderFrameHostImpl* source_rfh) {} |
| |
| // Called by |frame| to notify that it has received an update on focused |
| // element. |bounds_in_root_view| is the rectangle containing the element that |
| // is focused and is with respect to root frame's RenderWidgetHost's |
| // coordinate space. |
| virtual void OnFocusedElementChangedInFrame( |
| RenderFrameHostImpl* frame, |
| const gfx::Rect& bounds_in_root_view, |
| blink::mojom::FocusType focus_type) {} |
| |
| // The page is trying to open a new page (e.g. a popup window). The window |
| // should be created associated the process of |opener|, but it should not |
| // be shown yet. That should happen in response to ShowCreatedWindow. |
| // |params.window_container_type| describes the type of RenderViewHost |
| // container that is requested -- in particular, the window.open call may |
| // have specified 'background' and 'persistent' in the feature string. |
| // |
| // The passed |opener| is the RenderFrameHost initiating the window creation. |
| // It will never be null, even if the opener is suppressed via |params|. |
| // |
| // The passed |params.frame_name| parameter is the name parameter that was |
| // passed to window.open(), and will be empty if none was passed. |
| // |
| // Note: this is not called "CreateWindow" because that will clash with |
| // the Windows function which is actually a #define. |
| // |
| // On success, a non-owning pointer to the new FrameTree is returned. |
| // |
| // The caller is expected to handle cleanup if this operation fails or is |
| // suppressed by checking if the return value is null. |
| virtual FrameTree* CreateNewWindow( |
| RenderFrameHostImpl* opener, |
| const mojom::CreateNewWindowParams& params, |
| bool is_new_browsing_instance, |
| bool has_user_gesture, |
| SessionStorageNamespace* session_storage_namespace); |
| |
| // Show a previously created page with the specified disposition and window |
| // features. The window is identified by the |main_frame_widget_route_id| |
| // passed to CreateNewWindow. |
| // |
| // The passed |opener| is the RenderFrameHost initiating the window creation. |
| // It will never be null, even if the opener is suppressed via |params|. |
| // |
| // The return value is the new WebContents associated with the window, if any. |
| // In some cases there is no WebContents to be returned, either because the |
| // operation failed and the window was not shown, or because the new |
| // WebContents is not meant to be visible/connected to its opener (e.g. when |
| // opening a system app on chromeos). In those cases, ShowCreatedWindow() will |
| // return nullptr. If non-null, the returned WebContents will already be owned |
| // by its WebContentsDelegate. |
| // |
| // Note: this is not called "ShowWindow" because that will clash with |
| // the Windows function which is actually a #define. |
| virtual WebContents* ShowCreatedWindow( |
| RenderFrameHostImpl* opener, |
| int main_frame_widget_route_id, |
| WindowOpenDisposition disposition, |
| const blink::mojom::WindowFeatures& window_features, |
| bool user_gesture); |
| |
| // The main frame document element is ready. This happens when the document |
| // has finished parsing. |
| virtual void PrimaryMainDocumentElementAvailable() {} |
| |
| // Reports that passive mixed content was found at the specified url. |
| virtual void PassiveInsecureContentFound(const GURL& resource_url) {} |
| |
| // Checks if running of active mixed content is allowed in the current tab. |
| virtual bool ShouldAllowRunningInsecureContent(bool allowed_per_prefs, |
| const url::Origin& origin, |
| const GURL& resource_url); |
| |
| // Opens a new view-source tab for the last committed document in |frame|. |
| virtual void ViewSource(RenderFrameHostImpl* frame) {} |
| |
| #if BUILDFLAG(IS_ANDROID) |
| virtual base::android::ScopedJavaLocalRef<jobject> |
| GetJavaRenderFrameHostDelegate(); |
| #endif |
| |
| // Notified that the render finished loading a subresource for the frame |
| // associated with |render_frame_host|. |
| virtual void ResourceLoadComplete( |
| RenderFrameHostImpl* render_frame_host, |
| const GlobalRequestID& request_id, |
| blink::mojom::ResourceLoadInfoPtr resource_load_info) {} |
| |
| // Request to print a frame that is in a different process than its parent. |
| virtual void PrintCrossProcessSubframe( |
| const gfx::Rect& rect, |
| int document_cookie, |
| RenderFrameHostImpl* render_frame_host) {} |
| |
| // Request to paint preview a frame that is in a different process that its |
| // parent. |
| virtual void CapturePaintPreviewOfCrossProcessSubframe( |
| const gfx::Rect& rect, |
| const base::UnguessableToken& guid, |
| RenderFrameHostImpl* render_frame_host) {} |
| |
| // Returns a copy of the current WebPreferences associated with this |
| // RenderFrameHost's WebContents. If it does not exist, this will create one |
| // and send the newly computed value to all renderers. |
| // Note that this will not trigger a recomputation of WebPreferences if it |
| // already exists - this will return the last computed/set value of |
| // WebPreferences. If we want to guarantee that the value reflects the current |
| // state of the WebContents, NotifyPreferencesChanged() should be called |
| // before calling this. |
| virtual const blink::web_pref::WebPreferences& |
| GetOrCreateWebPreferences() = 0; |
| |
| // Returns the light, dark and forced color maps for the ColorProvider |
| // associated with this RenderFrameHost's WebContents. |
| virtual blink::ColorProviderColorMaps GetColorProviderColorMaps() const = 0; |
| |
| // Returns the visibility of the delegate. |
| virtual Visibility GetVisibility(); |
| |
| // Notify observers if WebAudio AudioContext has started (or stopped) playing |
| // audible sounds. |
| virtual void AudioContextPlaybackStarted(RenderFrameHostImpl* host, |
| int context_id) {} |
| virtual void AudioContextPlaybackStopped(RenderFrameHostImpl* host, |
| int context_id) {} |
| |
| // Notifies observers if the frame has changed audible state. |
| virtual void OnFrameAudioStateChanged(RenderFrameHostImpl* host, |
| bool is_audible) {} |
| |
| // Notifies observers if a remote subframe's intersection with the viewport |
| // has changed. |
| // |
| // Note: This is only called for remote frames. If you only care about if the |
| // frame intersects or not with the viewport, use OnFrameVisibilityChanged() |
| // below, as it is called for all frames. |
| virtual void OnRemoteSubframeViewportIntersectionStateChanged( |
| RenderFrameHostImpl* host, |
| const blink::mojom::ViewportIntersectionState& |
| viewport_intersection_state) {} |
| |
| // Notifies observers that the frame's visibility has changed. |
| virtual void OnFrameVisibilityChanged( |
| RenderFrameHostImpl* host, |
| blink::mojom::FrameVisibility visibility) {} |
| |
| // Notifies observers if the frame has started/stopped capturing a media |
| // stream (audio or video). |
| virtual void OnFrameIsCapturingMediaStreamChanged( |
| RenderFrameHostImpl* host, |
| bool is_capturing_media_stream) {} |
| |
| // Returns FrameTreeNodes that are logically owned by another frame even |
| // though this relationship is not yet reflected in their frame trees. This |
| // can happen, for example, with unattached guests. |
| virtual std::vector<FrameTreeNode*> GetUnattachedOwnedNodes( |
| RenderFrameHostImpl* owner); |
| |
| // Registers a new URL handler for the given protocol. |
| virtual void RegisterProtocolHandler(RenderFrameHostImpl* host, |
| const std::string& scheme, |
| const GURL& url, |
| bool user_gesture) {} |
| |
| // Unregisters a given URL handler for the given protocol. |
| virtual void UnregisterProtocolHandler(RenderFrameHostImpl* host, |
| const std::string& scheme, |
| const GURL& url, |
| bool user_gesture) {} |
| |
| // Returns true if the delegate allows to go to the session history entry at |
| // the given offset (ie, -1 will return the "back" item). |
| virtual bool IsAllowedToGoToEntryAtOffset(int32_t offset); |
| |
| // Determines if a clipboard paste using |data| of type |data_type| is allowed |
| // in this renderer frame. Possible data types supported for paste can be |
| // seen in the ClipboardHostImpl class. Text based formats will use the |
| // data_type ui::ClipboardFormatType::PlainTextType() unless it is known |
| // to be of a more specific type, like RTF or HTML, in which case a type |
| // such as ui::ClipboardFormatType::RtfType() or |
| // ui::ClipboardFormatType::HtmlType() is used. |
| // |
| // It is also possible for the data type to be |
| // ui::ClipboardFormatType::DataTransferCustomType() indicating that the paste |
| // uses a custom data format. It is up to the implementation to attempt to |
| // understand the type if possible. It is acceptable to deny pastes of |
| // unknown data types. |
| // |
| // The implementation is expected to show UX to the user if needed. If |
| // shown, the UX should be associated with the specific RenderFrameHost. |
| // |
| // The callback is called, possibly asynchronously, with a status indicating |
| // whether the operation is allowed or not. |
| virtual void IsClipboardPasteAllowedByPolicy( |
| const ClipboardEndpoint& source, |
| const ClipboardEndpoint& destination, |
| const ClipboardMetadata& metadata, |
| ClipboardPasteData clipboard_paste_data, |
| IsClipboardPasteAllowedCallback callback); |
| |
| // Notifies the delegate that `copied_text` has been |
| // copied to the clipboard from the `render_frame_host`. |
| virtual void OnTextCopiedToClipboard(RenderFrameHostImpl* render_frame_host, |
| const std::u16string& copied_text) {} |
| |
| // Allows embedder to override the clipboard types if a policy has inspected |
| // or modified the clipboard content. Called from |
| // `ClipboardHostImpl::ReadAvailableTypes()` by the browser process when a |
| // renderer needs to read available formats. Returns `std::nullopt` if there |
| // is no override for the current clipboard state. |
| virtual std::optional<std::vector<std::u16string>> |
| GetClipboardTypesIfPolicyApplied( |
| const ui::ClipboardSequenceNumberToken& seqno); |
| |
| // Notified when the main frame of `source` adjusts the page scale. |
| virtual void OnPageScaleFactorChanged(PageImpl& source) {} |
| |
| // Binds a ScreenOrientation object associated to |render_frame_host|. |
| virtual void BindScreenOrientation( |
| RenderFrameHost* render_frame_host, |
| mojo::PendingAssociatedReceiver<device::mojom::ScreenOrientation> |
| receiver) {} |
| |
| // Return whether HTML Fullscreen requires transient activation. |
| virtual bool IsTransientActivationRequiredForHtmlFullscreen(); |
| |
| // Return true if the back forward cache is supported. This is not an |
| // indication that the cache will be used. |
| virtual bool IsBackForwardCacheSupported(); |
| |
| // The page is trying to open a new widget (e.g. a select popup). The |
| // widget should be created associated with the given |
| // |site_instance_group|, but it should not be shown yet. That should |
| // happen in response to ShowCreatedWidget. |
| virtual RenderWidgetHostImpl* CreateNewPopupWidget( |
| base::SafeRef<SiteInstanceGroup> site_instance_group, |
| int32_t route_id, |
| mojo::PendingAssociatedReceiver<blink::mojom::PopupWidgetHost> |
| blink_popup_widget_host, |
| mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> |
| blink_widget_host, |
| mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget); |
| |
| virtual void DidLoadResourceFromMemoryCache( |
| RenderFrameHostImpl* source, |
| const GURL& url, |
| const std::string& http_request, |
| const std::string& mime_type, |
| network::mojom::RequestDestination request_destination, |
| bool include_credentials) {} |
| |
| // Called when the renderer sends a response via DomAutomationController. |
| // For example, `window.domAutomationController.send(foo())` sends the result |
| // of foo() here. |
| virtual void DomOperationResponse(RenderFrameHost* render_frame_host, |
| const std::string& json_string) {} |
| |
| virtual void OnCookiesAccessed(RenderFrameHostImpl* render_frame_host, |
| const CookieAccessDetails& details) {} |
| |
| virtual void OnTrustTokensAccessed(RenderFrameHostImpl* render_frame_host, |
| const TrustTokenAccessDetails& details) {} |
| virtual void OnSharedDictionaryAccessed( |
| RenderFrameHostImpl* render_frame_host, |
| const network::mojom::SharedDictionaryAccessDetails& details) {} |
| virtual void OnDeviceBoundSessionAccessed( |
| RenderFrameHostImpl* render_frame_host, |
| const net::device_bound_sessions::SessionAccess& access) {} |
| |
| virtual void NotifyStorageAccessed( |
| RenderFrameHostImpl* render_frame_host, |
| blink::mojom::StorageTypeAccessed storage_type, |
| bool blocked) {} |
| virtual void OnVibrate(RenderFrameHostImpl* render_frame_host) {} |
| |
| // Notified that the renderer responded after calling GetSavableResourceLinks. |
| virtual void SavableResourceLinksResponse( |
| RenderFrameHostImpl* source, |
| const std::vector<GURL>& resources_list, |
| blink::mojom::ReferrerPtr referrer, |
| const std::vector<blink::mojom::SavableSubframePtr>& subframes) {} |
| |
| // Notified that the renderer returned an error after calling |
| // GetSavableResourceLinks in case the frame contains non-savable content |
| // (i.e. from a non-savable scheme) or if there were errors gathering the |
| // links. |
| virtual void SavableResourceLinksError(RenderFrameHostImpl* source) {} |
| |
| // Called when |RenderFrameHost::GetLifecycleState()| changes i.e., |
| // when RenderFrameHost LifecycleState changes from old_state to |
| // new_state. |
| virtual void RenderFrameHostStateChanged( |
| RenderFrameHost* host, |
| RenderFrameHost::LifecycleState old_state, |
| RenderFrameHost::LifecycleState new_state) {} |
| |
| // The page is trying to move the main frame's representation in the client. |
| virtual void SetWindowRect(const gfx::Rect& new_bounds) {} |
| |
| // The page's preferred size changed. |
| virtual void UpdateWindowPreferredSize(RenderFrameHostImpl* render_frame_host, |
| const gfx::Size& pref_size) {} |
| |
| // Returns the list of top-level RenderFrameHosts hosting active documents |
| // that belong to the same browsing context group as `render_frame_host`. |
| virtual std::vector<RenderFrameHostImpl*> |
| GetActiveTopLevelDocumentsInBrowsingContextGroup( |
| RenderFrameHostImpl* render_frame_host); |
| |
| // Returns the PrerenderHostRegistry to start/cancel prerendering. This |
| // doesn't return nullptr except for some tests. |
| virtual PrerenderHostRegistry* GetPrerenderHostRegistry(); |
| |
| // The load progress for the main frame was changed. |
| virtual void DidChangeLoadProgressForMainFrame(RenderFrameHostImpl* source) {} |
| |
| // Document load in |render_frame_host| failed. |
| virtual void DidFailLoadWithError(RenderFrameHostImpl* render_frame_host, |
| const GURL& url, |
| int error_code) {} |
| |
| // Called by the main frame to close the current tab/window. |
| virtual void Close(RenderFrameHostImpl* render_frame_host) {} |
| |
| // True if the delegate is currently showing a JavaScript dialog. |
| virtual bool IsJavaScriptDialogShowing() const; |
| |
| // If a timer for an unresponsive renderer fires, whether it should be |
| // ignored. |
| virtual bool ShouldIgnoreUnresponsiveRenderer(); |
| |
| // Returns the base permissions policy that should be applied to the Isolated |
| // Web App running in the given RenderFrameHostImpl. If std::nullopt is |
| // returned the default non-isolated permissions policy will be applied. |
| virtual std::optional<network::ParsedPermissionsPolicy> |
| GetPermissionsPolicyForIsolatedWebApp(RenderFrameHostImpl* source); |
| |
| // Updates the draggable regions defined by the app-region CSS property. |
| virtual void DraggableRegionsChanged( |
| const std::vector<blink::mojom::DraggableRegionPtr>& regions) {} |
| |
| // Whether the containing window was initially opened as a new popup. |
| virtual bool IsPopup() const; |
| |
| // Returns true if `this` is a partitioned popin. If you are calling this to |
| // check if a `RenderFrameHost` should be partitioned due to being in a popin, |
| // check `ShouldPartitionAsPopin` on that host instead. |
| // See https://explainers-by-googlers.github.io/partitioned-popins/ |
| virtual bool IsPartitionedPopin() const; |
| |
| // If this window is a partitioned popin then this returns the properties |
| // struct, otherwise this function CHECKs. |
| // See https://explainers-by-googlers.github.io/partitioned-popins/ |
| virtual const PartitionedPopinOpenerProperties& |
| GetPartitionedPopinOpenerProperties() const; |
| |
| // Each window can have at most one open partitioned popin, and this will be a |
| // pointer to it. If this is set `IsPartitionedPopin` must return false as |
| // no popin can open a popin. |
| // See https://explainers-by-googlers.github.io/partitioned-popins/ |
| virtual WebContents* GetOpenedPartitionedPopin() const; |
| |
| // Called when a first contentful paint happened in the primary main frame. |
| virtual void OnFirstContentfulPaintInPrimaryMainFrame() {} |
| |
| // Returns the top-level native window for the associated WebContents. |
| virtual gfx::NativeWindow GetOwnerNativeWindow(); |
| |
| // Gets the delegate auto picture in picture information. |
| virtual media::PictureInPictureEventsInfo::AutoPipInfo GetAutoPipInfo() const; |
| |
| // Invoked when a fetch keepalive request is created in a RenderFrameHost. |
| // |
| // Note that such request is usually initiated from corresponding renderer |
| // process. This method just captures the time when the request is proxied in |
| // the browser process. |
| // |
| // `resource_request` is the fetch keepalive request that is created. |
| // `initiator_rfh` is the RenderFrameHostImpl that initiates the request. |
| virtual void OnKeepAliveRequestCreated( |
| const network::ResourceRequest& resource_request, |
| RenderFrameHostImpl* initiator_rfh) {} |
| |
| protected: |
| virtual ~RenderFrameHostDelegate() = default; |
| }; |
| |
| } // namespace content |
| |
| #endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_FRAME_HOST_DELEGATE_H_ |