blob: 1756d6af0154d9c7e31a9af18aee24a6a84231c7 [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_WIDGET_BASE_CLIENT_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_CLIENT_H_
#include <vector>
#include "base/time/time.h"
#include "cc/metrics/begin_main_frame_metrics.h"
#include "cc/metrics/frame_sequence_tracker_collection.h"
#include "cc/metrics/web_vital_metrics.h"
#include "cc/paint/element_id.h"
#include "cc/trees/layer_tree_host_client.h"
#include "third_party/blink/public/common/metrics/document_update_reason.h"
#include "third_party/blink/public/mojom/input/input_handler.mojom-blink.h"
#include "third_party/blink/public/platform/web_input_event_result.h"
#include "third_party/blink/public/platform/web_text_input_type.h"
#include "third_party/blink/public/web/web_lifecycle_update.h"
#include "third_party/blink/renderer/platform/widget/input/input_handler_proxy.h"
#include "ui/display/mojom/screen_orientation.mojom-blink.h"
namespace cc {
class LayerTreeFrameSink;
struct BeginMainFrameMetrics;
struct WebVitalMetrics;
} // namespace cc
namespace blink {
class FrameWidget;
class WebGestureEvent;
class WebMouseEvent;
// This class is part of the foundation of all widgets. It provides
// callbacks from the compositing infrastructure that the individual widgets
// will need to implement.
class WidgetBaseClient {
public:
// Called when a compositing update is first requested.
virtual void OnCommitRequested() {}
// Called to record the time taken to dispatch rAF aligned input.
virtual void RecordDispatchRafAlignedInputTime(
base::TimeTicks raf_aligned_input_start_time) {}
// Called to update the document lifecycle, advance the state of animations
// and dispatch rAF.
virtual void BeginMainFrame(base::TimeTicks frame_time) = 0;
// Requests that the lifecycle of the widget be updated.
virtual void UpdateLifecycle(WebLifecycleUpdate requested_update,
DocumentUpdateReason reason) = 0;
// TODO(crbug.com/704763): Remove the need for this.
virtual void SetSuppressFrameRequestsWorkaroundFor704763Only(bool) {}
// Called when main frame metrics are desired. The local frame's UKM
// aggregator must be informed that collection is starting for the
// frame.
virtual void RecordStartOfFrameMetrics() {}
// Called when a main frame time metric should be emitted, along with
// any metrics that depend upon the main frame total time.
virtual void RecordEndOfFrameMetrics(
base::TimeTicks frame_begin_time,
cc::ActiveFrameSequenceTrackers trackers) {}
// Return metrics information for the stages of BeginMainFrame. This is
// ultimately implemented by Blink's LocalFrameUKMAggregator. It must be a
// distinct call from the FrameMetrics above because the BeginMainFrameMetrics
// for compositor latency must be gathered before the layer tree is
// committed to the compositor, which is before the call to
// RecordEndOfFrameMetrics.
virtual std::unique_ptr<cc::BeginMainFrameMetrics>
GetBeginMainFrameMetrics() {
return nullptr;
}
virtual std::unique_ptr<cc::WebVitalMetrics> GetWebVitalMetrics() {
return nullptr;
}
// Methods called to mark the beginning and end of the
// LayerTreeHost::UpdateLayers method. Only called when gathering main frame
// UMA and UKM. That is, when RecordStartOfFrameMetrics has been called, and
// before RecordEndOfFrameMetrics has been called.
virtual void BeginUpdateLayers() {}
virtual void EndUpdateLayers() {}
// Methods called to mark the beginning and end of a commit to the impl
// thread for a frame. Only called when gathering main frame
// UMA and UKM. That is, when RecordStartOfFrameMetrics has been called, and
// before RecordEndOfFrameMetrics has been called.
virtual void BeginCommitCompositorFrame() {}
virtual void EndCommitCompositorFrame(base::TimeTicks commit_start_time,
base::TimeTicks commit_finish_time) {}
// Applies viewport related properties during a commit from the compositor
// thread.
virtual void ApplyViewportChanges(const cc::ApplyViewportChangesArgs& args) {}
virtual void UpdateCompositorScrollState(
const cc::CompositorCommitData& commit_data) {}
// Notifies that the layer tree host has completed a call to
// RequestMainFrameUpdate in response to a BeginMainFrame.
virtual void DidBeginMainFrame() {}
virtual void DidCommitAndDrawCompositorFrame() {}
virtual void DidObserveFirstScrollDelay(
base::TimeDelta first_scroll_delay,
base::TimeTicks first_scroll_timestamp) {}
virtual void WillBeginMainFrame() {}
virtual void DidCompletePageScaleAnimation() {}
// Allocates a LayerTreeFrameSink to submit CompositorFrames to. Only
// override this method if you wish to provide your own implementation
// of LayerTreeFrameSinks (usually for tests). If this method returns null
// a frame sink will be requested from the browser process (ie. default flow)
virtual std::unique_ptr<cc::LayerTreeFrameSink>
AllocateNewLayerTreeFrameSink() = 0;
virtual void FocusChangeComplete() {}
virtual WebInputEventResult DispatchBufferedTouchEvents() = 0;
virtual WebInputEventResult HandleInputEvent(
const WebCoalescedInputEvent&) = 0;
virtual bool SupportsBufferedTouchEvents() = 0;
virtual void DidHandleKeyEvent() {}
virtual void WillHandleGestureEvent(const WebGestureEvent& event,
bool* suppress) = 0;
virtual void WillHandleMouseEvent(const WebMouseEvent& event) = 0;
virtual void ObserveGestureEventAndResult(
const WebGestureEvent& gesture_event,
const gfx::Vector2dF& unused_delta,
const cc::OverscrollBehavior& overscroll_behavior,
bool event_processed) = 0;
virtual WebTextInputType GetTextInputType() {
return WebTextInputType::kWebTextInputTypeNone;
}
// Called to inform the Widget of the mouse cursor's visibility.
virtual void SetCursorVisibilityState(bool is_visible) {}
// The FrameWidget interface if this is a FrameWidget.
virtual blink::FrameWidget* FrameWidget() { return nullptr; }
// Called to inform the Widget that it has gained or lost keyboard focus.
virtual void FocusChanged(mojom::blink::FocusState focus_state) {}
// Call to request an animation frame from the compositor.
virtual void ScheduleAnimation() {}
// TODO(bokan): Temporary to unblock synthetic gesture events running under
// VR. https://crbug.com/940063
virtual bool ShouldAckSyntheticInputImmediately() { return false; }
// Apply the visual properties.
virtual void UpdateVisualProperties(
const VisualProperties& visual_properties) = 0;
// A callback to apply the updated screen rects, return true if it
// was handled. If not handled WidgetBase will apply the screen
// rects as the new values.
virtual bool UpdateScreenRects(const gfx::Rect& widget_screen_rect,
const gfx::Rect& window_screen_rect) {
return false;
}
// Convert screen coordinates to device emulated coordinates (scaled
// coordinates when devtools is used). This occurs for popups where their
// window bounds are emulated.
virtual void ScreenRectToEmulated(gfx::Rect& screen_rect) {}
virtual void EmulatedToScreenRect(gfx::Rect& screen_rect) {}
// Signal the orientation has changed.
virtual void OrientationChanged() {}
// Return the original (non-emulated) screen infos.
virtual const display::ScreenInfos& GetOriginalScreenInfos() = 0;
// Indication that the surface and screen were updated.
virtual void DidUpdateSurfaceAndScreen(
const display::ScreenInfos& previous_original_screen_infos) {}
// Return the viewport visible rect.
virtual gfx::Rect ViewportVisibleRect() = 0;
// The screen orientation override.
virtual absl::optional<display::mojom::blink::ScreenOrientation>
ScreenOrientationOverride() {
return absl::nullopt;
}
// Return the overridden device scale factor for testing.
virtual float GetTestingDeviceScaleFactorOverride() { return 0.f; }
// Test-specific methods below this point.
virtual void ScheduleAnimationForWebTests() {}
// Inform the widget that it was hidden.
virtual void WasHidden() {}
// Inform the widget that it was shown.
virtual void WasShown(bool was_evicted) {}
virtual void RunPaintBenchmark(int repeat_count,
cc::PaintBenchmarkResult& result) {}
// Called to indicate a synthetic event was queued.
virtual void WillQueueSyntheticEvent(const WebCoalescedInputEvent& event) {}
// When the WebWidget is part of a frame tree, returns the active url for
// main frame of that tree, if the main frame is local in that tree. When
// the WebWidget is of a different kind (e.g. a popup) it returns the active
// url for the main frame of the frame tree that spawned the WebWidget, if
// the main frame is local in that tree. When the relevant main frame is
// remote in that frame tree, then the url is not known, and an empty url is
// returned.
virtual KURL GetURLForDebugTrace() = 0;
// In EventTiming, we count the events invoked by user interactions. Some
// touchstarts will be dropped before they get sent to the main thread.
// Meanwhile, the corresponding pointerdown will not be fired. The following
// pointerup will be captured in pointer_event_manager. The following touchend
// will not be dispatched because there's no target which is always set by
// touchstart. But we still want to count those touchstart, pointerdown and
// touchend.
virtual void CountDroppedPointerDownForEventTiming(unsigned count) {}
// Whether to use ScrollPredictor to resample scroll events. This is false for
// web_tests to ensure that scroll deltas are not timing-dependent.
virtual bool AllowsScrollResampling() { return true; }
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_CLIENT_H_