blob: 0798e63b969ebd92529c1a562f1ff03c18f5390e [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_FRAME_WIDGET_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_FRAME_WIDGET_H_
#include <optional>
#include <vector>
#include "base/time/time.h"
#include "base/types/optional_ref.h"
#include "cc/input/browser_controls_offset_tag_modifications.h"
#include "mojo/public/mojom/base/text_direction.mojom-blink.h"
#include "services/viz/public/mojom/compositing/frame_sink_id.mojom-blink.h"
#include "third_party/blink/public/mojom/input/input_handler.mojom-blink.h"
#include "third_party/blink/public/mojom/manifest/display_mode.mojom-blink.h"
#include "third_party/blink/public/platform/web_text_input_info.h"
#include "third_party/blink/public/platform/web_text_input_type.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "ui/base/ime/mojom/text_input_state.mojom-blink.h"
#include "ui/base/ime/mojom/virtual_keyboard_types.mojom-blink.h"
#include "ui/base/mojom/window_show_state.mojom-blink-forward.h"
#include "ui/gfx/mojom/delegated_ink_metadata.mojom-blink.h"
namespace cc {
class AnimationHost;
class AnimationTimeline;
class DrawImage;
enum class EventListenerClass;
enum class EventListenerProperties;
class Layer;
class LayerTreeSettings;
class LayerTreeDebugState;
struct ElementId;
} // namespace cc
namespace display {
struct ScreenInfo;
struct ScreenInfos;
} // namespace display
namespace ui {
class Cursor;
} // namespace ui
namespace viz {
class FrameTimingDetails;
} // namespace viz
namespace blink {
class AnimationFrameTimingInfo;
class LocalFrame;
// In interface exposed within Blink from local root frames that provides
// local-root specific things related to compositing and input. This
// class extends the FrameWidgetInputHandler implementation. All API calls
// on this class occur on the main thread. input/FrameWidgetInputHandlerImpl
// which also implements the FrameWidgetInputHandler interface runs on the
// compositor thread and proxies calls to this class.
class PLATFORM_EXPORT FrameWidget {
public:
virtual ~FrameWidget();
// Returns the compositors's AnimationHost for the widget.
virtual cc::AnimationHost* AnimationHost() const = 0;
// Returns the compositors's AnimationTimeline for the widget.
virtual cc::AnimationTimeline* ScrollAnimationTimeline() const = 0;
// Set the browser's behavior when overscroll happens, e.g. whether to glow
// or navigate.
virtual void SetOverscrollBehavior(
const cc::OverscrollBehavior& overscroll_behavior) = 0;
// Posts a task with the given delay, then requests an animation frame from
// the compositor (ie LayerTreeHost::SetNeedsAnimate()).
virtual void RequestAnimationAfterDelay(const base::TimeDelta&,
bool urgent) = 0;
// Sets the root layer. The |layer| can be null when detaching the root layer.
virtual void SetRootLayer(scoped_refptr<cc::Layer> layer) = 0;
// Image decode functionality.
virtual void RequestDecode(const cc::DrawImage&,
base::OnceCallback<void(bool)>,
bool speculative) = 0;
// Forwards to `WebFrameWidget::NotifyPresentationTime()`.
// `presentation_callback` will be fired when the corresponding renderer frame
// is presented to the user. If the presentation is successful, the argument
// passed to the callback is the presentation timestamp; otherwise, it would
// be timestamp of when the failure is detected.
virtual void NotifyPresentationTime(
base::OnceCallback<void(const viz::FrameTimingDetails&)>
presentation_callback) = 0;
// A stable numeric Id for the local root's compositor. For tracing/debugging
// purposes.
virtual int GetLayerTreeId() = 0;
// Return the LayerTreeSettings from the compositor. These are constant from
// the time the compositor is created. This may return null if the widget
// does not composite.
virtual const cc::LayerTreeSettings* GetLayerTreeSettings() = 0;
// Sets the state of the browser controls. (Used for URL bar animations.)
virtual void UpdateBrowserControlsState(
cc::BrowserControlsState constraints,
cc::BrowserControlsState current,
bool animate,
base::optional_ref<const cc::BrowserControlsOffsetTagModifications>
offset_tag_modifications) = 0;
// Set or get what event handlers exist in the document contained in the
// WebWidget in order to inform the compositor thread if it is able to handle
// an input event, or it needs to pass it to the main thread to be handled.
// The class is the type of input event, and for each class there is a
// properties defining if the compositor thread can handle the event.
virtual void SetEventListenerProperties(cc::EventListenerClass,
cc::EventListenerProperties) = 0;
virtual cc::EventListenerProperties EventListenerProperties(
cc::EventListenerClass) const = 0;
// Returns the DisplayMode in use for the widget.
virtual mojom::blink::DisplayMode DisplayMode() const = 0;
// Returns the WindowShowState in use for the widget.
virtual ui::mojom::blink::WindowShowState WindowShowState() const = 0;
// Returns the CanResize value of the widget.
virtual bool Resizable() const = 0;
// Returns the viewport segments for the widget.
virtual const std::vector<gfx::Rect>& ViewportSegments() const = 0;
// Sets the ink metadata on the layer tree host
virtual void SetDelegatedInkMetadata(
std::unique_ptr<gfx::DelegatedInkMetadata> metadata) = 0;
// For a scrollbar scroll action, requests that a gesture of |injected_type|
// be reissued at a later point in time. |injected_type| is required to be one
// of GestureScroll{Begin,Update,End}. The dispatched gesture will scroll the
// ScrollableArea identified by |scrollable_area_element_id| by the given
// delta + granularity.
// See also InputHandlerProxy::InjectScrollbarGestureScroll() which may
// shortcut callers of this function for composited scrollbars.
virtual void InjectScrollbarGestureScroll(
const gfx::Vector2dF& delta,
ui::ScrollGranularity granularity,
cc::ElementId scrollable_area_element_id,
WebInputEvent::Type injected_type) = 0;
// Called when the cursor for the widget changes.
virtual void DidChangeCursor(const ui::Cursor&) = 0;
// Return the composition character in window coordinates.
virtual void GetCompositionCharacterBoundsInWindow(
Vector<gfx::Rect>* bounds_in_dips) = 0;
virtual bool HasImeRenderWidgetHost() const { return false; }
// Called to send new cursor anchor info data to the browser.
virtual void UpdateCursorAnchorInfo(bool update_requested) = 0;
virtual gfx::Range CompositionRange() = 0;
// Returns ime_text_spans and corresponding window coordinates for the list
// of given spans.
virtual Vector<ui::mojom::blink::ImeTextSpanInfoPtr> GetImeTextSpansInfo(
const std::vector<ui::ImeTextSpan>& ime_text_spans) = 0;
virtual WebTextInputInfo TextInputInfo() = 0;
virtual ui::mojom::blink::VirtualKeyboardVisibilityRequest
GetLastVirtualKeyboardVisibilityRequest() = 0;
// Return the edit context bounds in window coordinates.
virtual void GetEditContextBoundsInWindow(
std::optional<gfx::Rect>* control_bounds,
std::optional<gfx::Rect>* selection_bounds) = 0;
virtual int32_t ComputeWebTextInputNextPreviousFlags() = 0;
virtual void ResetVirtualKeyboardVisibilityRequest() = 0;
// Return the selection bounds in window coordinates. Returns true if the
// bounds returned were different than the passed in focus and anchor bounds.
virtual bool GetSelectionBoundsInWindow(gfx::Rect* focus,
gfx::Rect* anchor,
gfx::Rect* bounding_box,
base::i18n::TextDirection* focus_dir,
base::i18n::TextDirection* anchor_dir,
bool* is_anchor_first) = 0;
// Clear any cached text input state.
virtual void ClearTextInputState() = 0;
// This message sends a string being composed with an input method.
virtual bool SetComposition(const String& text,
const Vector<ui::ImeTextSpan>& ime_text_spans,
const gfx::Range& replacement_range,
int selection_start,
int selection_end) = 0;
// This message deletes the current composition, inserts specified text, and
// moves the cursor.
virtual void CommitText(const String& text,
const Vector<ui::ImeTextSpan>& ime_text_spans,
const gfx::Range& replacement_range,
int relative_cursor_pos) = 0;
// This message inserts the ongoing composition.
virtual void FinishComposingText(bool keep_selection) = 0;
virtual bool IsProvisional() = 0;
virtual cc::ElementId GetScrollableContainerIdAt(
const gfx::PointF& point) = 0;
virtual bool ShouldHandleImeEvents() { return false; }
virtual void SetEditCommandsForNextKeyEvent(
Vector<mojom::blink::EditCommandPtr> edit_commands) = 0;
// Returns information about the screen currently showing the widget.
virtual const display::ScreenInfo& GetScreenInfo() = 0;
// Returns information about available screens and the current screen.
virtual const display::ScreenInfos& GetScreenInfos() = 0;
// Returns information about the screen that would be showing the widget
// without DevTools emulation applied.
virtual const display::ScreenInfo& GetOriginalScreenInfo() = 0;
// Called to get the position of the widget's window in screen
// coordinates. Note, the window includes any decorations such as borders,
// scrollbars, URL bar, tab strip, etc. if they exist.
virtual gfx::Rect WindowRect() = 0;
// Called to get the view rect in screen coordinates. This is the actual
// content view area, i.e. doesn't include any window decorations.
virtual gfx::Rect ViewRect() = 0;
// Converts from Blink coordinate (ie. Viewport/Physical pixels) space to
// DIPs.
virtual gfx::RectF BlinkSpaceToDIPs(const gfx::RectF&) = 0;
virtual gfx::Rect BlinkSpaceToEnclosedDIPs(const gfx::Rect&) = 0;
virtual gfx::Size BlinkSpaceToFlooredDIPs(const gfx::Size& size) = 0;
// Converts from DIPs to Blink coordinate space (ie. Viewport/Physical
// pixels).
virtual gfx::PointF DIPsToBlinkSpace(const gfx::PointF& point) = 0;
virtual gfx::Point DIPsToRoundedBlinkSpace(const gfx::Point& point) = 0;
virtual float DIPsToBlinkSpace(float scalar) = 0;
virtual void RequestMouseLock(
bool has_transient_user_activation,
bool request_unadjusted_movement,
mojom::blink::WidgetInputHandlerHost::RequestMouseLockCallback
callback) = 0;
// Mouse capture has been lost.
virtual void MouseCaptureLost() = 0;
// Determines whether composition can happen inline.
virtual bool CanComposeInline() = 0;
// Determines if IME events should be sent to Plugin instead of processed to
// the currently focused frame.
virtual bool ShouldDispatchImeEventsToPlugin() = 0;
// Set the composition in plugin.
virtual void ImeSetCompositionForPlugin(
const String& text,
const Vector<ui::ImeTextSpan>& ime_text_spans,
const gfx::Range& replacement_range,
int selection_start,
int selection_end) = 0;
// Commit the text to plugin.
virtual void ImeCommitTextForPlugin(
const String& text,
const Vector<ui::ImeTextSpan>& ime_text_spans,
const gfx::Range& replacement_range,
int relative_cursor_pos) = 0;
// Indicate composition is complete to plugin.
virtual void ImeFinishComposingTextForPlugin(bool keep_selection) = 0;
// Returns the FrameSinkId for this widget which is used for identifying
// frames submitted from the compositor.
virtual const viz::FrameSinkId& GetFrameSinkId() = 0;
// Returns the raster scale factor for the local root frame associated with
// this widget, taking into account its transform to main frame space.
virtual float GetCompositingScaleFactor() = 0;
// Get and set the configuration for the debugging overlay managed by the
// underlying LayerTreeHost. This may return null if the widget does not
// composite.
virtual const cc::LayerTreeDebugState* GetLayerTreeDebugState() = 0;
virtual void SetLayerTreeDebugState(const cc::LayerTreeDebugState& state) = 0;
// Set whether or not this widget should be throttled if it sends
// CompositorFrames while widget is hidden. By default, it should throttle,
// since we should be smart enough not to send them. However,
// PictureInPicture requires that we are allowed to continue to produce
// CompositorFrames even if they're discarded by viz, since those frames are a
// by-product of producing the content that does make it to the picture-in-
// picture window. Ideally, we would know not to send the extra
// CompositorFrames. See https://crbug.com/1232173 for more details.
virtual void SetMayThrottleIfUndrawnFrames(
bool may_throttle_if_undrawn_frames) = 0;
// Returns, in physical pixels, the amount that the widget has been resized
// by the virtual keyboard. The virtual keyboard always insets a widget from
// the bottom so only the height can be affected. Only the outermost main
// frame's widget returns a non-zero value.
virtual int GetVirtualKeyboardResizeHeight() const = 0;
virtual void OnTaskCompletedForFrame(base::TimeTicks start_time,
base::TimeTicks end_time,
LocalFrame*) = 0;
// Implementation of
// https://w3c.github.io/long-animation-frames/#record-rendering-time (the
// other parameters are recorded earlier).
virtual AnimationFrameTimingInfo* RecordRenderingUpdateEndTime(
base::TimeTicks) = 0;
virtual void OnFirstContentfulPaint(
const base::TimeTicks& first_paint_time) = 0;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_FRAME_WIDGET_H_