blob: e56c366330a0512dbcc2a35a164017291224cd30 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_LOCAL_FRAME_MOJO_HANDLER_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_LOCAL_FRAME_MOJO_HANDLER_H_
#include "build/build_config.h"
#include "components/viz/common/navigation_id.h"
#include "third_party/blink/public/mojom/device_posture/device_posture_provider.mojom-blink.h"
#include "third_party/blink/public/mojom/frame/back_forward_cache_controller.mojom-blink.h"
#include "third_party/blink/public/mojom/frame/frame.mojom-blink.h"
#include "third_party/blink/public/mojom/frame/fullscreen.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/media/fullscreen_video_element.mojom-blink.h"
#include "third_party/blink/public/mojom/reporting/reporting.mojom-blink.h"
#include "third_party/blink/public/mojom/timing/resource_timing.mojom-blink-forward.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/heap/persistent.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_associated_receiver.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_associated_remote.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#if BUILDFLAG(IS_MAC)
#include "third_party/blink/public/mojom/input/text_input_host.mojom-blink.h"
#endif
namespace blink {
class Document;
class LocalDOMWindow;
class LocalFrame;
class Page;
// LocalFrameMojoHandler is a part of LocalFrame, and is responsible for having
// Mojo-related stuff in order to avoid including full mojom headers from
// local_frame.h.
//
// This class should have:
// - Mojo receivers
// - Mojo remotes
// - Data members of which types are defined by mojom.
//
// A single LocalFrame instance owns a single LocalFrameMojoHandler instance.
class LocalFrameMojoHandler
: public GarbageCollected<LocalFrameMojoHandler>,
public mojom::blink::LocalFrame,
public mojom::blink::LocalMainFrame,
public mojom::blink::FullscreenVideoElementHandler,
public mojom::blink::DevicePostureClient {
public:
explicit LocalFrameMojoHandler(blink::LocalFrame& frame);
void Trace(Visitor* visitor) const;
void WasAttachedAsLocalMainFrame();
void DidDetachFrame();
void ClosePageForTesting();
mojom::blink::LocalFrameHost& LocalFrameHostRemote() {
return *local_frame_host_remote_.get();
}
mojom::blink::NonAssociatedLocalFrameHost&
NonAssociatedLocalFrameHostRemote() {
return *non_associated_local_frame_host_remote_.get();
}
mojom::blink::ReportingServiceProxy* ReportingService();
mojom::blink::DevicePostureProvider* DevicePostureProvider();
mojom::blink::BackForwardCacheControllerHost&
BackForwardCacheControllerHostRemote();
#if BUILDFLAG(IS_MAC)
mojom::blink::TextInputHost& TextInputHost();
void ResetTextInputHostForTesting();
void RebindTextInputHostForTesting();
#endif
mojom::blink::DevicePostureType GetDevicePosture();
void OverrideDevicePostureForEmulation(
mojom::blink::DevicePostureType device_posture_param);
void DisableDevicePostureOverrideForEmulation();
private:
Page* GetPage() const;
LocalDOMWindow* DomWindow() const;
Document* GetDocument() const;
void BindToLocalFrameReceiver(
mojo::PendingAssociatedReceiver<mojom::blink::LocalFrame> receiver);
void BindToMainFrameReceiver(
mojo::PendingAssociatedReceiver<mojom::blink::LocalMainFrame> receiver);
void BindFullscreenVideoElementReceiver(
mojo::PendingAssociatedReceiver<
mojom::blink::FullscreenVideoElementHandler> receiver);
// blink::mojom::LocalFrame overrides:
void GetTextSurroundingSelection(
uint32_t max_length,
GetTextSurroundingSelectionCallback callback) final;
void SendInterventionReport(const String& id, const String& message) final;
void SetFrameOwnerProperties(
mojom::blink::FrameOwnerPropertiesPtr properties) final;
void NotifyUserActivation(
mojom::blink::UserActivationNotificationType notification_type) final;
void NotifyVirtualKeyboardOverlayRect(const gfx::Rect& keyboard_rect) final;
void AddMessageToConsole(mojom::blink::ConsoleMessageLevel level,
const WTF::String& message,
bool discard_duplicates) final;
void SwapInImmediately() final;
void CheckCompleted() final;
void StopLoading() final;
void Collapse(bool collapsed) final;
void EnableViewSourceMode() final;
void Focus() final;
void ClearFocusedElement() final;
void CopyImageAt(const gfx::Point& window_point) final;
void SaveImageAt(const gfx::Point& window_point) final;
void ReportBlinkFeatureUsage(const Vector<mojom::blink::WebFeature>&) final;
void RenderFallbackContent() final;
void BeforeUnload(bool is_reload, BeforeUnloadCallback callback) final;
void MediaPlayerActionAt(const gfx::Point& window_point,
mojom::blink::MediaPlayerActionPtr action) final;
void RequestVideoFrameAt(const gfx::Point& window_point,
const gfx::Size& max_size,
int max_area,
RequestVideoFrameAtCallback callback) final;
void AdvanceFocusInFrame(
mojom::blink::FocusType focus_type,
const std::optional<RemoteFrameToken>& source_frame_token) final;
void AdvanceFocusForIME(mojom::blink::FocusType focus_type) final;
void ReportContentSecurityPolicyViolation(
network::mojom::blink::CSPViolationPtr csp_violation) final;
// Updates the snapshotted policy attributes (sandbox flags and permissions
// policy container policy) in the frame's FrameOwner. This is used when this
// frame's parent is in another process and it dynamically updates this
// frame's sandbox flags or container policy. The new policy won't take effect
// until the next navigation.
void DidUpdateFramePolicy(const FramePolicy& frame_policy) final;
void PostMessageEvent(
const std::optional<RemoteFrameToken>& source_frame_token,
const String& source_origin,
const String& target_origin,
BlinkTransferableMessage message) final;
void JavaScriptMethodExecuteRequest(
const String& object_name,
const String& method_name,
base::Value::List arguments,
bool wants_result,
JavaScriptMethodExecuteRequestCallback callback) final;
void JavaScriptExecuteRequest(
const String& javascript,
bool wants_result,
JavaScriptExecuteRequestCallback callback) final;
void JavaScriptExecuteRequestForTests(
const String& javascript,
bool has_user_gesture,
bool resolve_promises,
int32_t world_id,
JavaScriptExecuteRequestForTestsCallback callback) final;
void JavaScriptExecuteRequestInIsolatedWorld(
const String& javascript,
bool wants_result,
int32_t world_id,
JavaScriptExecuteRequestInIsolatedWorldCallback callback) final;
#if BUILDFLAG(IS_MAC)
void GetCharacterIndexAtPoint(const gfx::Point& point) final;
void GetFirstRectForRange(const gfx::Range& range) final;
void GetStringForRange(const gfx::Range& range,
GetStringForRangeCallback callback) final;
#endif
void BindReportingObserver(
mojo::PendingReceiver<mojom::blink::ReportingObserver> receiver) final;
void UpdateOpener(
const std::optional<blink::FrameToken>& opener_routing_id) final;
void GetSavableResourceLinks(GetSavableResourceLinksCallback callback) final;
void MixedContentFound(
const KURL& main_resource_url,
const KURL& mixed_content_url,
mojom::blink::RequestContextType request_context,
bool was_allowed,
const KURL& url_before_redirects,
bool had_redirect,
network::mojom::blink::SourceLocationPtr source_location) final;
void BindDevToolsAgent(
mojo::PendingAssociatedRemote<mojom::blink::DevToolsAgentHost> host,
mojo::PendingAssociatedReceiver<mojom::blink::DevToolsAgent> receiver)
final;
#if BUILDFLAG(IS_ANDROID)
void ExtractSmartClipData(const gfx::Rect& rect,
ExtractSmartClipDataCallback callback) final;
#endif
void HandleRendererDebugURL(const KURL& url) final;
void GetCanonicalUrlForSharing(
GetCanonicalUrlForSharingCallback callback) final;
void GetOpenGraphMetadata(GetOpenGraphMetadataCallback callback) final;
void SetNavigationApiHistoryEntriesForRestore(
mojom::blink::NavigationApiHistoryEntryArraysPtr,
mojom::blink::NavigationApiEntryRestoreReason) final;
void NotifyNavigationApiOfDisposedEntries(
const WTF::Vector<WTF::String>&) final;
void TraverseCancelled(const String& navigation_api_key,
mojom::blink::TraverseCancelledReason reason) final;
void DispatchNavigateEventForCrossDocumentTraversal(
const KURL&,
const std::string& page_state,
bool is_browser_initiated) final;
void SnapshotDocumentForViewTransition(
const viz::NavigationId& navigation_id,
mojom::blink::PageSwapEventParamsPtr,
SnapshotDocumentForViewTransitionCallback callback) final;
void NotifyViewTransitionAbortedToOldDocument() final;
void DispatchPageSwap(mojom::blink::PageSwapEventParamsPtr) final;
void AddResourceTimingEntryForFailedSubframeNavigation(
const FrameToken& subframe_token,
const KURL& initial_url,
base::TimeTicks start_time,
base::TimeTicks redirect_time,
base::TimeTicks request_start,
base::TimeTicks response_start,
uint32_t response_code,
const WTF::String& mime_type,
network::mojom::blink::LoadTimingInfoPtr load_timing_info,
net::HttpConnectionInfo connection_info,
const WTF::String& alpn_negotiated_protocol,
bool is_secure_transport,
bool is_validated,
const WTF::String& normalized_server_timing,
const ::network::URLLoaderCompletionStatus& completion_status) final;
void RequestFullscreenDocumentElement() final;
// blink::mojom::LocalMainFrame overrides:
void AnimateDoubleTapZoom(const gfx::Point& point,
const gfx::Rect& rect) override;
void SetScaleFactor(float scale) override;
void ClosePage(
mojom::blink::LocalMainFrame::ClosePageCallback callback) override;
void GetFullPageSize(
mojom::blink::LocalMainFrame::GetFullPageSizeCallback callback) override;
void PluginActionAt(const gfx::Point& location,
mojom::blink::PluginActionType action) override;
void SetInitialFocus(bool reverse) override;
void EnablePreferredSizeChangedMode() override;
void ZoomToFindInPageRect(const gfx::Rect& rect_in_root_frame) override;
void InstallCoopAccessMonitor(
const FrameToken& accessed_window,
network::mojom::blink::CrossOriginOpenerPolicyReporterParamsPtr
coop_reporter_params,
bool is_in_same_virtual_coop_related_group) final;
void UpdateBrowserControlsState(cc::BrowserControlsState constraints,
cc::BrowserControlsState current,
bool animate) override;
void SetV8CompileHints(base::ReadOnlySharedMemoryRegion data) override;
// mojom::FullscreenVideoElementHandler implementation:
void RequestFullscreenVideoElement() final;
// DevicePostureClient implementation:
void OnPostureChanged(mojom::blink::DevicePostureType posture) final;
Member<blink::LocalFrame> frame_;
HeapMojoAssociatedRemote<mojom::blink::BackForwardCacheControllerHost>
back_forward_cache_controller_host_remote_{nullptr};
#if BUILDFLAG(IS_MAC)
HeapMojoRemote<mojom::blink::TextInputHost> text_input_host_{nullptr};
#endif
HeapMojoRemote<mojom::blink::ReportingServiceProxy> reporting_service_{
nullptr};
// Device posture fields should only be used, e.g. non-null, on local roots.
HeapMojoRemote<mojom::blink::DevicePostureProvider>
device_posture_provider_service_{nullptr};
// LocalFrameMojoHandler can be reused by multiple ExecutionContext.
HeapMojoReceiver<mojom::blink::DevicePostureClient, LocalFrameMojoHandler>
device_posture_receiver_{this, nullptr};
mojom::blink::DevicePostureType current_device_posture_ =
mojom::blink::DevicePostureType::kContinuous;
HeapMojoAssociatedRemote<mojom::blink::LocalFrameHost>
local_frame_host_remote_{nullptr};
HeapMojoRemote<mojom::blink::NonAssociatedLocalFrameHost>
non_associated_local_frame_host_remote_{nullptr};
// LocalFrameMojoHandler can be reused by multiple ExecutionContext.
HeapMojoAssociatedReceiver<mojom::blink::LocalFrame, LocalFrameMojoHandler>
local_frame_receiver_{this, nullptr};
// LocalFrameMojoHandler can be reused by multiple ExecutionContext.
HeapMojoAssociatedReceiver<mojom::blink::LocalMainFrame,
LocalFrameMojoHandler>
main_frame_receiver_{this, nullptr};
// LocalFrameMojoHandler can be reused by multiple ExecutionContext.
HeapMojoAssociatedReceiver<mojom::blink::FullscreenVideoElementHandler,
LocalFrameMojoHandler>
fullscreen_video_receiver_{this, nullptr};
};
class ActiveURLMessageFilter : public mojo::MessageFilter {
public:
explicit ActiveURLMessageFilter(LocalFrame* local_frame)
: local_frame_(local_frame) {}
~ActiveURLMessageFilter() override;
// mojo::MessageFilter overrides.
bool WillDispatch(mojo::Message* message) override;
void DidDispatchOrReject(mojo::Message* message, bool accepted) override;
private:
WeakPersistent<LocalFrame> local_frame_;
bool debug_url_set_ = false;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_LOCAL_FRAME_MOJO_HANDLER_H_