|  | // Copyright 2012 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef CONTENT_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.h" | 
|  | #include "base/callback_list.h" | 
|  | #include "base/containers/flat_map.h" | 
|  | #include "base/containers/flat_set.h" | 
|  | #include "base/gtest_prod_util.h" | 
|  | #include "base/memory/raw_ptr.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/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; | 
|  |  | 
|  | // This implements the RenderWidgetHost interface that is exposed to | 
|  | // embedders of content, and adds things only visible to content. | 
|  | // | 
|  | // Several core rendering primitives are mirrored between the browser and | 
|  | // renderer. These are `blink::WidgetBase`, `RenderFrame` and `blink::WebView`. | 
|  | // Their browser counterparts are `RenderWidgetHost`, `RenderFrameHost` and | 
|  | // `RenderViewHost`. | 
|  | // | 
|  | // For simplicity and clarity, we want the object ownership graph in the | 
|  | // renderer to mirror the object ownership graph in the browser. The IPC message | 
|  | // that tears down the renderer object graph should be targeted at the root | 
|  | // object, and should be sent by the destructor/finalizer of the root object in | 
|  | // the browser. | 
|  | // | 
|  | // Note: We must tear down the renderer object graph with a single IPC to avoid | 
|  | // inconsistencies in renderer state. | 
|  | // | 
|  | // RenderWidget represents a surface that can paint and receive input. It is | 
|  | // used in four contexts: | 
|  | //   * Main frame for webpage (root is `blink::WebView`) | 
|  | //   * Child frame for webpage (root is RenderFrame) | 
|  | //   * Popups (root is RenderWidget) | 
|  | //   * Pepper Fullscreen (root is RenderWidget) | 
|  | // | 
|  | // Destruction of the RenderWidgetHost will trigger destruction of the | 
|  | // RenderWidget iff RenderWidget is the root of the renderer object graph. | 
|  | // | 
|  | // Note: We want to converge on RenderFrame always being the root. | 
|  | 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: | 
|  | // See the constructor for documentations. | 
|  | 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); | 
|  |  | 
|  | // See the constructor for documentations. | 
|  | // | 
|  | // Contrary to Create(), this function doesn't give ownership of the | 
|  | // RenderWidgetHost. Instead, this instance is self-owned. It deletes itself | 
|  | // when: | 
|  | // - ShutdownAndDestroyWidget(also_delete = true) is called. | 
|  | // - its RenderProcess exit. | 
|  | 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; | 
|  |  | 
|  | // Similar to RenderWidgetHost::FromID, but returning the Impl object. | 
|  | static RenderWidgetHostImpl* FromID(int32_t process_id, int32_t routing_id); | 
|  |  | 
|  | // Returns all RenderWidgetHosts including swapped out ones for | 
|  | // internal use. The public interface | 
|  | // RenderWidgetHost::GetRenderWidgetHosts only returns active ones. | 
|  | static std::unique_ptr<RenderWidgetHostIterator> GetAllRenderWidgetHosts(); | 
|  |  | 
|  | // Use RenderWidgetHostImpl::From(rwh) to downcast a RenderWidgetHost to a | 
|  | // RenderWidgetHostImpl. | 
|  | static RenderWidgetHostImpl* From(RenderWidgetHost* rwh); | 
|  |  | 
|  | // TODO(crbug.com/1179502): FrameTree and FrameTreeNode will not be const as | 
|  | // with prerenderer activation the page needs to move between FrameTreeNodes | 
|  | // and FrameTrees. As it's hard to make sure that all places handle this | 
|  | // transition correctly, MPArch will remove references from this class to | 
|  | // FrameTree/FrameTreeNode. | 
|  | 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_; | 
|  | } | 
|  |  | 
|  | // Returns the object that tracks the start of content to visible events for | 
|  | // the WebContents. May be nullptr if there is no RenderWidgetHostView. | 
|  | VisibleTimeRequestTrigger* GetVisibleTimeRequestTrigger(); | 
|  |  | 
|  | // RenderWidgetHost implementation. | 
|  | 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)>; | 
|  | // |drop_data| must have been filtered. The embedder should call | 
|  | // FilterDropData before passing the drop data to RWHI. | 
|  | 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; | 
|  | // |drop_data| must have been filtered. The embedder should call | 
|  | // FilterDropData before passing the drop data to RWHI. | 
|  | 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 implementation. | 
|  | RenderProcessHostPriorityClient::Priority GetPriority() override; | 
|  |  | 
|  | // RenderProcessHostObserver implementation. | 
|  | void RenderProcessExited(RenderProcessHost* host, | 
|  | const ChildProcessTerminationInfo& info) override; | 
|  |  | 
|  | // blink::mojom::WidgetHost implementation. | 
|  | 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; | 
|  |  | 
|  | // blink::mojom::PopupWidgetHost implementation. | 
|  | 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; | 
|  |  | 
|  | // Update the stored set of visual properties for the renderer. If 'propagate' | 
|  | // is true, the new properties will be sent to the renderer process. | 
|  | bool UpdateVisualProperties(bool propagate); | 
|  |  | 
|  | // Notification that the screen info has changed. | 
|  | void NotifyScreenInfoChanged(); | 
|  |  | 
|  | // Forces redraw in the renderer and when the update reaches the browser. | 
|  | // grabs snapshot from the compositor. | 
|  | // If |from_surface| is false, it will obtain the snapshot directly from the | 
|  | // view (On MacOS, the snapshot is taken from the Cocoa view for end-to-end | 
|  | // testing  purposes). | 
|  | // Otherwise, the snapshot is obtained from the view's surface, with no bounds | 
|  | // defined. | 
|  | // Returns a gfx::Image that is backed by an NSImage on MacOS or by an | 
|  | // SkBitmap otherwise. The gfx::Image may be empty if the snapshot failed. | 
|  | using GetSnapshotFromBrowserCallback = | 
|  | base::OnceCallback<void(const gfx::Image&)>; | 
|  | void GetSnapshotFromBrowser(GetSnapshotFromBrowserCallback callback, | 
|  | bool from_surface); | 
|  |  | 
|  | // Sets the View of this RenderWidgetHost. | 
|  | void SetView(RenderWidgetHostViewBase* view); | 
|  |  | 
|  | RenderWidgetHostDelegate* delegate() const { return delegate_; } | 
|  |  | 
|  | // Bind the provided widget interfaces. | 
|  | void BindWidgetInterfaces( | 
|  | mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> widget_host, | 
|  | mojo::PendingAssociatedRemote<blink::mojom::Widget> widget); | 
|  |  | 
|  | // Bind the provided popup widget interface. | 
|  | void BindPopupWidgetInterface( | 
|  | mojo::PendingAssociatedReceiver<blink::mojom::PopupWidgetHost> | 
|  | popup_widget_host); | 
|  |  | 
|  | // Bind the provided frame widget interfaces. | 
|  | void BindFrameWidgetInterfaces( | 
|  | mojo::PendingAssociatedReceiver<blink::mojom::FrameWidgetHost> | 
|  | frame_widget_host, | 
|  | mojo::PendingAssociatedRemote<blink::mojom::FrameWidget> frame_widget); | 
|  |  | 
|  | // The Bind*Interfaces() methods are called before creating the renderer-side | 
|  | // Widget object, and RendererWidgetCreated() is called afterward. At that | 
|  | // point the bound mojo interfaces are connected to the renderer Widget. The | 
|  | // `for_frame_widget` informs if this widget should enable frame-specific | 
|  | // behaviour and mojo connections. | 
|  | void RendererWidgetCreated(bool for_frame_widget); | 
|  |  | 
|  | // Renderer-created top-level widgets (either for a main frame or for a popup) | 
|  | // wait to be shown until the renderer requests it. When that condition is | 
|  | // satisfied we are notified through Init(). This will always happen after | 
|  | // RendererWidgetCreated(). | 
|  | void Init(); | 
|  |  | 
|  | // Returns true if the frame content needs be stored before being evicted. | 
|  | bool ShouldShowStaleContentOnEviction(); | 
|  |  | 
|  | void SetFrameDepth(unsigned int depth); | 
|  | void SetIntersectsViewport(bool intersects); | 
|  | void UpdatePriority(); | 
|  |  | 
|  | // Tells the renderer to die and optionally delete |this|. | 
|  | void ShutdownAndDestroyWidget(bool also_delete); | 
|  |  | 
|  | // Indicates if the page has finished loading. | 
|  | void SetIsLoading(bool is_loading); | 
|  |  | 
|  | // Called to notify the RenderWidget that it has been hidden or restored from | 
|  | // having been hidden. | 
|  | void WasHidden(); | 
|  | void WasShown(blink::mojom::RecordContentToVisibleTimeRequestPtr | 
|  | record_tab_switch_time_request); | 
|  |  | 
|  | // Called to request the presentation time for the next frame or cancel any | 
|  | // requests when the RenderWidget's visibility state is not changing. If the | 
|  | // visibility state is changing call WasHidden or WasShown instead. | 
|  | void RequestPresentationTimeForNextFrame( | 
|  | blink::mojom::RecordContentToVisibleTimeRequestPtr visible_time_request); | 
|  | void CancelPresentationTimeRequest(); | 
|  |  | 
|  | #if BUILDFLAG(IS_ANDROID) | 
|  | // Set the importance of widget. The importance is passed onto | 
|  | // RenderProcessHost which aggregates importance of all of its widgets. | 
|  | void SetImportance(ChildProcessImportance importance); | 
|  | ChildProcessImportance importance() const { return importance_; } | 
|  |  | 
|  | void AddImeInputEventObserver( | 
|  | RenderWidgetHost::InputEventObserver* observer) override; | 
|  | void RemoveImeInputEventObserver( | 
|  | RenderWidgetHost::InputEventObserver* observer) override; | 
|  | #endif | 
|  |  | 
|  | // Returns true if the RenderWidget is hidden. | 
|  | bool is_hidden() const { return is_hidden_; } | 
|  |  | 
|  | // Called to notify the RenderWidget that its associated native window | 
|  | // got/lost focused. | 
|  | void GotFocus(); | 
|  | void LostFocus(); | 
|  | void LostCapture(); | 
|  |  | 
|  | // Indicates whether the RenderWidgetHost thinks it is focused. | 
|  | // This is different from RenderWidgetHostView::HasFocus() in the sense that | 
|  | // it reflects what the renderer process knows: it saves the state that is | 
|  | // sent/received. | 
|  | // RenderWidgetHostView::HasFocus() is checking whether the view is focused so | 
|  | // it is possible in some edge cases that a view was requested to be focused | 
|  | // but it failed, thus HasFocus() returns false. | 
|  | bool is_focused() const { return is_focused_; } | 
|  |  | 
|  | // Support for focus tracking on multi-FrameTree cases. This will notify all | 
|  | // descendants (including nested FrameTrees) to distribute a "page focus" | 
|  | // update. Users other than WebContents and RenderWidgetHost should use | 
|  | // Focus()/Blur(). | 
|  | void SetPageFocus(bool focused); | 
|  |  | 
|  | // Returns true if the RenderWidgetHost thinks it is active. This | 
|  | // is different than `is_focused` but must always be true if `is_focused` | 
|  | // is true. All RenderWidgetHosts in an active tab are considered active, | 
|  | // but only one FrameTree can have page focus (e.g., an inner frame | 
|  | // tree (fenced frame or portals) will not have focus if the primary frame | 
|  | // tree has focus. See | 
|  | // https://www.chromium.org/developers/design-documents/aura/focus-and-activation. | 
|  | bool is_active() const { return is_active_; } | 
|  |  | 
|  | // Called to notify the RenderWidget that it has lost the mouse lock. | 
|  | void LostMouseLock(); | 
|  |  | 
|  | // Notifies the RenderWidget that it lost the mouse lock. | 
|  | void SendMouseLockLost(); | 
|  |  | 
|  | bool is_last_unlocked_by_target() const { | 
|  | return is_last_unlocked_by_target_; | 
|  | } | 
|  |  | 
|  | // Notifies the RenderWidget of the current mouse cursor visibility state. | 
|  | void OnCursorVisibilityStateChanged(bool is_visible); | 
|  |  | 
|  | // Notifies the RenderWidgetHost that the View was destroyed. | 
|  | void ViewDestroyed(); | 
|  |  | 
|  | // Signals if this host has forwarded a GestureScrollBegin without yet having | 
|  | // forwarded a matching GestureScrollEnd/GestureFlingStart. | 
|  | 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_; | 
|  | } | 
|  |  | 
|  | // Requests the generation of a new CompositorFrame from the renderer. | 
|  | // It will return false if the renderer is not ready (e.g. there's an | 
|  | // in flight change). | 
|  | bool RequestRepaintForTesting(); | 
|  |  | 
|  | // Called after every cross-document navigation. The displayed graphics of | 
|  | // the renderer is cleared after a certain timeout if it does not produce a | 
|  | // new CompositorFrame after navigation. | 
|  | void DidNavigate(); | 
|  |  | 
|  | // Forwards the keyboard event with optional commands to the renderer. If | 
|  | // |key_event| is not forwarded for any reason, then |commands| are ignored. | 
|  | // |update_event| (if non-null) is set to indicate whether the underlying | 
|  | // event in |key_event| should be updated. |update_event| is only used on | 
|  | // aura. | 
|  | void ForwardKeyboardEventWithCommands( | 
|  | const NativeWebKeyboardEvent& key_event, | 
|  | const ui::LatencyInfo& latency, | 
|  | std::vector<blink::mojom::EditCommandPtr> commands, | 
|  | bool* update_event = nullptr); | 
|  |  | 
|  | // Forwards the given message to the renderer. These are called by the view | 
|  | // when it has received a message. | 
|  | 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);  // Virtual for testing. | 
|  | void ForwardMouseEventWithLatencyInfo(const blink::WebMouseEvent& mouse_event, | 
|  | const ui::LatencyInfo& latency); | 
|  | void ForwardWheelEventWithLatencyInfo( | 
|  | const blink::WebMouseWheelEvent& wheel_event, | 
|  | const ui::LatencyInfo& latency) override; | 
|  |  | 
|  | // Resolves the given callback once all effects of prior input have been | 
|  | // fully realized. | 
|  | void WaitForInputProcessed(SyntheticGestureParams::GestureType type, | 
|  | content::mojom::GestureSourceType source, | 
|  | base::OnceClosure callback); | 
|  |  | 
|  | // Resolves the given callback once all effects of previously forwarded input | 
|  | // have been fully realized (i.e. resulting compositor frame has been drawn, | 
|  | // swapped, and presented). | 
|  | void WaitForInputProcessed(base::OnceClosure callback); | 
|  |  | 
|  | // Retrieve an iterator over any RenderWidgetHosts that are immediately | 
|  | // embedded within this one. This does not return hosts that are embedded | 
|  | // indirectly (i.e. nested within embedded hosts). | 
|  | std::unique_ptr<RenderWidgetHostIterator> GetEmbeddedRenderWidgetHosts(); | 
|  |  | 
|  | // Returns an emulator for this widget. See TouchEmulator for more details. | 
|  | TouchEmulator* GetTouchEmulator(); | 
|  |  | 
|  | // Queues a synthetic gesture for testing purposes.  Invokes the on_complete | 
|  | // callback when the gesture is finished running. | 
|  | void QueueSyntheticGesture( | 
|  | std::unique_ptr<SyntheticGesture> synthetic_gesture, | 
|  | base::OnceCallback<void(SyntheticGesture::Result)> on_complete); | 
|  | void QueueSyntheticGestureCompleteImmediately( | 
|  | std::unique_ptr<SyntheticGesture> synthetic_gesture); | 
|  |  | 
|  | // Ensures the renderer is in a state ready to receive synthetic input. The | 
|  | // SyntheticGestureController will normally ensure this before sending the | 
|  | // first gesture; however, in some tests that may be a bad time (e.g. the | 
|  | // gesture is sent while the main thread is blocked) so this allows the | 
|  | // caller to do so manually. | 
|  | void EnsureReadyForSyntheticGestures(base::OnceClosure on_ready); | 
|  |  | 
|  | void TakeSyntheticGestureController(RenderWidgetHostImpl* host); | 
|  |  | 
|  | // Update the composition node of the renderer (or WebKit). | 
|  | // WebKit has a special node (a composition node) for input method to change | 
|  | // its text without affecting any other DOM nodes. When the input method | 
|  | // (attached to the browser) updates its text, the browser sends IPC messages | 
|  | // to update the composition node of the renderer. | 
|  | // (Read the comments of each function for its detail.) | 
|  |  | 
|  | // Sets the text of the composition node. | 
|  | // This function can also update the cursor position and mark the specified | 
|  | // range in the composition node. | 
|  | // A browser should call this function: | 
|  | // * when it receives a WM_IME_COMPOSITION message with a GCS_COMPSTR flag | 
|  | //   (on Windows); | 
|  | // * when it receives a "preedit_changed" signal of GtkIMContext (on Linux); | 
|  | // * when markedText of NSTextInput is called (on Mac). | 
|  | 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); | 
|  |  | 
|  | // Deletes the ongoing composition if any, inserts the specified text, and | 
|  | // moves the cursor. | 
|  | // A browser should call this function or ImeFinishComposingText: | 
|  | // * when it receives a WM_IME_COMPOSITION message with a GCS_RESULTSTR flag | 
|  | //   (on Windows); | 
|  | // * when it receives a "commit" signal of GtkIMContext (on Linux); | 
|  | // * when insertText of NSTextInput is called (on Mac). | 
|  | void ImeCommitText(const std::u16string& text, | 
|  | const std::vector<ui::ImeTextSpan>& ime_text_spans, | 
|  | const gfx::Range& replacement_range, | 
|  | int relative_cursor_pos); | 
|  |  | 
|  | // Finishes an ongoing composition. | 
|  | // A browser should call this function or ImeCommitText: | 
|  | // * when it receives a WM_IME_COMPOSITION message with a GCS_RESULTSTR flag | 
|  | //   (on Windows); | 
|  | // * when it receives a "commit" signal of GtkIMContext (on Linux); | 
|  | // * when insertText of NSTextInput is called (on Mac). | 
|  | void ImeFinishComposingText(bool keep_selection); | 
|  |  | 
|  | // Cancels an ongoing composition. | 
|  | void ImeCancelComposition(); | 
|  |  | 
|  | // Whether forwarded WebInputEvents are being ignored. | 
|  | bool IsIgnoringInputEvents() const; | 
|  |  | 
|  | // Called when the response to a pending mouse lock request has arrived. | 
|  | // Returns true if |allowed| is true and the mouse has been successfully | 
|  | // locked. | 
|  | bool GotResponseToLockMouseRequest(blink::mojom::PointerLockResult result); | 
|  |  | 
|  | // Called when the response to a pending keyboard lock request has arrived. | 
|  | // |allowed| should be true if the current tab is in tab initiated fullscreen | 
|  | // mode. | 
|  | void GotResponseToKeyboardLockRequest(bool allowed); | 
|  |  | 
|  | // Called when the response to an earlier WidgetMsg_ForceRedraw message has | 
|  | // arrived. The reply includes the snapshot-id from the request. | 
|  | void GotResponseToForceRedraw(int snapshot_id); | 
|  |  | 
|  | // When the WebContents (which acts as the Delegate) is destroyed, this object | 
|  | // may still outlive it while the renderer is shutting down. In that case the | 
|  | // delegate pointer is removed (since it would be a UAF). | 
|  | void DetachDelegate(); | 
|  |  | 
|  | // Update the renderer's cache of the screen rect of the view and window. | 
|  | void SendScreenRects(); | 
|  |  | 
|  | // Indicates whether the renderer drives the RenderWidgetHosts's size or the | 
|  | // other way around. | 
|  | bool auto_resize_enabled() { return auto_resize_enabled_; } | 
|  |  | 
|  | // The minimum size of this renderer when auto-resize is enabled. | 
|  | const gfx::Size& min_size_for_auto_resize() const { | 
|  | return min_size_for_auto_resize_; | 
|  | } | 
|  |  | 
|  | // The maximum size of this renderer when auto-resize is enabled. | 
|  | const gfx::Size& max_size_for_auto_resize() const { | 
|  | return max_size_for_auto_resize_; | 
|  | } | 
|  |  | 
|  | // Don't check whether we expected a resize ack during web tests. | 
|  | static void DisableResizeAckCheckForTesting(); | 
|  |  | 
|  | InputRouter* input_router() { return input_router_.get(); } | 
|  |  | 
|  | void SetForceEnableZoom(bool); | 
|  |  | 
|  | // Get the BrowserAccessibilityManager for the root of the frame tree, | 
|  | BrowserAccessibilityManager* GetRootBrowserAccessibilityManager(); | 
|  |  | 
|  | // Get the BrowserAccessibilityManager for the root of the frame tree, | 
|  | // or create it if it doesn't already exist. | 
|  | BrowserAccessibilityManager* GetOrCreateRootBrowserAccessibilityManager(); | 
|  |  | 
|  | void RejectMouseLockOrUnlockIfNecessary( | 
|  | blink::mojom::PointerLockResult reason); | 
|  |  | 
|  | // Store values received in a child frame RenderWidgetHost from a parent | 
|  | // RenderWidget, in order to pass them to the renderer and continue their | 
|  | // propagation down the RenderWidget tree. | 
|  | 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); | 
|  |  | 
|  | // Indicates if the render widget host should track the render widget's size | 
|  | // as opposed to visa versa. | 
|  | // In main frame RenderWidgetHosts this controls the value for the frame tree. | 
|  | // In child frame RenderWidgetHosts this value comes from the parent | 
|  | // RenderWidget and should be propagated down the RenderWidgetTree. | 
|  | void SetAutoResize(bool enable, | 
|  | const gfx::Size& min_size, | 
|  | const gfx::Size& max_size); | 
|  |  | 
|  | // Returns the result of GetVisualProperties(), resetting and storing that | 
|  | // value as what has been sent to the renderer. This should be called when | 
|  | // getting VisualProperties that will be sent in order to create a | 
|  | // RenderWidget, since the creation acts as the initial | 
|  | // SynchronizeVisualProperties(). | 
|  | // | 
|  | // This has the side effect of resetting state that should match a newly | 
|  | // created RenderWidget in the renderer. | 
|  | // | 
|  | // TODO(dcheng): Tests call this directly but shouldn't have to. Investigate | 
|  | // getting rid of this. | 
|  | blink::VisualProperties GetInitialVisualProperties(); | 
|  |  | 
|  | // Pushes updated visual properties to the renderer as well as whether the | 
|  | // focused node should be scrolled into view. | 
|  | bool SynchronizeVisualProperties(bool scroll_focused_node_into_view, | 
|  | bool propagate = true); | 
|  |  | 
|  | // Similar to SynchronizeVisualProperties(), but performed even if | 
|  | // |visual_properties_ack_pending_| is set.  Used to guarantee that the | 
|  | // latest visual properties are sent to the renderer before another IPC. | 
|  | bool SynchronizeVisualPropertiesIgnoringPendingAck(); | 
|  |  | 
|  | // Called when we receive a notification indicating that the renderer process | 
|  | // is gone. This will reset our state so that our state will be consistent if | 
|  | // a new renderer is created. | 
|  | void RendererExited(); | 
|  |  | 
|  | // Called from a RenderFrameHost when the text selection has changed. | 
|  | 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(); | 
|  | } | 
|  |  | 
|  | // Request composition updates from RenderWidget. If |immediate_request| is | 
|  | // true, RenderWidget will respond immediately. If |monitor_updates| is true, | 
|  | // then RenderWidget sends updates for each compositor frame when there are | 
|  | // changes, or when the text selection changes inside a frame. If both fields | 
|  | // are false, RenderWidget will not send any updates. To avoid sending | 
|  | // unnecessary IPCs to RenderWidget (e.g., asking for monitor updates while | 
|  | // we are already receiving updates), when | 
|  | // |monitoring_composition_info_| == |monitor_updates| no IPC is sent to the | 
|  | // renderer unless it is for an immediate request. | 
|  | void RequestCompositionUpdates(bool immediate_request, bool monitor_updates); | 
|  |  | 
|  | RenderFrameMetadataProviderImpl* render_frame_metadata_provider() { | 
|  | return &render_frame_metadata_provider_; | 
|  | } | 
|  |  | 
|  | bool HasGestureStopped() override; | 
|  |  | 
|  | // Signals that a frame with token |frame_token| was finished processing. If | 
|  | // there are any queued messages belonging to it, they will be processed. | 
|  | 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); | 
|  |  | 
|  | // InputRouterImplClient overrides. | 
|  | 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; | 
|  |  | 
|  | // PointerLockContext overrides | 
|  | void RequestMouseLockChange( | 
|  | bool unadjusted_movement, | 
|  | PointerLockContext::RequestMouseLockChangeCallback response) override; | 
|  |  | 
|  | // FrameTokenMessageQueue::Client: | 
|  | void OnInvalidFrameToken(uint32_t frame_token) override; | 
|  |  | 
|  | void ProgressFlingIfNeeded(base::TimeTicks current_time); | 
|  | void StopFling(); | 
|  |  | 
|  | // The RenderWidgetHostImpl will keep showing the old page (for a while) after | 
|  | // navigation until the first frame of the new page arrives. This reduces | 
|  | // flicker. However, if for some reason it is known that the frames won't be | 
|  | // arriving, this call can be used for force a timeout, to avoid showing the | 
|  | // content of the old page under UI from the new page. | 
|  | void ForceFirstFrameAfterNavigationTimeout(); | 
|  |  | 
|  | void SetScreenOrientationForTesting(uint16_t angle, | 
|  | display::mojom::ScreenOrientation type); | 
|  |  | 
|  | // Requests Keyboard lock.  Note: the lock may not take effect until later. | 
|  | // If |codes| has no value then all keys will be locked, otherwise only the | 
|  | // keys specified will be intercepted and routed to the web page. | 
|  | // Returns true if the lock request was successfully registered. | 
|  | bool RequestKeyboardLock(absl::optional<base::flat_set<ui::DomCode>> codes); | 
|  |  | 
|  | // Cancels a previous keyboard lock request. | 
|  | void CancelKeyboardLock(); | 
|  |  | 
|  | // Indicates whether keyboard lock is active. | 
|  | bool IsKeyboardLocked() const; | 
|  |  | 
|  | // Returns the keyboard layout mapping. | 
|  | base::flat_map<std::string, std::string> GetKeyboardLayoutMap(); | 
|  |  | 
|  | void RequestForceRedraw(int snapshot_id); | 
|  |  | 
|  | void DidStopFlinging(); | 
|  |  | 
|  | void GetContentRenderingTimeoutFrom(RenderWidgetHostImpl* other); | 
|  |  | 
|  | // Called on delayed response from the renderer by either | 
|  | // 1) |hang_monitor_timeout_| (slow to ack input events) or | 
|  | // 2) NavigationHandle::OnCommitTimeout (slow to commit). | 
|  | void RendererIsUnresponsive( | 
|  | base::RepeatingClosure restart_hang_monitor_timeout); | 
|  |  | 
|  | // Called if we know the renderer is responsive. When we currently think the | 
|  | // renderer is unresponsive, this will clear that state and call | 
|  | // NotifyRendererResponsive. | 
|  | void RendererIsResponsive(); | 
|  |  | 
|  | // Called during frame eviction to return all SurfaceIds in the frame tree. | 
|  | // Marks all views in the frame tree as evicted. | 
|  | std::vector<viz::SurfaceId> CollectSurfaceIdsForEviction(); | 
|  |  | 
|  | // This function validates a renderer's attempt to activate frames. It | 
|  | // removes one pending user activation if available and returns true; | 
|  | // otherwise, it returns false.  See comments on | 
|  | // Add/ClearPendingUserActivation() for details. | 
|  | bool RemovePendingUserActivationIfAvailable(); | 
|  |  | 
|  | const mojo::AssociatedRemote<blink::mojom::FrameWidget>& | 
|  | GetAssociatedFrameWidget(); | 
|  |  | 
|  | blink::mojom::FrameWidgetInputHandler* GetFrameWidgetInputHandler(); | 
|  |  | 
|  | // Exposed so that tests can swap the implementation and intercept calls. | 
|  | mojo::AssociatedReceiver<blink::mojom::FrameWidgetHost>& | 
|  | frame_widget_host_receiver_for_testing() { | 
|  | return blink_frame_widget_host_receiver_; | 
|  | } | 
|  |  | 
|  | // Exposed so that tests can swap the implementation and intercept calls. | 
|  | mojo::AssociatedReceiver<blink::mojom::PopupWidgetHost>& | 
|  | popup_widget_host_receiver_for_testing() { | 
|  | return blink_popup_widget_host_receiver_; | 
|  | } | 
|  |  | 
|  | // Exposed so that tests can swap the implementation and intercept calls. | 
|  | mojo::AssociatedReceiver<blink::mojom::WidgetHost>& | 
|  | widget_host_receiver_for_testing() { | 
|  | return blink_widget_host_receiver_; | 
|  | } | 
|  |  | 
|  | absl::optional<blink::VisualProperties> LastComputedVisualProperties() const; | 
|  |  | 
|  | // Generates widget creation params that will be passed to the renderer to | 
|  | // create a new widget. As a side effect, this resets various widget and frame | 
|  | // widget Mojo interfaces and rebinds them, passing the new endpoints in the | 
|  | // returned params. | 
|  | mojom::CreateFrameWidgetParamsPtr BindAndGenerateCreateFrameWidgetParams(); | 
|  | // TODO(danakj): This is a CreateNewWindow()-specific version of the above | 
|  | // helper to work around the fact that things are in a weird state. Figure out | 
|  | // why that's happening and remove this. | 
|  | mojom::CreateFrameWidgetParamsPtr | 
|  | BindAndGenerateCreateFrameWidgetParamsForNewWindow(); | 
|  |  | 
|  | // RenderFrameMetadataProvider::Observer implementation. | 
|  | 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(); | 
|  |  | 
|  | protected: | 
|  | // |routing_id| must not be MSG_ROUTING_NONE. | 
|  | // If this object outlives |delegate|, DetachDelegate() must be called when | 
|  | // |delegate| goes away. |site_instance_group| will outlive this | 
|  | // widget but we store it via a `base::SafeRef` instead of a scoped_refptr to | 
|  | // not create a cycle and keep alive the `SiteInstanceGroup`. | 
|  | 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); | 
|  | // --------------------------------------------------------------------------- | 
|  | // The following method is overridden by RenderViewHost to send upwards to | 
|  | // its delegate. | 
|  |  | 
|  | // Callback for notification that we failed to receive any rendered graphics | 
|  | // from a newly loaded page. Used for testing. | 
|  | virtual void NotifyNewContentRenderingTimeoutForTesting() {} | 
|  |  | 
|  | // InputDispositionHandler | 
|  | 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 for testing. | 
|  | virtual void OnMouseEventAck(const MouseEventWithLatencyInfo& event, | 
|  | blink::mojom::InputEventResultSource ack_source, | 
|  | blink::mojom::InputEventResultState ack_result); | 
|  | // --------------------------------------------------------------------------- | 
|  |  | 
|  | bool IsMouseLocked() const; | 
|  |  | 
|  | // The View associated with the RenderWidgetHost. The lifetime of this object | 
|  | // is associated with the lifetime of the Render process. If the Renderer | 
|  | // crashes, its View is destroyed and this pointer becomes NULL, even though | 
|  | // render_view_host_ lives on to load another URL (creating a new View while | 
|  | // doing so). | 
|  | base::WeakPtr<RenderWidgetHostViewBase> view_; | 
|  |  | 
|  | private: | 
|  | 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; | 
|  |  | 
|  | // Tell this object to destroy itself. If |also_delete| is specified, the | 
|  | // destructor is called as well. | 
|  | void Destroy(bool also_delete); | 
|  |  | 
|  | // Called by |new_content_rendering_timeout_| if a renderer has loaded new | 
|  | // content but failed to produce a compositor frame in a defined time. | 
|  | void ClearDisplayedGraphics(); | 
|  |  | 
|  | // InputRouter::SendKeyboardEvent() callbacks to this. This may be called | 
|  | // synchronously. | 
|  | void OnKeyboardEventAck(const NativeWebKeyboardEventWithLatencyInfo& event, | 
|  | blink::mojom::InputEventResultSource ack_source, | 
|  | blink::mojom::InputEventResultState ack_result); | 
|  |  | 
|  | // Release the mouse lock | 
|  | void UnlockMouse(); | 
|  |  | 
|  | // IPC message handlers | 
|  | void OnClose(); | 
|  | void OnUpdateScreenRectsAck(); | 
|  | void OnUpdateDragCursor(DragOperationCallback callback, | 
|  | ui::mojom::DragOperation current_op); | 
|  |  | 
|  | // blink::mojom::FrameWidgetHost overrides. | 
|  | 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; | 
|  | 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; | 
|  |  | 
|  | // When the RenderWidget is destroyed and recreated, this resets states in the | 
|  | // browser to match the clean start for the renderer side. | 
|  | void ResetStateForCreatedRenderWidget( | 
|  | const blink::VisualProperties& initial_props); | 
|  |  | 
|  | // Generates a filled in VisualProperties struct representing the current | 
|  | // properties of this widget. | 
|  | blink::VisualProperties GetVisualProperties(); | 
|  |  | 
|  | // Returns true if the |new_visual_properties| differs from | 
|  | // |old_page_visual_properties| in a way that indicates a size changed. | 
|  | static bool DidVisualPropertiesSizeChange( | 
|  | const blink::VisualProperties& old_visual_properties, | 
|  | const blink::VisualProperties& new_visual_properties); | 
|  |  | 
|  | // Returns true if the new visual properties requires an ack from a | 
|  | // synchronization message. | 
|  | static bool DoesVisualPropertiesNeedAck( | 
|  | const std::unique_ptr<blink::VisualProperties>& old_visual_properties, | 
|  | const blink::VisualProperties& new_visual_properties); | 
|  |  | 
|  | // Returns true if |old_visual_properties| is out of sync with | 
|  | // |new_visual_properties|. | 
|  | static bool StoredVisualPropertiesNeedsUpdate( | 
|  | const std::unique_ptr<blink::VisualProperties>& old_visual_properties, | 
|  | const blink::VisualProperties& new_visual_properties); | 
|  |  | 
|  | // Give key press listeners a chance to handle this key press. This allow | 
|  | // widgets that don't have focus to still handle key presses. | 
|  | bool KeyPressListenersHandleEvent(const NativeWebKeyboardEvent& event); | 
|  |  | 
|  | // InputRouterClient | 
|  | 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 DidStartScrollingViewport() override; | 
|  | void OnSetCompositorAllowedTouchAction(cc::TouchAction) override {} | 
|  | void OnInvalidInputEventSource() override; | 
|  |  | 
|  | // Dispatch input events with latency information | 
|  | void DispatchInputEventWithLatencyInfo(const blink::WebInputEvent& event, | 
|  | ui::LatencyInfo* latency); | 
|  |  | 
|  | void WindowSnapshotReachedScreen(int snapshot_id); | 
|  |  | 
|  | void OnSnapshotFromSurfaceReceived(int snapshot_id, | 
|  | int retry_count, | 
|  | const SkBitmap& bitmap); | 
|  |  | 
|  | void OnSnapshotReceived(int snapshot_id, gfx::Image image); | 
|  |  | 
|  | // This message is received when the stylus writable element is focused. | 
|  | // It receives the focused edit element bounds and the current caret bounds | 
|  | // needed for stylus writing service. These bounds would be null when the | 
|  | // stylus writable element could not be focused. | 
|  | void OnEditElementFocusedForStylusWriting( | 
|  | const absl::optional<gfx::Rect>& focused_edit_bounds, | 
|  | const absl::optional<gfx::Rect>& caret_bounds); | 
|  |  | 
|  | // Called by the RenderProcessHost to handle the case when the process | 
|  | // changed its state of being blocked. | 
|  | void RenderProcessBlockedStateChanged(bool blocked); | 
|  |  | 
|  | // 1. Grants permissions to URL (if any) | 
|  | // 2. Grants permissions to filenames | 
|  | // 3. Grants permissions to file system files. | 
|  | // 4. Register the files with the IsolatedContext. | 
|  | void GrantFileAccessFromDropData(DropData* drop_data); | 
|  |  | 
|  | // Starts a hang monitor timeout. If there's already a hang monitor timeout | 
|  | // the new one will only fire if it has a shorter delay than the time | 
|  | // left on the existing timeouts. | 
|  | void StartInputEventAckTimeout(); | 
|  |  | 
|  | // Stops all existing hang monitor timeouts and assumes the renderer is | 
|  | // responsive. | 
|  | void StopInputEventAckTimeout(); | 
|  |  | 
|  | // Implementation of |hang_monitor_restarter| callback passed to | 
|  | // RenderWidgetHostDelegate::RendererUnresponsive if the unresponsiveness | 
|  | // was noticed because of input event ack timeout. | 
|  | void RestartInputEventAckTimeoutIfNecessary(); | 
|  |  | 
|  | // Called by |input_event_ack_timeout_| when an input event timed out without | 
|  | // getting an ack from the renderer. | 
|  | void OnInputEventAckTimeout(); | 
|  |  | 
|  | void SetupInputRouter(); | 
|  |  | 
|  | // Start intercepting system keyboard events. | 
|  | bool LockKeyboard(); | 
|  |  | 
|  | // Stop intercepting system keyboard events. | 
|  | void UnlockKeyboard(); | 
|  |  | 
|  | #if BUILDFLAG(IS_MAC) | 
|  | device::mojom::WakeLock* GetWakeLock(); | 
|  | #endif | 
|  |  | 
|  | // Returns a pointer to the touch emulator serving this host, but only if it | 
|  | // already exists; calling this function will not force creation of a | 
|  | // TouchEmulator. | 
|  | TouchEmulator* GetExistingTouchEmulator(); | 
|  |  | 
|  | void CreateSyntheticGestureControllerIfNecessary(); | 
|  |  | 
|  | // Converts the |window_point| from the coordinates in native window in DIP | 
|  | // to Blink's Viewport coordinates. They're identical in tradional world, | 
|  | // but will differ when use-zoom-for-dsf feature is enabled. | 
|  | // TODO(oshima): Update the comment when the migration is completed. | 
|  | gfx::PointF ConvertWindowPointToViewport(const gfx::PointF& window_point); | 
|  |  | 
|  | // The following functions are used to keep track of pending user activation | 
|  | // events, which are input events (e.g., mousedown or keydown) that allow a | 
|  | // renderer to gain user activation.  AddPendingUserActivation() increments | 
|  | // |pending_user_activation_counter_| and sets a timer, which allows the | 
|  | // renderer to claim user activation within | 
|  | // |kActivationNotificationExpireTime| ms.  ClearPendingUserActivation() | 
|  | // clears the counter and is called after navigations or timeouts. | 
|  | void AddPendingUserActivation(const blink::WebInputEvent& event); | 
|  | void ClearPendingUserActivation(); | 
|  |  | 
|  | // An expiry time for resetting the pending_user_activation_timer_. | 
|  | static const base::TimeDelta kActivationNotificationExpireTime; | 
|  |  | 
|  | raw_ptr<FrameTree, DanglingUntriaged> frame_tree_; | 
|  |  | 
|  | // RenderWidgetHost are either: | 
|  | // - Owned by RenderViewHostImpl. | 
|  | // - Owned by RenderFrameHost, for local root iframes. | 
|  | // - Self owned. Lifetime is managed from the renderer process, via Mojo IPC; | 
|  | //   This is used to implement: | 
|  | //   - Color Chooser popup. | 
|  | //   - Date/Time chooser popup. | 
|  | //   - Internal popup. Essentially, the <select> element popup. | 
|  | // | 
|  | // self_owned RenderWidgetHost are expected to be deleted using: | 
|  | // ShutdownAndDestroyWidget(true /* also_delete */); | 
|  | bool self_owned_; | 
|  |  | 
|  | // True while there is an established connection to a renderer-side Widget | 
|  | // object. | 
|  | bool renderer_widget_created_ = false; | 
|  | // When the renderer widget is created, if created by the renderer, it may | 
|  | // request to avoid showing the widget until requested. In that case, this | 
|  | // value is set to true, and we defer WasShown() events until the request | 
|  | // arrives which is signaled by Init(). | 
|  | bool waiting_for_init_; | 
|  |  | 
|  | // True if |Destroy()| has been called. | 
|  | bool destroyed_ = false; | 
|  |  | 
|  | // Our delegate, which wants to know mainly about keyboard events. | 
|  | // It will remain non-null until DetachDelegate() is called. | 
|  | raw_ptr<RenderWidgetHostDelegate> delegate_; | 
|  |  | 
|  | // The delegate of the owner of this object. | 
|  | // This member is non-null if and only if this RenderWidgetHost is associated | 
|  | // with a main frame RenderWidget. | 
|  | raw_ptr<RenderWidgetHostOwnerDelegate, DanglingUntriaged> owner_delegate_ = | 
|  | nullptr; | 
|  |  | 
|  | // AgentSchedulingGroupHost to be used for IPC with the corresponding | 
|  | // (renderer-side) AgentSchedulingGroup. Its channel may be nullptr if the | 
|  | // renderer crashed. We store it here as a separate reference instead of | 
|  | // dynamically fetching it from `site_instance_group_` since its | 
|  | // value gets cleared early in `SiteInstanceGroup` via | 
|  | // RenderProcessHostDestroyed before this object is destroyed. | 
|  | AgentSchedulingGroupHost& agent_scheduling_group_; | 
|  |  | 
|  | // The SiteInstanceGroup this RenderWidgetHost belongs to. | 
|  | base::SafeRef<SiteInstanceGroup> site_instance_group_; | 
|  |  | 
|  | // The ID of the corresponding object in the Renderer Instance. | 
|  | const int routing_id_; | 
|  |  | 
|  | // Indicates whether a page is hidden or not. Need to call | 
|  | // process_->UpdateClientPriority when this value changes. | 
|  | bool is_hidden_; | 
|  |  | 
|  | // For a widget that does not have an associated RenderFrame/View, assume it | 
|  | // is depth 1, ie just below the root widget. | 
|  | unsigned int frame_depth_ = 1u; | 
|  |  | 
|  | // Indicates that widget has a frame that intersects with the viewport. Note | 
|  | // this is independent of |is_hidden_|. For widgets not associated with | 
|  | // RenderFrame/View, assume false. | 
|  | bool intersects_viewport_ = false; | 
|  |  | 
|  | // One side of a pipe that is held open while the pointer is locked. | 
|  | // The other side is held be the renderer. | 
|  | mojo::Receiver<blink::mojom::PointerLockContext> mouse_lock_context_{this}; | 
|  |  | 
|  | #if BUILDFLAG(IS_ANDROID) | 
|  | // Tracks the current importance of widget. | 
|  | ChildProcessImportance importance_ = ChildProcessImportance::NORMAL; | 
|  | #endif | 
|  |  | 
|  | // True when waiting for visual_properties_ack. | 
|  | bool visual_properties_ack_pending_ = false; | 
|  |  | 
|  | // Visual properties that were most recently sent to the renderer. | 
|  | std::unique_ptr<blink::VisualProperties> old_visual_properties_; | 
|  |  | 
|  | // True if the render widget host should track the render widget's size as | 
|  | // opposed to visa versa. | 
|  | bool auto_resize_enabled_ = false; | 
|  | // The minimum size for the render widget if auto-resize is enabled. | 
|  | gfx::Size min_size_for_auto_resize_; | 
|  | // The maximum size for the render widget if auto-resize is enabled. | 
|  | gfx::Size max_size_for_auto_resize_; | 
|  |  | 
|  | // These properties are propagated down the RenderWidget tree from the main | 
|  | // frame to a child frame RenderWidgetHost. They are not used on a top-level | 
|  | // RenderWidgetHost. The child frame RenderWidgetHost stores these values to | 
|  | // pass them to the renderer, instead of computing them for itself. It | 
|  | // collects them and passes them though | 
|  | // blink::mojom::Widget::UpdateVisualProperties so that the renderer receives | 
|  | // updates in an atomic fashion along with a synchronization token for the | 
|  | // compositor in a LocalSurfaceId. | 
|  | struct MainFramePropagationProperties { | 
|  | MainFramePropagationProperties(); | 
|  | ~MainFramePropagationProperties(); | 
|  |  | 
|  | // The page-scale factor of the main-frame. | 
|  | float page_scale_factor = 1.f; | 
|  |  | 
|  | // This represents the child frame's raster scale factor which takes into | 
|  | // account the transform from child frame space to main frame space. | 
|  | float compositing_scale_factor = 1.f; | 
|  |  | 
|  | // True when the renderer is currently undergoing a pinch-zoom gesture. | 
|  | bool is_pinch_gesture_active = false; | 
|  |  | 
|  | // The size of the main frame's widget in DIP. | 
|  | gfx::Size visible_viewport_size; | 
|  |  | 
|  | gfx::Rect compositor_viewport; | 
|  |  | 
|  | // The logical segments of the root widget, in DIPs relative to the root | 
|  | // RenderWidgetHost. | 
|  | 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_; | 
|  |  | 
|  | // Keyboard event listeners. | 
|  | std::vector<KeyPressEventCallback> key_press_event_callbacks_; | 
|  |  | 
|  | // Mouse event callbacks. | 
|  | std::vector<MouseEventCallback> mouse_event_callbacks_; | 
|  |  | 
|  | // Suppress showing keyboard callbacks. | 
|  | std::vector<SuppressShowingImeCallback> suppress_showing_ime_callbacks_; | 
|  |  | 
|  | // Input event callbacks. | 
|  | base::ObserverList<RenderWidgetHost::InputEventObserver>::Unchecked | 
|  | input_event_observers_; | 
|  |  | 
|  | #if BUILDFLAG(IS_ANDROID) | 
|  | // Ime input event callbacks. This is separated from input_event_observers_, | 
|  | // because not all text events are triggered by input events on Android. | 
|  | base::ObserverList<RenderWidgetHost::InputEventObserver>::Unchecked | 
|  | ime_input_event_observers_; | 
|  | #endif | 
|  |  | 
|  | // The observers watching us. | 
|  | base::ObserverList<RenderWidgetHostObserver> observers_; | 
|  |  | 
|  | // This is true if the renderer is currently unresponsive. | 
|  | bool is_unresponsive_ = false; | 
|  |  | 
|  | // This value denotes the number of input events yet to be acknowledged | 
|  | // by the renderer. | 
|  | int in_flight_event_count_ = 0; | 
|  |  | 
|  | // Set when we update the text direction of the selected input element. | 
|  | bool text_direction_updated_ = false; | 
|  | base::i18n::TextDirection text_direction_ = base::i18n::LEFT_TO_RIGHT; | 
|  |  | 
|  | // Indicates if Char and KeyUp events should be suppressed or not. Usually all | 
|  | // events are sent to the renderer directly in sequence. However, if a | 
|  | // RawKeyDown event was handled by PreHandleKeyboardEvent() or | 
|  | // KeyPressListenersHandleEvent(), e.g. as an accelerator key, then the | 
|  | // RawKeyDown event is not sent to the renderer, and the following sequence of | 
|  | // Char and KeyUp events should also not be sent. Otherwise the renderer will | 
|  | // see only the Char and KeyUp events and cause unexpected behavior. For | 
|  | // example, pressing alt-2 may let the browser switch to the second tab, but | 
|  | // the Char event generated by alt-2 may also activate a HTML element if its | 
|  | // accesskey happens to be "2", then the user may get confused when switching | 
|  | // back to the original tab, because the content may already have changed. | 
|  | bool suppress_events_until_keydown_ = false; | 
|  |  | 
|  | bool pending_mouse_lock_request_ = false; | 
|  | bool mouse_lock_raw_movement_ = false; | 
|  | // Stores the keyboard keys to lock while waiting for a pending lock request. | 
|  | absl::optional<base::flat_set<ui::DomCode>> keyboard_keys_to_lock_; | 
|  | bool keyboard_lock_requested_ = false; | 
|  | bool keyboard_lock_allowed_ = false; | 
|  |  | 
|  | // Used when locking to indicate when a target application has voluntarily | 
|  | // unlocked and desires to relock the mouse. If the mouse is unlocked due | 
|  | // to ESC being pressed by the user, this will be false. | 
|  | bool is_last_unlocked_by_target_ = false; | 
|  |  | 
|  | // TODO(wjmaclean) Remove the code for supporting resending gesture events | 
|  | // when WebView transitions to OOPIF and BrowserPlugin is removed. | 
|  | // http://crbug.com/533069 | 
|  | 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_; | 
|  |  | 
|  | // Must be declared before `input_router_`. The latter is constructed by | 
|  | // borrowing a reference to this object, so it must be deleted first. | 
|  | std::unique_ptr<FlingSchedulerBase> fling_scheduler_; | 
|  |  | 
|  | // Receives and handles all input events. | 
|  | // Depends on `fling_scheduler` above, so it must be declared last. | 
|  | 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_; | 
|  |  | 
|  | // Indicates whether this RenderWidgetHost thinks is focused. This is trying | 
|  | // to match what the renderer process knows. It is different from | 
|  | // RenderWidgetHostView::HasFocus in that in that the focus request may fail, | 
|  | // causing HasFocus to return false when is_focused_ is true. | 
|  | bool is_focused_ = false; | 
|  |  | 
|  | // Indicates whether what the last focus active state that was sent to the | 
|  | // renderer. | 
|  | bool is_active_ = false; | 
|  |  | 
|  | // This value indicates how long to wait before we consider a renderer hung. | 
|  | base::TimeDelta hung_renderer_delay_; | 
|  |  | 
|  | // This value indicates how long to wait for a new compositor frame from a | 
|  | // renderer process before clearing any previously displayed content. | 
|  | base::TimeDelta new_content_rendering_delay_; | 
|  |  | 
|  | // When true, the RenderWidget is regularly sending updates regarding | 
|  | // composition info. It should only be true when there is a focused editable | 
|  | // node. | 
|  | bool monitoring_composition_info_ = false; | 
|  |  | 
|  | #if BUILDFLAG(IS_MAC) | 
|  | mojo::Remote<device::mojom::WakeLock> wake_lock_; | 
|  | #endif | 
|  |  | 
|  | // Stash a request to create a CompositorFrameSink if it arrives before we | 
|  | // have a view. | 
|  | 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_; | 
|  |  | 
|  | // True when the cursor has entered the autoscroll mode. A GSB is not | 
|  | // necessarily sent yet. | 
|  | bool autoscroll_in_progress_ = false; | 
|  |  | 
|  | // Counter for possible-activation-triggering input event. | 
|  | int pending_user_activation_counter_ = 0; | 
|  | // This timer resets |pending_user_activation_counter_| after a short delay. | 
|  | // See comments on Add/ClearPendingUserActivation(). | 
|  | base::OneShotTimer pending_user_activation_timer_; | 
|  |  | 
|  | std::unique_ptr<PeakGpuMemoryTracker> scroll_peak_gpu_mem_tracker_; | 
|  |  | 
|  | InputRouterImpl::RequestMouseLockCallback request_mouse_callback_; | 
|  |  | 
|  | // Parameters to pass to blink::mojom::Widget::WasShown after | 
|  | // `waiting_for_init_` becomes true. These are stored in a struct instead of | 
|  | // storing a callback so that they can be updated if | 
|  | // RequestPresentationTimeForNextFrame is called while waiting. | 
|  | 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_; | 
|  |  | 
|  | // If this is initialized with a frame this member will be valid and | 
|  | // can be used to send messages directly to blink. | 
|  | mojo::AssociatedReceiver<blink::mojom::FrameWidgetHost> | 
|  | blink_frame_widget_host_receiver_{this}; | 
|  | mojo::AssociatedRemote<blink::mojom::FrameWidget> blink_frame_widget_; | 
|  |  | 
|  | // If this is initialized with a popup this member will be valid and | 
|  | // manages the lifecycle of the popup in blink. | 
|  | 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_; | 
|  |  | 
|  | // Use for metrics reporting. Used to check if | 
|  | // OnRenderFrameMetadataChangedAfterActivation is being called for the first | 
|  | // time. | 
|  | bool first_surface_activated_ = false; | 
|  |  | 
|  | base::WeakPtrFactory<RenderWidgetHostImpl> weak_factory_{this}; | 
|  | }; | 
|  |  | 
|  | }  // namespace content | 
|  |  | 
|  | #endif  // CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_IMPL_H_ |