#ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_IMPL_H_
#define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_IMPL_H_
#include <stddef.h>
#include <stdint.h>
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/callback_list.h"
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
#include "base/functional/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "base/memory/safe_ref.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/process/kill.h"
#include "base/scoped_observation_traits.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "build/build_config.h"
#include "cc/mojom/render_frame_metadata.mojom.h"
#include "components/power_scheduler/power_mode_voter.h"
#include "components/viz/common/surfaces/frame_sink_id.h"
#include "content/browser/renderer_host/agent_scheduling_group_host.h"
#include "content/browser/renderer_host/event_with_latency_info.h"
#include "content/browser/renderer_host/frame_token_message_queue.h"
#include "content/browser/renderer_host/input/input_disposition_handler.h"
#include "content/browser/renderer_host/input/input_router_impl.h"
#include "content/browser/renderer_host/input/render_widget_host_latency_tracker.h"
#include "content/browser/renderer_host/input/synthetic_gesture.h"
#include "content/browser/renderer_host/input/synthetic_gesture_controller.h"
#include "content/browser/renderer_host/input/touch_emulator_client.h"
#include "content/browser/renderer_host/render_frame_metadata_provider_impl.h"
#include "content/browser/renderer_host/render_widget_host_delegate.h"
#include "content/browser/renderer_host/render_widget_host_view_base.h"
#include "content/browser/scheduler/browser_ui_thread_scheduler.h"
#include "content/common/content_export.h"
#include "content/common/frame.mojom-forward.h"
#include "content/public/browser/render_process_host_observer.h"
#include "content/public/browser/render_process_host_priority_client.h"
#include "content/public/browser/render_widget_host.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/viz/public/mojom/compositing/compositor_frame_sink.mojom-forward.h"
#include "services/viz/public/mojom/hit_test/input_target_client.mojom.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/public/mojom/input/input_event_result.mojom-shared.h"
#include "third_party/blink/public/mojom/input/input_handler.mojom-forward.h"
#include "third_party/blink/public/mojom/input/input_handler.mojom.h"
#include "third_party/blink/public/mojom/input/pointer_lock_context.mojom.h"
#include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
#include "third_party/blink/public/mojom/page/widget.mojom.h"
#include "third_party/blink/public/mojom/widget/platform_widget.mojom.h"
#include "third_party/blink/public/mojom/widget/record_content_to_visible_time_request.mojom-forward.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-forward.h"
#include "ui/base/ime/text_input_mode.h"
#include "ui/base/ime/text_input_type.h"
#include "ui/base/ui_base_types.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/latency/latency_info.h"
#if BUILDFLAG(IS_ANDROID)
#include "content/public/browser/android/child_process_importance.h"
#endif
#if BUILDFLAG(IS_MAC)
#include "services/device/public/mojom/wake_lock.mojom.h"
#endif
class SkBitmap;
namespace blink {
class WebInputEvent;
class WebMouseEvent;
}
namespace gfx {
class Image;
class Range;
class Vector2dF;
}
namespace ui {
enum class DomCode;
}
namespace content {
class BrowserAccessibilityManager;
class FlingSchedulerBase;
class FrameTree;
class InputRouter;
class MockRenderWidgetHost;
class PeakGpuMemoryTracker;
class RenderWidgetHostOwnerDelegate;
class SiteInstanceGroup;
class SyntheticGestureController;
class TimeoutMonitor;
class TouchEmulator;
class VisibleTimeRequestTrigger;
class CONTENT_EXPORT RenderWidgetHostImpl
: public RenderWidgetHost,
public FrameTokenMessageQueue::Client,
public InputRouterImplClient,
public InputDispositionHandler,
public RenderProcessHostObserver,
public RenderProcessHostPriorityClient,
public SyntheticGestureController::Delegate,
public RenderFrameMetadataProvider::Observer,
public blink::mojom::FrameWidgetHost,
public blink::mojom::PopupWidgetHost,
public blink::mojom::WidgetHost,
public blink::mojom::PointerLockContext {
public:
static std::unique_ptr<RenderWidgetHostImpl> Create(
FrameTree* frame_tree,
RenderWidgetHostDelegate* delegate,
base::SafeRef<SiteInstanceGroup> site_instance_group,
int32_t routing_id,
bool hidden,
bool renderer_initiated_creation,
std::unique_ptr<FrameTokenMessageQueue> frame_token_message_queue);
static RenderWidgetHostImpl* CreateSelfOwned(
FrameTree* frame_tree,
RenderWidgetHostDelegate* delegate,
base::SafeRef<SiteInstanceGroup> site_instance_group,
int32_t routing_id,
bool hidden,
std::unique_ptr<FrameTokenMessageQueue> frame_token_message_queue);
RenderWidgetHostImpl(const RenderWidgetHostImpl&) = delete;
RenderWidgetHostImpl& operator=(const RenderWidgetHostImpl&) = delete;
~RenderWidgetHostImpl() override;
static RenderWidgetHostImpl* FromID(int32_t process_id, int32_t routing_id);
static std::unique_ptr<RenderWidgetHostIterator> GetAllRenderWidgetHosts();
static RenderWidgetHostImpl* From(RenderWidgetHost* rwh);
FrameTree* frame_tree() const { return frame_tree_; }
void SetFrameTree(FrameTree& frame_tree) { frame_tree_ = &frame_tree; }
void set_new_content_rendering_delay_for_testing(
const base::TimeDelta& delay) {
new_content_rendering_delay_ = delay;
}
base::TimeDelta new_content_rendering_delay() {
return new_content_rendering_delay_;
}
void set_owner_delegate(RenderWidgetHostOwnerDelegate* owner_delegate) {
owner_delegate_ = owner_delegate;
}
RenderWidgetHostOwnerDelegate* owner_delegate() { return owner_delegate_; }
AgentSchedulingGroupHost& agent_scheduling_group() {
return *agent_scheduling_group_;
}
VisibleTimeRequestTrigger& GetVisibleTimeRequestTrigger();
const viz::FrameSinkId& GetFrameSinkId() override;
void UpdateTextDirection(base::i18n::TextDirection direction) override;
void NotifyTextDirection() override;
void Focus() override;
void Blur() override;
void FlushForTesting() override;
void SetActive(bool active) override;
void ForwardMouseEvent(const blink::WebMouseEvent& mouse_event) override;
void ForwardWheelEvent(const blink::WebMouseWheelEvent& wheel_event) override;
void ForwardKeyboardEvent(const NativeWebKeyboardEvent& key_event) override;
void ForwardGestureEvent(
const blink::WebGestureEvent& gesture_event) override;
RenderProcessHost* GetProcess() override;
int GetRoutingID() final;
RenderWidgetHostViewBase* GetView() override;
bool IsCurrentlyUnresponsive() override;
bool SynchronizeVisualProperties() override;
void AddKeyPressEventCallback(const KeyPressEventCallback& callback) override;
void RemoveKeyPressEventCallback(
const KeyPressEventCallback& callback) override;
void AddMouseEventCallback(const MouseEventCallback& callback) override;
void RemoveMouseEventCallback(const MouseEventCallback& callback) override;
void AddSuppressShowingImeCallback(
const SuppressShowingImeCallback& callback) override;
void RemoveSuppressShowingImeCallback(
const SuppressShowingImeCallback& callback) override;
void AddInputEventObserver(
RenderWidgetHost::InputEventObserver* observer) override;
void RemoveInputEventObserver(
RenderWidgetHost::InputEventObserver* observer) override;
void AddObserver(RenderWidgetHostObserver* observer) override;
void RemoveObserver(RenderWidgetHostObserver* observer) override;
display::ScreenInfo GetScreenInfo() const override;
display::ScreenInfos GetScreenInfos() const override;
float GetDeviceScaleFactor() override;
absl::optional<cc::TouchAction> GetAllowedTouchAction() override;
void WriteIntoTrace(perfetto::TracedValue context) override;
using DragOperationCallback =
base::OnceCallback<void(::ui::mojom::DragOperation)>;
void DragTargetDragEnter(const DropData& drop_data,
const gfx::PointF& client_pt,
const gfx::PointF& screen_pt,
blink::DragOperationsMask operations_allowed,
int key_modifiers,
DragOperationCallback callback) override;
void DragTargetDragEnterWithMetaData(
const std::vector<DropData::Metadata>& metadata,
const gfx::PointF& client_pt,
const gfx::PointF& screen_pt,
blink::DragOperationsMask operations_allowed,
int key_modifiers,
DragOperationCallback callback) override;
void DragTargetDragOver(const gfx::PointF& client_point,
const gfx::PointF& screen_point,
blink::DragOperationsMask operations_allowed,
int key_modifiers,
DragOperationCallback callback) override;
void DragTargetDragLeave(const gfx::PointF& client_point,
const gfx::PointF& screen_point) override;
void DragTargetDrop(const DropData& drop_data,
const gfx::PointF& client_point,
const gfx::PointF& screen_point,
int key_modifiers,
base::OnceClosure callback) override;
void DragSourceEndedAt(const gfx::PointF& client_pt,
const gfx::PointF& screen_pt,
ui::mojom::DragOperation operation,
base::OnceClosure callback) override;
void DragSourceSystemDragEnded() override;
void FilterDropData(DropData* drop_data) override;
void SetCursor(const ui::Cursor& cursor) override;
void ShowContextMenuAtPoint(const gfx::Point& point,
const ui::MenuSourceType source_type) override;
void InsertVisualStateCallback(VisualStateCallback callback) override;
RenderProcessHostPriorityClient::Priority GetPriority() override;
void RenderProcessExited(RenderProcessHost* host,
const ChildProcessTerminationInfo& info) override;
void UpdateTooltipUnderCursor(
const std::u16string& tooltip_text,
base::i18n::TextDirection text_direction_hint) override;
void UpdateTooltipFromKeyboard(const std::u16string& tooltip_text,
base::i18n::TextDirection text_direction_hint,
const gfx::Rect& bounds) override;
void ClearKeyboardTriggeredTooltip() override;
void TextInputStateChanged(ui::mojom::TextInputStatePtr state) override;
void SelectionBoundsChanged(const gfx::Rect& anchor_rect,
base::i18n::TextDirection anchor_dir,
const gfx::Rect& focus_rect,
base::i18n::TextDirection focus_dir,
const gfx::Rect& bounding_box,
bool is_anchor_first) override;
void CreateFrameSink(
mojo::PendingReceiver<viz::mojom::CompositorFrameSink>
compositor_frame_sink_receiver,
mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient>) override;
void RegisterRenderFrameMetadataObserver(
mojo::PendingReceiver<cc::mojom::RenderFrameMetadataObserverClient>
render_frame_metadata_observer_client_receiver,
mojo::PendingRemote<cc::mojom::RenderFrameMetadataObserver>
render_frame_metadata_observer) override;
void RequestClosePopup() override;
void ShowPopup(const gfx::Rect& initial_screen_rect,
const gfx::Rect& anchor_screen_rect,
ShowPopupCallback callback) override;
void SetPopupBounds(const gfx::Rect& bounds,
SetPopupBoundsCallback callback) override;
bool UpdateVisualProperties(bool propagate);
void NotifyScreenInfoChanged();
using GetSnapshotFromBrowserCallback =
base::OnceCallback<void(const gfx::Image&)>;
void GetSnapshotFromBrowser(GetSnapshotFromBrowserCallback callback,
bool from_surface);
void SetView(RenderWidgetHostViewBase* view);
RenderWidgetHostDelegate* delegate() const { return delegate_; }
void BindWidgetInterfaces(
mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> widget_host,
mojo::PendingAssociatedRemote<blink::mojom::Widget> widget);
void BindPopupWidgetInterface(
mojo::PendingAssociatedReceiver<blink::mojom::PopupWidgetHost>
popup_widget_host);
void BindFrameWidgetInterfaces(
mojo::PendingAssociatedReceiver<blink::mojom::FrameWidgetHost>
frame_widget_host,
mojo::PendingAssociatedRemote<blink::mojom::FrameWidget> frame_widget);
void RendererWidgetCreated(bool for_frame_widget);
void Init();
bool ShouldShowStaleContentOnEviction();
void SetFrameDepth(unsigned int depth);
void SetIntersectsViewport(bool intersects);
void UpdatePriority();
void ShutdownAndDestroyWidget(bool also_delete);
void SetIsLoading(bool is_loading);
void WasHidden();
void WasShown(blink::mojom::RecordContentToVisibleTimeRequestPtr
record_tab_switch_time_request);
void RequestSuccessfulPresentationTimeForNextFrame(
blink::mojom::RecordContentToVisibleTimeRequestPtr visible_time_request);
void CancelSuccessfulPresentationTimeRequest();
#if BUILDFLAG(IS_ANDROID)
void SetImportance(ChildProcessImportance importance);
ChildProcessImportance importance() const { return importance_; }
void AddImeInputEventObserver(
RenderWidgetHost::InputEventObserver* observer) override;
void RemoveImeInputEventObserver(
RenderWidgetHost::InputEventObserver* observer) override;
#endif
bool is_hidden() const { return is_hidden_; }
void GotFocus();
void LostFocus();
void LostCapture();
bool is_focused() const { return is_focused_; }
void SetPageFocus(bool focused);
bool is_active() const { return is_active_; }
void LostMouseLock();
void SendMouseLockLost();
bool is_last_unlocked_by_target() const {
return is_last_unlocked_by_target_;
}
void OnCursorVisibilityStateChanged(bool is_visible);
void ViewDestroyed();
bool is_in_touchscreen_gesture_scroll() const {
return is_in_gesture_scroll_[static_cast<int>(
blink::WebGestureDevice::kTouchscreen)];
}
bool visual_properties_ack_pending_for_testing() {
return visual_properties_ack_pending_;
}
bool RequestRepaintForTesting();
void DidNavigate();
void StartNewContentRenderingTimeout();
void ForwardKeyboardEventWithCommands(
const NativeWebKeyboardEvent& key_event,
const ui::LatencyInfo& latency,
std::vector<blink::mojom::EditCommandPtr> commands,
bool* update_event = nullptr);
void ForwardKeyboardEventWithLatencyInfo(
const NativeWebKeyboardEvent& key_event,
const ui::LatencyInfo& latency) override;
void ForwardGestureEventWithLatencyInfo(
const blink::WebGestureEvent& gesture_event,
const ui::LatencyInfo& latency) override;
virtual void ForwardTouchEventWithLatencyInfo(
const blink::WebTouchEvent& touch_event,
const ui::LatencyInfo& latency);
void ForwardMouseEventWithLatencyInfo(const blink::WebMouseEvent& mouse_event,
const ui::LatencyInfo& latency);
void ForwardWheelEventWithLatencyInfo(
const blink::WebMouseWheelEvent& wheel_event,
const ui::LatencyInfo& latency) override;
void WaitForInputProcessed(SyntheticGestureParams::GestureType type,
content::mojom::GestureSourceType source,
base::OnceClosure callback);
void WaitForInputProcessed(base::OnceClosure callback);
std::unique_ptr<RenderWidgetHostIterator> GetEmbeddedRenderWidgetHosts();
TouchEmulator* GetTouchEmulator();
void QueueSyntheticGesture(
std::unique_ptr<SyntheticGesture> synthetic_gesture,
base::OnceCallback<void(SyntheticGesture::Result)> on_complete);
void QueueSyntheticGestureCompleteImmediately(
std::unique_ptr<SyntheticGesture> synthetic_gesture);
void EnsureReadyForSyntheticGestures(base::OnceClosure on_ready);
void TakeSyntheticGestureController(RenderWidgetHostImpl* host);
void ImeSetComposition(const std::u16string& text,
const std::vector<ui::ImeTextSpan>& ime_text_spans,
const gfx::Range& replacement_range,
int selection_start,
int selection_end);
void ImeCommitText(const std::u16string& text,
const std::vector<ui::ImeTextSpan>& ime_text_spans,
const gfx::Range& replacement_range,
int relative_cursor_pos);
void ImeFinishComposingText(bool keep_selection);
void ImeCancelComposition();
bool IsIgnoringInputEvents() const;
bool GotResponseToLockMouseRequest(blink::mojom::PointerLockResult result);
void GotResponseToKeyboardLockRequest(bool allowed);
void GotResponseToForceRedraw(int snapshot_id);
void DetachDelegate();
void SendScreenRects();
bool auto_resize_enabled() { return auto_resize_enabled_; }
const gfx::Size& min_size_for_auto_resize() const {
return min_size_for_auto_resize_;
}
const gfx::Size& max_size_for_auto_resize() const {
return max_size_for_auto_resize_;
}
static void DisableResizeAckCheckForTesting();
InputRouter* input_router() { return input_router_.get(); }
void SetForceEnableZoom(bool);
BrowserAccessibilityManager* GetRootBrowserAccessibilityManager();
BrowserAccessibilityManager* GetOrCreateRootBrowserAccessibilityManager();
void RejectMouseLockOrUnlockIfNecessary(
blink::mojom::PointerLockResult reason);
void SetVisualPropertiesFromParentFrame(
float page_scale_factor,
float compositing_scale_factor,
bool is_pinch_gesture_active,
const gfx::Size& visible_viewport_size,
const gfx::Rect& compositor_viewport,
std::vector<gfx::Rect> root_widget_window_segments);
void SetAutoResize(bool enable,
const gfx::Size& min_size,
const gfx::Size& max_size);
blink::VisualProperties GetInitialVisualProperties();
bool SynchronizeVisualProperties(bool scroll_focused_node_into_view,
bool propagate = true);
bool SynchronizeVisualPropertiesIgnoringPendingAck();
void RendererExited();
void SelectionChanged(const std::u16string& text,
uint32_t offset,
const gfx::Range& range);
size_t in_flight_event_count() const { return in_flight_event_count_; }
bool renderer_initialized() const { return renderer_widget_created_; }
base::WeakPtr<RenderWidgetHostImpl> GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
void RequestCompositionUpdates(bool immediate_request, bool monitor_updates);
RenderFrameMetadataProviderImpl* render_frame_metadata_provider() {
return &render_frame_metadata_provider_;
}
bool HasGestureStopped() override;
void DidProcessFrame(uint32_t frame_token, base::TimeTicks activation_time);
mojo::Remote<viz::mojom::InputTargetClient>& input_target_client() {
return input_target_client_;
}
void SetInputTargetClientForTesting(
mojo::Remote<viz::mojom::InputTargetClient> input_target_client);
blink::mojom::WidgetInputHandler* GetWidgetInputHandler() override;
void OnImeCompositionRangeChanged(
const gfx::Range& range,
const std::vector<gfx::Rect>& character_bounds) override;
void OnImeCancelComposition() override;
RenderWidgetHostViewBase* GetRenderWidgetHostViewBase() override;
void OnStartStylusWriting() override;
bool IsWheelScrollInProgress() override;
bool IsAutoscrollInProgress() override;
void SetMouseCapture(bool capture) override;
void RequestMouseLock(
bool from_user_gesture,
bool unadjusted_movement,
InputRouterImpl::RequestMouseLockCallback response) override;
gfx::Size GetRootWidgetViewportSize() override;
void RequestMouseLockChange(
bool unadjusted_movement,
PointerLockContext::RequestMouseLockChangeCallback response) override;
void OnInvalidFrameToken(uint32_t frame_token) override;
void ProgressFlingIfNeeded(base::TimeTicks current_time);
void StopFling();
void SetCompositorForFlingScheduler(ui::Compositor* compositor);
#if BUILDFLAG(IS_OHOS)
ui::Compositor* GetCompositorForFlingScheduler() {
return fling_scheduler_->GetCompositor();
}
#endif
void ForceFirstFrameAfterNavigationTimeout();
void SetScreenOrientationForTesting(uint16_t angle,
display::mojom::ScreenOrientation type);
bool RequestKeyboardLock(absl::optional<base::flat_set<ui::DomCode>> codes);
void CancelKeyboardLock();
bool IsKeyboardLocked() const;
base::flat_map<std::string, std::string> GetKeyboardLayoutMap();
void RequestForceRedraw(int snapshot_id);
void DidStopFlinging();
bool IsContentRenderingTimeoutRunning() const;
void RendererIsUnresponsive(
base::RepeatingClosure restart_hang_monitor_timeout
#if defined(OHOS_RENDERER_ANR_DUMP)
,
content::RenderProcessNotRespondingReason reason
#endif
);
void RendererIsResponsive();
std::vector<viz::SurfaceId> CollectSurfaceIdsForEviction();
bool RemovePendingUserActivationIfAvailable();
const mojo::AssociatedRemote<blink::mojom::FrameWidget>&
GetAssociatedFrameWidget();
blink::mojom::FrameWidgetInputHandler* GetFrameWidgetInputHandler();
mojo::AssociatedReceiver<blink::mojom::FrameWidgetHost>&
frame_widget_host_receiver_for_testing() {
return blink_frame_widget_host_receiver_;
}
mojo::AssociatedReceiver<blink::mojom::PopupWidgetHost>&
popup_widget_host_receiver_for_testing() {
return blink_popup_widget_host_receiver_;
}
mojo::AssociatedReceiver<blink::mojom::WidgetHost>&
widget_host_receiver_for_testing() {
return blink_widget_host_receiver_;
}
absl::optional<blink::VisualProperties> LastComputedVisualProperties() const;
mojom::CreateFrameWidgetParamsPtr BindAndGenerateCreateFrameWidgetParams();
mojom::CreateFrameWidgetParamsPtr
BindAndGenerateCreateFrameWidgetParamsForNewWindow();
void OnRenderFrameMetadataChangedBeforeActivation(
const cc::RenderFrameMetadata& metadata) override;
void OnRenderFrameMetadataChangedAfterActivation(
base::TimeTicks activation_time) override;
void OnRenderFrameSubmission() override;
void OnLocalSurfaceIdChanged(
const cc::RenderFrameMetadata& metadata) override;
SiteInstanceGroup* GetSiteInstanceGroup();
void UpdateBrowserControlsState(cc::BrowserControlsState constraints,
cc::BrowserControlsState current,
bool animate);
#ifdef OHOS_EX_FREE_COPY
void GetWordSelection(const std::string& text,
int8_t offset,
GetWordSelectionCallback callback) override;
#endif
#ifdef OHOS_AI
void CreateOverlay(const SkBitmap& bitmap,
const gfx::Rect& image_rect,
const gfx::Point& touch_point) override;
gfx::Rect GetImageRect();
void OnTextSelected(bool flag);
void OnDestroyImageAnalyzerOverlay();
void OnFoldStatusChanged(uint32_t foldstatus);
void NotifyOverlayStateChanged();
void OnOverlayStateChanged(const gfx::Rect& image_rect) override;
#endif
protected:
RenderWidgetHostImpl(
FrameTree* frame_tree,
bool self_owned,
RenderWidgetHostDelegate* delegate,
base::SafeRef<SiteInstanceGroup> site_instance_group,
int32_t routing_id,
bool hidden,
bool renderer_initiated_creation,
std::unique_ptr<FrameTokenMessageQueue> frame_token_message_queue);
virtual void NotifyNewContentRenderingTimeoutForTesting() {}
void OnWheelEventAck(const MouseWheelEventWithLatencyInfo& event,
blink::mojom::InputEventResultSource ack_source,
blink::mojom::InputEventResultState ack_result) override;
void OnTouchEventAck(const TouchEventWithLatencyInfo& event,
blink::mojom::InputEventResultSource ack_source,
blink::mojom::InputEventResultState ack_result) override;
void OnGestureEventAck(
const GestureEventWithLatencyInfo& event,
blink::mojom::InputEventResultSource ack_source,
blink::mojom::InputEventResultState ack_result,
blink::mojom::ScrollResultDataPtr scroll_result_data) override;
virtual void OnMouseEventAck(const MouseEventWithLatencyInfo& event,
blink::mojom::InputEventResultSource ack_source,
blink::mojom::InputEventResultState ack_result);
bool IsMouseLocked() const;
base::WeakPtr<RenderWidgetHostViewBase> view_;
private:
FRIEND_TEST_ALL_PREFIXES(FullscreenDetectionTest,
EncompassingDivNotFullscreen);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
DoNotAcceptPopupBoundsUntilScreenRectsAcked);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
DontPostponeInputEventAckTimeout);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, PendingUserActivationTimeout);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, RendererExitedNoDrag);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
StopAndStartInputEventAckTimeout);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
ShorterDelayInputEventAckTimeout);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
AddAndRemoveInputEventObserver);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
AddAndRemoveImeInputEventObserver);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
InputRouterReceivesHasTouchEventHandlers);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, EventDispatchPostDetach);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, InputEventRWHLatencyComponent);
FRIEND_TEST_ALL_PREFIXES(DevToolsAgentHostImplTest,
NoUnresponsiveDialogInInspectedContents);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewMacTest,
ConflictingAllocationsResolve);
FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest,
ResizeAndCrossProcessPostMessagePreserveOrder);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostInputEventRouterTest,
EnsureRendererDestroyedHandlesUnAckedTouchEvents);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraTest, TouchEventState);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraTest, TouchEventSyncAsync);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraOverscrollTest,
OverscrollWithTouchEvents);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraOverscrollTest,
TouchGestureEndDispatchedAfterOverscrollComplete);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostViewAuraTest,
InvalidEventsHaveSyncHandlingDisabled);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostInputEventRouterTest,
EnsureRendererDestroyedHandlesUnAckedTouchEvents);
friend class MockRenderWidgetHost;
friend class OverscrollNavigationOverlayTest;
friend class RenderViewHostTester;
friend class TestRenderViewHost;
void Destroy(bool also_delete);
void ClearDisplayedGraphics();
void OnKeyboardEventAck(const NativeWebKeyboardEventWithLatencyInfo& event,
blink::mojom::InputEventResultSource ack_source,
blink::mojom::InputEventResultState ack_result);
void UnlockMouse();
void OnClose();
void OnUpdateScreenRectsAck();
void OnUpdateDragCursor(DragOperationCallback callback,
ui::mojom::DragOperation current_op);
void AnimateDoubleTapZoomInMainFrame(const gfx::Point& tap_point,
const gfx::Rect& rect_to_zoom) override;
void ZoomToFindInPageRectInMainFrame(const gfx::Rect& rect_to_zoom) override;
void SetHasTouchEventConsumers(
blink::mojom::TouchEventConsumersPtr consumers) override;
void IntrinsicSizingInfoChanged(
blink::mojom::IntrinsicSizingInfoPtr sizing_info) override;
void AutoscrollStart(const gfx::PointF& position) override;
void AutoscrollFling(const gfx::Vector2dF& velocity) override;
void AutoscrollEnd() override;
#ifdef OHOS_DRAG_DROP
void GetVisibleRectToWeb(GetVisibleRectToWebCallback callback) override;
#endif
void StartDragging(blink::mojom::DragDataPtr drag_data,
blink::DragOperationsMask drag_operations_mask,
const SkBitmap& unsafe_bitmap,
const gfx::Vector2d& cursor_offset_in_dip,
const gfx::Rect& drag_obj_rect_in_dip,
blink::mojom::DragEventSourceInfoPtr event_info) override;
void ResetStateForCreatedRenderWidget(
const blink::VisualProperties& initial_props);
blink::VisualProperties GetVisualProperties();
static bool DidVisualPropertiesSizeChange(
const blink::VisualProperties& old_visual_properties,
const blink::VisualProperties& new_visual_properties);
static bool DoesVisualPropertiesNeedAck(
const std::unique_ptr<blink::VisualProperties>& old_visual_properties,
const blink::VisualProperties& new_visual_properties);
static bool StoredVisualPropertiesNeedsUpdate(
const std::unique_ptr<blink::VisualProperties>& old_visual_properties,
const blink::VisualProperties& new_visual_properties);
bool KeyPressListenersHandleEvent(const NativeWebKeyboardEvent& event);
blink::mojom::InputEventResultState FilterInputEvent(
const blink::WebInputEvent& event,
const ui::LatencyInfo& latency_info) override;
void IncrementInFlightEventCount() override;
void NotifyUISchedulerOfScrollStateUpdate(
BrowserUIThreadScheduler::ScrollState scroll_state) override;
void DecrementInFlightEventCount(
blink::mojom::InputEventResultSource ack_source) override;
void DidOverscroll(const ui::DidOverscrollParams& params) override;
void DynamicFrameLossEvent(const std::string& sceneId, bool isStart) override;
#if BUILDFLAG(IS_OHOS)
void DidNativeEmbedEvent(blink::mojom::NativeEmbedTouchEventPtr touchEvent) override;
#endif
void DidStartScrollingViewport() override;
void OnSetCompositorAllowedTouchAction(cc::TouchAction) override {}
void OnInvalidInputEventSource() override;
void DispatchInputEventWithLatencyInfo(
const blink::WebInputEvent& event,
ui::LatencyInfo* latency,
ui::EventLatencyMetadata* event_latency_metadata);
void WindowSnapshotReachedScreen(int snapshot_id);
void OnSnapshotFromSurfaceReceived(int snapshot_id,
int retry_count,
const SkBitmap& bitmap);
void OnSnapshotReceived(int snapshot_id, gfx::Image image);
void OnEditElementFocusedForStylusWriting(
const absl::optional<gfx::Rect>& focused_edit_bounds,
const absl::optional<gfx::Rect>& caret_bounds);
void RenderProcessBlockedStateChanged(bool blocked);
void GrantFileAccessFromDropData(DropData* drop_data);
void StartInputEventAckTimeout();
void StopInputEventAckTimeout();
void RestartInputEventAckTimeoutIfNecessary();
void OnInputEventAckTimeout();
void SetupInputRouter();
bool LockKeyboard();
void UnlockKeyboard();
#if BUILDFLAG(IS_MAC)
device::mojom::WakeLock* GetWakeLock();
#endif
TouchEmulator* GetExistingTouchEmulator();
void CreateSyntheticGestureControllerIfNecessary();
gfx::PointF ConvertWindowPointToViewport(const gfx::PointF& window_point);
void AddPendingUserActivation(const blink::WebInputEvent& event);
void ClearPendingUserActivation();
static const base::TimeDelta kActivationNotificationExpireTime;
raw_ptr<FrameTree> frame_tree_;
#if BUILDFLAG(IS_OHOS)
bool send_internal_begin_frame = true;
#endif
bool self_owned_;
bool renderer_widget_created_ = false;
bool waiting_for_init_;
bool destroyed_ = false;
raw_ptr<RenderWidgetHostDelegate, DanglingUntriaged> delegate_;
raw_ptr<RenderWidgetHostOwnerDelegate> owner_delegate_ = nullptr;
const raw_ref<AgentSchedulingGroupHost> agent_scheduling_group_;
base::WeakPtr<SiteInstanceGroup> site_instance_group_;
const int routing_id_;
bool is_hidden_;
unsigned int frame_depth_ = 1u;
bool intersects_viewport_ = false;
mojo::Receiver<blink::mojom::PointerLockContext> mouse_lock_context_{this};
#if BUILDFLAG(IS_ANDROID)
ChildProcessImportance importance_ = ChildProcessImportance::NORMAL;
#endif
bool visual_properties_ack_pending_ = false;
std::unique_ptr<blink::VisualProperties> old_visual_properties_;
bool auto_resize_enabled_ = false;
gfx::Size min_size_for_auto_resize_;
gfx::Size max_size_for_auto_resize_;
struct MainFramePropagationProperties {
MainFramePropagationProperties();
~MainFramePropagationProperties();
float page_scale_factor = 1.f;
float compositing_scale_factor = 1.f;
bool is_pinch_gesture_active = false;
gfx::Size visible_viewport_size;
gfx::Rect compositor_viewport;
std::vector<gfx::Rect> root_widget_window_segments;
} properties_from_parent_local_root_;
bool waiting_for_screen_rects_ack_ = false;
gfx::Rect last_view_screen_rect_;
gfx::Rect last_window_screen_rect_;
std::vector<KeyPressEventCallback> key_press_event_callbacks_;
std::vector<MouseEventCallback> mouse_event_callbacks_;
std::vector<SuppressShowingImeCallback> suppress_showing_ime_callbacks_;
base::ObserverList<RenderWidgetHost::InputEventObserver>::Unchecked
input_event_observers_;
#if BUILDFLAG(IS_ANDROID)
base::ObserverList<RenderWidgetHost::InputEventObserver>::Unchecked
ime_input_event_observers_;
#endif
base::ObserverList<RenderWidgetHostObserver> observers_;
bool is_unresponsive_ = false;
const bool should_disable_hang_monitor_;
int in_flight_event_count_ = 0;
bool text_direction_updated_ = false;
base::i18n::TextDirection text_direction_ = base::i18n::LEFT_TO_RIGHT;
bool suppress_events_until_keydown_ = false;
bool pending_mouse_lock_request_ = false;
bool mouse_lock_raw_movement_ = false;
absl::optional<base::flat_set<ui::DomCode>> keyboard_keys_to_lock_;
bool keyboard_lock_requested_ = false;
bool keyboard_lock_allowed_ = false;
bool is_last_unlocked_by_target_ = false;
bool is_in_gesture_scroll_[static_cast<int>(
blink::WebGestureDevice::kMaxValue) +
1] = {false};
bool is_in_touchpad_gesture_fling_ = false;
std::unique_ptr<SyntheticGestureController> synthetic_gesture_controller_;
std::unique_ptr<FlingSchedulerBase> fling_scheduler_;
std::unique_ptr<InputRouter> input_router_;
base::OneShotTimer input_event_ack_timeout_;
base::CallbackListSubscription
render_process_blocked_state_changed_subscription_;
std::unique_ptr<TimeoutMonitor> new_content_rendering_timeout_;
RenderWidgetHostLatencyTracker latency_tracker_;
int next_browser_snapshot_id_ = 1;
using PendingSnapshotMap = std::map<int, GetSnapshotFromBrowserCallback>;
PendingSnapshotMap pending_browser_snapshots_;
PendingSnapshotMap pending_surface_browser_snapshots_;
bool is_focused_ = false;
bool is_active_ = false;
base::TimeDelta hung_renderer_delay_;
base::TimeDelta new_content_rendering_delay_;
bool monitoring_composition_info_ = false;
#if BUILDFLAG(IS_MAC)
mojo::Remote<device::mojom::WakeLock> wake_lock_;
#endif
base::OnceCallback<void(const viz::FrameSinkId&)> create_frame_sink_callback_;
std::unique_ptr<FrameTokenMessageQueue> frame_token_message_queue_;
mojo::Remote<blink::mojom::WidgetInputHandler> widget_input_handler_;
mojo::AssociatedRemote<blink::mojom::FrameWidgetInputHandler>
frame_widget_input_handler_;
mojo::Remote<viz::mojom::InputTargetClient> input_target_client_;
absl::optional<uint16_t> screen_orientation_angle_for_testing_;
absl::optional<display::mojom::ScreenOrientation>
screen_orientation_type_for_testing_;
bool force_enable_zoom_ = false;
RenderFrameMetadataProviderImpl render_frame_metadata_provider_;
bool surface_id_allocation_suppressed_ = false;
const viz::FrameSinkId frame_sink_id_;
bool sent_autoscroll_scroll_begin_ = false;
gfx::PointF autoscroll_start_position_;
bool autoscroll_in_progress_ = false;
int pending_user_activation_counter_ = 0;
base::OneShotTimer pending_user_activation_timer_;
std::unique_ptr<PeakGpuMemoryTracker> scroll_peak_gpu_mem_tracker_;
InputRouterImpl::RequestMouseLockCallback request_mouse_callback_;
struct PendingShowParams {
PendingShowParams(bool is_evicted,
blink::mojom::RecordContentToVisibleTimeRequestPtr
visible_time_request);
~PendingShowParams();
PendingShowParams(const PendingShowParams&) = delete;
PendingShowParams& operator=(const PendingShowParams&) = delete;
bool is_evicted;
blink::mojom::RecordContentToVisibleTimeRequestPtr visible_time_request;
};
absl::optional<PendingShowParams> pending_show_params_;
mojo::AssociatedReceiver<blink::mojom::FrameWidgetHost>
blink_frame_widget_host_receiver_{this};
mojo::AssociatedRemote<blink::mojom::FrameWidget> blink_frame_widget_;
mojo::AssociatedReceiver<blink::mojom::PopupWidgetHost>
blink_popup_widget_host_receiver_{this};
mojo::AssociatedReceiver<blink::mojom::WidgetHost>
blink_widget_host_receiver_{this};
mojo::AssociatedRemote<blink::mojom::Widget> blink_widget_;
mojo::Remote<blink::mojom::WidgetCompositor> widget_compositor_;
std::unique_ptr<power_scheduler::PowerModeVoter> power_mode_input_voter_;
std::unique_ptr<power_scheduler::PowerModeVoter> power_mode_loading_voter_;
absl::optional<BrowserUIThreadScheduler::UserInputActiveHandle>
user_input_active_handle_;
bool first_surface_activated_ = false;
base::WeakPtrFactory<RenderWidgetHostImpl> weak_factory_{this};
};
}
namespace base {
template <>
struct ScopedObservationTraits<content::RenderWidgetHostImpl,
content::RenderWidgetHost::InputEventObserver> {
static void AddObserver(
content::RenderWidgetHostImpl* source,
content::RenderWidgetHost::InputEventObserver* observer) {
source->AddInputEventObserver(observer);
}
static void RemoveObserver(
content::RenderWidgetHostImpl* source,
content::RenderWidgetHost::InputEventObserver* observer) {
source->RemoveInputEventObserver(observer);
}
};
}
#endif