| // 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_VIEW_BASE_H_ |
| #define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_BASE_H_ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <memory> |
| #include <optional> |
| #include <string> |
| #include <vector> |
| |
| #include "base/functional/callback_forward.h" |
| #include "base/gtest_prod_util.h" |
| #include "base/i18n/rtl.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/observer_list.h" |
| #include "base/process/kill.h" |
| #include "base/time/time.h" |
| #include "build/build_config.h" |
| #include "components/input/event_with_latency_info.h" |
| #include "components/input/render_input_router.h" |
| #include "components/input/render_widget_host_view_input.h" |
| #include "components/viz/common/hit_test/hit_test_query.h" |
| #include "components/viz/common/surfaces/scoped_surface_id_allocator.h" |
| #include "components/viz/common/surfaces/surface_id.h" |
| #include "content/browser/renderer_host/display_feature.h" |
| #include "content/common/content_export.h" |
| #include "content/public/browser/render_frame_metadata_provider.h" |
| #include "content/public/browser/render_widget_host.h" |
| #include "content/public/browser/render_widget_host_view.h" |
| #include "content/public/common/page_visibility_state.h" |
| #include "content/public/common/widget_type.h" |
| #include "services/device/public/mojom/screen_orientation_lock_types.mojom.h" |
| #include "services/viz/public/mojom/hit_test/hit_test_region_list.mojom.h" |
| #include "third_party/blink/public/mojom/frame/fullscreen.mojom.h" |
| #include "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom-forward.h" |
| #include "third_party/blink/public/mojom/input/input_event_result.mojom-shared.h" |
| #include "third_party/blink/public/mojom/widget/record_content_to_visible_time_request.mojom.h" |
| #include "third_party/skia/include/core/SkImageInfo.h" |
| #include "ui/accessibility/ax_action_handler_registry.h" |
| #include "ui/base/ime/mojom/text_input_state.mojom-forward.h" |
| #include "ui/base/ime/text_input_mode.h" |
| #include "ui/base/ime/text_input_type.h" |
| #include "ui/display/display.h" |
| #include "ui/display/screen_infos.h" |
| #include "ui/events/blink/did_overscroll_params.h" |
| #include "ui/events/event_constants.h" |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/gfx/native_widget_types.h" |
| #include "ui/gfx/range/range.h" |
| #include "ui/surface/transport_dib.h" |
| #include "url/origin.h" |
| |
| namespace blink { |
| class WebMouseEvent; |
| class WebMouseWheelEvent; |
| } |
| |
| namespace ui { |
| class Compositor; |
| class Cursor; |
| class LatencyInfo; |
| enum class DomCode : uint32_t; |
| } // namespace ui |
| |
| namespace content { |
| |
| class DevicePosturePlatformProvider; |
| class MouseWheelPhaseHandler; |
| class RenderWidgetHostImpl; |
| class ScopedViewTransitionResources; |
| class TextInputManager; |
| class TouchSelectionControllerClientManager; |
| class TouchSelectionControllerInputObserver; |
| class WebContentsAccessibility; |
| class DelegatedFrameHost; |
| class SyntheticGestureTarget; |
| |
| // Basic implementation shared by concrete RenderWidgetHostView subclasses. |
| class CONTENT_EXPORT RenderWidgetHostViewBase |
| : public RenderWidgetHostView, |
| public input::RenderWidgetHostViewInput { |
| public: |
| // The TooltipObserver is used in browser tests only. |
| class CONTENT_EXPORT TooltipObserver { |
| public: |
| virtual ~TooltipObserver() = default; |
| |
| virtual void OnTooltipTextUpdated(const std::u16string& tooltip_text) = 0; |
| }; |
| |
| RenderWidgetHostViewBase(const RenderWidgetHostViewBase&) = delete; |
| RenderWidgetHostViewBase& operator=(const RenderWidgetHostViewBase&) = delete; |
| |
| // Returns the focused RenderWidgetHost inside this |view|'s RWH. |
| RenderWidgetHostImpl* GetFocusedWidget() const; |
| |
| // Create a platform specific SyntheticGestureTarget implementation that will |
| // be used to inject synthetic input events. |
| virtual std::unique_ptr<SyntheticGestureTarget> |
| CreateSyntheticGestureTarget() = 0; |
| |
| // RenderWidgetHostView implementation. |
| RenderWidgetHost* GetRenderWidgetHost() final; |
| ui::TextInputClient* GetTextInputClient() override; |
| void Show() final; |
| void WasUnOccluded() override {} |
| void WasOccluded() override {} |
| std::u16string GetSelectedText() override; |
| bool GetIsPointerLockedUnadjustedMovementForTesting() override; |
| bool CanBePointerLocked() override; |
| bool AccessibilityHasFocus() override; |
| bool LockKeyboard(std::optional<base::flat_set<ui::DomCode>> codes) override; |
| void SetBackgroundColor(SkColor color) override; |
| std::optional<SkColor> GetBackgroundColor() override; |
| void CopyBackgroundColorIfPresentFrom( |
| const RenderWidgetHostView& other) override; |
| void UnlockKeyboard() override; |
| bool IsKeyboardLocked() override; |
| base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override; |
| gfx::Size GetVisibleViewportSize() override; |
| gfx::Size GetVisibleViewportSizeDevicePx() override; |
| void SetInsets(const gfx::Insets& insets) override; |
| bool IsSurfaceAvailableForCopy() override; |
| void CopyFromSurface( |
| const gfx::Rect& src_rect, |
| const gfx::Size& output_size, |
| base::OnceCallback<void(const SkBitmap&)> callback) override; |
| std::unique_ptr<viz::ClientFrameSinkVideoCapturer> CreateVideoCapturer() |
| override; |
| display::ScreenInfo GetScreenInfo() const override; |
| display::ScreenInfos GetScreenInfos() const override; |
| virtual void ResetGestureDetection(); |
| |
| // RenderWidgetHostViewInput implementation |
| base::WeakPtr<input::RenderWidgetHostViewInput> GetInputWeakPtr() override; |
| input::RenderInputRouter* GetViewRenderInputRouter() override; |
| void ProcessMouseEvent(const blink::WebMouseEvent& event, |
| const ui::LatencyInfo& latency) override; |
| void ProcessMouseWheelEvent(const blink::WebMouseWheelEvent& event, |
| const ui::LatencyInfo& latency) override; |
| void ProcessTouchEvent(const blink::WebTouchEvent& event, |
| const ui::LatencyInfo& latency) override; |
| void ProcessGestureEvent(const blink::WebGestureEvent& event, |
| const ui::LatencyInfo& latency) override; |
| RenderWidgetHostViewBase* GetRootView() override; |
| void OnAutoscrollStart() override; |
| const viz::DisplayHitTestQueryMap& GetDisplayHitTestQuery() const override; |
| |
| float GetDeviceScaleFactor() const final; |
| bool IsPointerLocked() override; |
| |
| virtual void DidOverscroll(const ui::DidOverscrollParams& params) {} |
| |
| // Identical to `CopyFromSurface()`, except that this method issues the |
| // `viz::CopyOutputRequest` against the exact `viz::Surface` currently |
| // embedded by this View, while `CopyFromSurface()` may return a copy of any |
| // Surface associated with this View, generated after the current Surface. The |
| // caller is responsible for making sure that the target Surface is embedded |
| // and available for copy when this API is called. This Surface can be removed |
| // from the UI after this call. |
| // |
| // TODO(crbug.com/40276723): merge this API into `CopyFromSurface()`, |
| // and enable it fully on Android. |
| virtual void CopyFromExactSurface( |
| const gfx::Rect& src_rect, |
| const gfx::Size& output_size, |
| base::OnceCallback<void(const SkBitmap&)> callback); |
| |
| #if BUILDFLAG(IS_ANDROID) |
| virtual void CopyFromExactSurfaceWithIpcDelay( |
| const gfx::Rect& src_rect, |
| const gfx::Size& output_size, |
| base::OnceCallback<void(const SkBitmap&)> callback, |
| base::TimeDelta ipc_delay); |
| |
| // Returns whethere there's a touch sequence active on Viz. |
| // false: There's definitely no active touch sequence on Viz. |
| // true: A touch sequence is likely active on Viz, but could be a false |
| // positive in some racy conditions. |
| virtual bool IsTouchSequencePotentiallyActiveOnViz() = 0; |
| |
| virtual void RequestInputBackForDragAndDrop( |
| blink::mojom::DragDataPtr drag_data, |
| const url::Origin& source_origin, |
| blink::DragOperationsMask drag_operations_mask, |
| SkBitmap bitmap, |
| gfx::Vector2d cursor_offset_in_dip, |
| gfx::Rect drag_obj_rect_in_dip, |
| blink::mojom::DragEventSourceInfoPtr event_info) = 0; |
| #endif |
| |
| // For HiDPI capture mode, allow applying a render scale multiplier |
| // which modifies the effective device scale factor. Use a scale |
| // of 1.0f (exactly) to disable the feature after it was used. |
| void SetScaleOverrideForCapture(float scale); |
| float GetScaleOverrideForCapture() const; |
| |
| void EnableAutoResize(const gfx::Size& min_size, |
| const gfx::Size& max_size) override; |
| void DisableAutoResize(const gfx::Size& new_size) override; |
| TouchSelectionControllerClientManager* |
| GetTouchSelectionControllerClientManager() override; |
| ui::mojom::VirtualKeyboardMode GetVirtualKeyboardMode() override; |
| void NotifyVirtualKeyboardOverlayRect( |
| const gfx::Rect& keyboard_rect) override {} |
| void ShowInterestInElement(int) override {} |
| bool IsHTMLFormPopup() const override; |
| |
| // This only needs to be overridden by RenderWidgetHostViewBase subclasses |
| // that handle content embedded within other RenderWidgetHostViews. |
| gfx::PointF TransformPointToRootCoordSpaceF( |
| const gfx::PointF& point) const override; |
| |
| // Returns the value for whether the auto-resize has been enabled or not. |
| bool IsAutoResizeEnabled(); |
| |
| virtual void UpdateIntrinsicSizingInfo( |
| blink::mojom::IntrinsicSizingInfoPtr sizing_info); |
| |
| static void CopyMainAndPopupFromSurface( |
| base::WeakPtr<RenderWidgetHostImpl> main_host, |
| base::WeakPtr<DelegatedFrameHost> main_frame_host, |
| base::WeakPtr<RenderWidgetHostImpl> popup_host, |
| base::WeakPtr<DelegatedFrameHost> popup_frame_host, |
| const gfx::Rect& src_subrect, |
| const gfx::Size& dst_size, |
| float scale_factor, |
| base::OnceCallback<void(const SkBitmap&)> callback); |
| |
| void SetWidgetType(WidgetType widget_type); |
| |
| WidgetType GetWidgetType(); |
| |
| virtual void SendInitialPropertiesIfNeeded() {} |
| |
| // Called when screen information or native widget bounds change. |
| virtual void UpdateScreenInfo(); |
| |
| // Called by the TextInputManager to notify the view about being removed from |
| // the list of registered views, i.e., TextInputManager is no longer tracking |
| // TextInputState from this view. The RWHV should reset |text_input_manager_| |
| // to nullptr. |
| void DidUnregisterFromTextInputManager(TextInputManager* text_input_manager); |
| |
| // Informs the view that the renderer's visual properties have been updated |
| // and a new viz::LocalSurfaceId has been allocated. |
| virtual viz::ScopedSurfaceIdAllocator DidUpdateVisualProperties( |
| const cc::RenderFrameMetadata& metadata); |
| |
| base::WeakPtr<RenderWidgetHostViewBase> GetWeakPtr(); |
| |
| //---------------------------------------------------------------------------- |
| // The following methods can be overridden by derived classes. |
| |
| // Notifies the View that the renderer text selection has changed. |
| virtual void SelectionChanged(const std::u16string& text, |
| size_t offset, |
| const gfx::Range& range); |
| |
| // The requested size of the renderer. May differ from GetViewBounds().size() |
| // when the view requires additional throttling. |
| virtual gfx::Size GetRequestedRendererSize(); |
| virtual gfx::Size GetRequestedRendererSizeDevicePx(); |
| |
| // Returns the current capture sequence number. |
| virtual uint32_t GetCaptureSequenceNumber() const; |
| |
| // The size of the view's backing surface in non-DPI-adjusted pixels. |
| virtual gfx::Size GetCompositorViewportPixelSize(); |
| |
| virtual gfx::AcceleratedWidget AccessibilityGetAcceleratedWidget(); |
| virtual gfx::NativeViewAccessible AccessibilityGetNativeViewAccessible(); |
| virtual gfx::NativeViewAccessible |
| AccessibilityGetNativeViewAccessibleForWindow(); |
| virtual void SetMainFrameAXTreeID(ui::AXTreeID id) {} |
| // Informs that the focused DOM node has changed. |
| virtual void FocusedNodeChanged(bool is_editable_node, |
| const gfx::Rect& node_bounds_in_screen) {} |
| |
| // StylusInterface overrides |
| // Check if stylus writing can be started. |
| bool ShouldInitiateStylusWriting() override; |
| // Notify whether the hovered element action is stylus writable or not. |
| void NotifyHoverActionStylusWritable(bool stylus_writable) override {} |
| |
| // Invalidates the `viz::SurfaceAllocationGroup` of this View. Also |
| // invalidates `viz::SurfaceId` of it. This should be used when no previous |
| // frame drawn by this view is preferred as a fallback. |
| virtual void InvalidateLocalSurfaceIdAndAllocationGroup() = 0; |
| |
| // This method will clear any cached fallback surface. For use in response to |
| // a CommitPending where there is no content for TakeFallbackContentFrom. |
| virtual void ClearFallbackSurfaceForCommitPending() {} |
| // This method will reset the fallback to the first surface after navigation. |
| virtual void ResetFallbackToFirstNavigationSurface() = 0; |
| |
| // Requests a new CompositorFrame from the renderer. This is done by |
| // allocating a new viz::LocalSurfaceId which forces a commit and draw. |
| virtual bool RequestRepaintOnNewSurface(); |
| |
| // Subclass identifier for RenderWidgetHostViewChildFrames. This is useful |
| // to be able to know if this RWHV is embedded within another RWHV. If |
| // other kinds of embeddable RWHVs are created, this should be renamed to |
| // a more generic term -- in which case, static casts to RWHVChildFrame will |
| // need to also be resolved. |
| virtual bool IsRenderWidgetHostViewChildFrame() const; |
| |
| // Returns true if this view's size have been initialized. |
| virtual bool HasSize() const; |
| |
| // Returns true if the visual properties should be sent to the renderer at |
| // this time. This function is intended for subclasses to suppress |
| // synchronization, the default implementation returns true. |
| virtual bool CanSynchronizeVisualProperties(); |
| |
| // For an embedded widget, returns the cumulative effect of CSS zoom on the |
| // embedding element (e.g. <iframe>) and its ancestors. For a top-level |
| // widget, returns 1.0. |
| virtual double GetCSSZoomFactor() const; |
| |
| //---------------------------------------------------------------------------- |
| // The following methods are related to IME. |
| // TODO(ekaramad): Most of the IME methods should not stay virtual after IME |
| // is implemented for OOPIF. After fixing IME, mark the corresponding methods |
| // non-virtual (https://crbug.com/578168). |
| |
| // Updates the state of the input method attached to the view. |
| virtual void TextInputStateChanged( |
| const ui::mojom::TextInputState& text_input_state); |
| |
| // Cancel the ongoing composition of the input method attached to the view. |
| virtual void ImeCancelComposition(); |
| |
| // Notifies the view that the renderer selection bounds has changed. |
| // Selection bounds are described as a focus bound which is the current |
| // position of caret on the screen, as well as the anchor bound which is the |
| // starting position of the selection. `bounding_box` is the bounds of the |
| // rectangle enclosing the selection region. The coordinates are with respect |
| // to RenderWidget's window's origin. Focus and anchor bound are represented |
| // as gfx::Rect. |
| virtual 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); |
| |
| // Updates the range of the marked text in an IME composition, the visible |
| // line bounds, or both. |
| virtual void ImeCompositionRangeChanged( |
| const gfx::Range& range, |
| const std::optional<std::vector<gfx::Rect>>& character_bounds); |
| |
| //---------------------------------------------------------------------------- |
| // The following pure virtual methods are implemented by derived classes. |
| |
| // Perform all the initialization steps necessary for this object to represent |
| // a popup (such as a <select> dropdown), then shows the popup at |pos| using |
| // |anchor_rect|. See OwnedWindowAnchor in //ui/base/ui_base_types.h for more |
| // details. |
| virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, |
| const gfx::Rect& bounds, |
| const gfx::Rect& anchor_rect) = 0; |
| |
| // Indicates whether the page has finished loading. |
| virtual void SetIsLoading(bool is_loading) = 0; |
| |
| // Notifies the View that the renderer has ceased to exist. |
| virtual void RenderProcessGone() = 0; |
| |
| // `page_visibility` is kHiddenButPainting when the view is shown even though |
| // the web contents should be hidden, e.g., because a background tab is |
| // screen captured. |
| virtual void ShowWithVisibility(PageVisibilityState page_visibility) = 0; |
| |
| // Tells the View to destroy itself. |
| virtual void Destroy(); |
| |
| // Updates the tooltip text and its position and displays the requested |
| // tooltip on the screen. The |bounds| parameter corresponds to the bounds of |
| // the renderer-side element (in widget-relative DIPS) on which the tooltip |
| // should appear to be anchored. |
| virtual void UpdateTooltipFromKeyboard(const std::u16string& tooltip_text, |
| const gfx::Rect& bounds) {} |
| |
| // Hides tooltips that are still visible and were triggered from a keypress. |
| // Doesn't impact tooltips that were triggered from the cursor. |
| virtual void ClearKeyboardTriggeredTooltip() {} |
| |
| // Gets the bounds of the top-level window, in screen coordinates. |
| virtual gfx::Rect GetBoundsInRootWindow() = 0; |
| |
| // Increments the LocalSurfaceId associated with this view when a commit IPC |
| // is being sent to change the Document for the root RenderFrameHost rendering |
| // to this view. |
| // Note: Generally changing the SurfaceID is done using |
| // SynchronizeVisualProperties which also sends the updated SurfaceID to the |
| // renderer. However, for this API the caller is responsible for ensuring the |
| // new ID is synchronized with the renderer. |
| virtual const viz::LocalSurfaceId& IncrementSurfaceIdForNavigation(); |
| |
| // Dispatched when the a cross-document navigation happens in the primary main |
| // frame, and the old view is still visible. This API is called on the old |
| // view. |
| // |
| // "DidNavigate" means this API (and its post commit counterpart) is part of |
| // the browser's atomic "DidCommitNavigation" stack. "PreCommit" means the old |
| // view is still visible and the new view is still invisible. |
| // |
| // The platform-specific overrides should prepare for the old view about to be |
| // swapped out, which typically includes resetting the graphical states on the |
| // old view. |
| // |
| // This API shouldn't be called for a same-doc navigations. For the cross-doc |
| // navigations that don't swap the `RenderWidgetHostView`, the old and new |
| // views are the same. |
| virtual void OnOldViewDidNavigatePreCommit(); |
| |
| // Dispatched when the new primary main frame's `RenderWidgetHostView` is |
| // swapped in, and is made visible due to a cross-document navigation. This |
| // API is called on the new view. |
| // |
| // The platform-specific overrides should prepare for the new view about to be |
| // made visible, which typically includes cancelling any ongoing gesture |
| // events. |
| // |
| // Same as its pre commit counterpart: this API shouldn't be called for |
| // same-doc navigations, and the new view can be the same as the old view if |
| // the navigation does not swap the `RenderWidgetHostView`. |
| virtual void OnNewViewDidNavigatePostCommit(); |
| |
| // Gives a chance to the caller to perform some task AFTER the page is |
| // unloaded and stored in the BFCache. |
| virtual void DidEnterBackForwardCache() {} |
| |
| // Perform some tasks after the page is activated or evicted from BFCache. |
| virtual void ActivatedOrEvictedFromBackForwardCache() {} |
| |
| // Called by WebContentsImpl to notify the view about a change in visibility |
| // of context menu. The view can then perform platform specific tasks and |
| // changes. |
| virtual void SetShowingContextMenu(bool showing) {} |
| |
| // Gets the DisplayFeature whose offset and mask_length are expressed in DIPs |
| // relative to the view. See display_feature.h for more details. |
| virtual std::optional<DisplayFeature> GetDisplayFeature() = 0; |
| |
| // TODO(crbug.com/375388841): Update the comment once Aura also uses |
| // TouchSelecitonControllerInputObserver. |
| // This only returns non-null on root view on Android. |
| virtual TouchSelectionControllerInputObserver* |
| GetTouchSelectionControllerInputObserver(); |
| |
| virtual RenderWidgetHost::InputEventObserver* |
| GetInputTransferHandlerObserver(); |
| |
| // Disable the DisplayFeature emulation (if used) and restore the |
| // DisplayFeature of the device (if there is). |
| virtual void DisableDisplayFeatureOverrideForEmulation() = 0; |
| |
| // Override the DisplayFeature provided by the device (if there is) and |
| // replace it with the provided one. |
| virtual void OverrideDisplayFeatureForEmulation( |
| const DisplayFeature* display_feature) = 0; |
| |
| DevicePosturePlatformProvider* GetDevicePosturePlatformProvider(); |
| |
| // Returns the associated RenderWidgetHostImpl. |
| RenderWidgetHostImpl* host() const { return host_; } |
| |
| // Process swap messages sent before |frame_token| in RenderWidgetHostImpl. |
| void OnFrameTokenChangedForView(uint32_t frame_token, |
| base::TimeTicks activation_time); |
| |
| // Returns a reference to the current instance of TextInputManager. The |
| // reference is obtained from RenderWidgetHostDelegate. The first time a non- |
| // null reference is obtained, its value is cached in |text_input_manager_| |
| // and this view is registered with it. The RWHV will unregister from the |
| // TextInputManager if it is destroyed or if the TextInputManager itself is |
| // destroyed. The unregistration of the RWHV from TextInputManager is |
| // necessary and must be done by explicitly calling |
| // TextInputManager::Unregister. |
| // It is safer to use this method rather than directly dereferencing |
| // |text_input_manager_|. |
| TextInputManager* GetTextInputManager(); |
| |
| virtual void DidNavigate(); |
| |
| // Called when the RenderWidgetHostImpl establishes a connection to the |
| // renderer process Widget. |
| virtual void OnRendererWidgetCreated() {} |
| |
| virtual WebContentsAccessibility* GetWebContentsAccessibility(); |
| |
| void set_is_evicted() { is_evicted_ = true; } |
| void reset_is_evicted() { is_evicted_ = false; } |
| bool is_evicted() { return is_evicted_; } |
| |
| // SetContentBackgroundColor is called when the renderer wants to update the |
| // view's background color. |
| void SetContentBackgroundColor(SkColor color); |
| std::optional<SkColor> content_background_color() const { |
| return content_background_color_; |
| } |
| |
| void SetTooltipObserverForTesting(TooltipObserver* observer); |
| |
| virtual ui::Compositor* GetCompositor(); |
| |
| virtual void EnterFullscreenMode( |
| const blink::mojom::FullscreenOptions& options) {} |
| virtual void ExitFullscreenMode() {} |
| virtual void LockOrientation( |
| device::mojom::ScreenOrientationLockType orientation) {} |
| virtual void UnlockOrientation() {} |
| virtual void SetHasPersistentVideo(bool has_persistent_video) {} |
| |
| bool HasFallbackSurfaceForTesting() const { return HasFallbackSurface(); } |
| |
| void SetIsFrameSinkIdOwner(bool is_owner); |
| |
| void SetViewTransitionResources( |
| std::unique_ptr<ScopedViewTransitionResources> resources); |
| bool HasViewTransitionResourcesForTesting() const { |
| return !!view_transition_resources_; |
| } |
| |
| virtual viz::SurfaceId GetFallbackSurfaceIdForTesting() const; |
| |
| protected: |
| explicit RenderWidgetHostViewBase(RenderWidgetHost* host); |
| ~RenderWidgetHostViewBase() override; |
| |
| bool is_frame_sink_id_owner() const { return is_frame_sink_id_owner_; } |
| |
| virtual MouseWheelPhaseHandler* GetMouseWheelPhaseHandler(); |
| |
| // RenderWidgetHostViewInput implementations. |
| void UpdateFrameSinkIdRegistration() override; |
| |
| // Applies background color without notifying the RenderWidget about |
| // opaqueness changes. This allows us to, when navigating to a new page, |
| // transfer this color to that page. This allows us to pass this background |
| // color to new views on navigation. |
| virtual void UpdateBackgroundColor() = 0; |
| |
| virtual bool HasFallbackSurface() const; |
| |
| // Checks the combination of RenderWidgetHostImpl hidden state and |
| // `page_visibility` and calls NotifyHostAndDelegateOnWasShown, |
| // RequestSuccessfulPresentationTimeFromHostOrDelegate or |
| // CancelSuccessfulPresentationTimeRequestForHostAndDelegate as appropriate. |
| // |
| // This starts and stops tab switch latency measurements as needed so most |
| // platforms should call this from ShowWithVisibility. Android does not |
| // implement tab switch latency measurements so it calls |
| // RenderWidgetHostImpl::WasShown and DelegatedFrameHost::WasShown directly |
| // instead. |
| void OnShowWithPageVisibility(PageVisibilityState page_visibility); |
| |
| void UpdateSystemCursorSize(const gfx::Size& cursor_size); |
| |
| // Updates the active state by replicating it to the renderer. |
| void UpdateActiveState(bool active); |
| |
| // Each platform should override this to make sure its UI compositor is |
| // visible. |
| virtual void EnsurePlatformVisibility(PageVisibilityState page_visibility) {} |
| |
| // Each platform should override this to call RenderWidgetHostImpl::WasShown |
| // and DelegatedFrameHost::WasShown, and do any platform-specific bookkeeping |
| // needed. The given `visible_time_request`, if any, should be passed to |
| // DelegatedFrameHost::WasShown if there is a saved frame or |
| // RenderWidgetHostImpl if not. |
| virtual void NotifyHostAndDelegateOnWasShown( |
| blink::mojom::RecordContentToVisibleTimeRequestPtr |
| visible_time_request) = 0; |
| |
| // Each platform should override this to pass `visible_time_request`, which |
| // will never be null, to |
| // DelegatedFrameHost::RequestSuccessfulPresentationTimeForNextFrame if there |
| // is a saved frame or |
| // RenderWidgetHostImpl::RequestSuccessfulPresentationTimeForNextFrame if not, |
| // after doing and platform-specific bookkeeping needed. |
| virtual void RequestSuccessfulPresentationTimeFromHostOrDelegate( |
| blink::mojom::RecordContentToVisibleTimeRequestPtr |
| visible_time_request) = 0; |
| |
| // Each platform should override this to call |
| // DelegatedFrameHost::CancelSuccessfulPresentationTimeRequest and |
| // RenderWidgetHostImpl::CancelSuccessfulPresentationTimeRequest, after doing |
| // and platform-specific bookkeeping needed. |
| virtual void CancelSuccessfulPresentationTimeRequestForHostAndDelegate() = 0; |
| |
| // The model object. Access is protected to allow access to |
| // RenderWidgetHostViewChildFrame. |
| raw_ptr<RenderWidgetHostImpl, DanglingUntriaged> host_; |
| |
| // Whether this view is a frame or a popup. |
| WidgetType widget_type_ = WidgetType::kFrame; |
| |
| // Cached information about the renderer's display environment. |
| display::ScreenInfos screen_infos_; |
| |
| float scale_override_for_capture_ = 1.0f; |
| |
| // Indicates whether keyboard lock is active for this view. |
| bool keyboard_locked_ = false; |
| |
| // Indicates whether the scroll offset of the root layer is at top, i.e., |
| // whether scroll_offset.y() == 0. |
| bool is_scroll_offset_at_top_ = true; |
| |
| // A reference to current TextInputManager instance this RWHV is registered |
| // with. This is initially nullptr until the first time the view calls |
| // GetTextInputManager(). It also becomes nullptr when TextInputManager is |
| // destroyed before the RWHV is destroyed. |
| raw_ptr<TextInputManager> text_input_manager_ = nullptr; |
| |
| // The background color used in the current renderer. |
| std::optional<SkColor> content_background_color_; |
| |
| // The default background color used before getting the |
| // |content_background_color|. |
| std::optional<SkColor> default_background_color_; |
| |
| raw_ptr<TooltipObserver> tooltip_observer_for_testing_ = nullptr; |
| |
| // Cursor size in logical pixels, obtained from the OS. This value is general |
| // to all displays. |
| gfx::Size system_cursor_size_; |
| |
| private: |
| FRIEND_TEST_ALL_PREFIXES( |
| BrowserSideFlingBrowserTest, |
| EarlyTouchscreenFlingCancelationOnInertialGSUAckNotConsumed); |
| FRIEND_TEST_ALL_PREFIXES( |
| BrowserSideFlingBrowserTest, |
| EarlyTouchpadFlingCancelationOnInertialGSUAckNotConsumed); |
| FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostDelegatedInkMetadataTest, |
| FlagGetsSetFromRenderFrameMetadata); |
| FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostInputEventRouterTest, |
| QueryResultAfterChildViewDead); |
| FRIEND_TEST_ALL_PREFIXES(DelegatedInkPointTest, EventForwardedToCompositor); |
| FRIEND_TEST_ALL_PREFIXES(DelegatedInkPointTest, |
| MojoInterfaceReboundOnDisconnect); |
| FRIEND_TEST_ALL_PREFIXES(NoCompositingRenderWidgetHostViewBrowserTest, |
| NoFallbackAfterHiddenNavigationFails); |
| FRIEND_TEST_ALL_PREFIXES(NoCompositingRenderWidgetHostViewBrowserTest, |
| NoFallbackIfSwapFailedBeforeNavigation); |
| |
| void SynchronizeVisualProperties(); |
| |
| // Generates the most current set of ScreenInfos from the current set of |
| // displays in the system for use in UpdateScreenInfo. |
| display::ScreenInfos GetNewScreenInfosForUpdate(); |
| |
| // Called when display properties that need to be synchronized with the |
| // renderer process changes. This method is called before notifying |
| // RenderWidgetHostImpl in order to allow the view to allocate a new |
| // LocalSurfaceId. |
| virtual void OnSynchronizedDisplayPropertiesChanged(bool rotation = false) {} |
| |
| // Helper function to return whether the current background color is fully |
| // opaque. |
| bool IsBackgroundColorOpaque(); |
| |
| bool is_evicted_ = false; |
| |
| bool is_frame_sink_id_owner_ = false; |
| |
| std::unique_ptr<ScopedViewTransitionResources> view_transition_resources_; |
| |
| base::WeakPtrFactory<RenderWidgetHostViewBase> weak_factory_{this}; |
| }; |
| |
| } // namespace content |
| |
| #endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_BASE_H_ |