blob: 91bcfbc7ca6853ae5ee61ec72e06607220a23025 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// 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_CORE_FRAME_WEB_FRAME_WIDGET_BASE_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_WEB_FRAME_WIDGET_BASE_H_
#include "base/single_thread_task_runner.h"
#include "services/network/public/mojom/referrer_policy.mojom-blink.h"
#include "third_party/blink/public/platform/web_coalesced_input_event.h"
#include "third_party/blink/public/platform/web_drag_data.h"
#include "third_party/blink/public/platform/web_gesture_device.h"
#include "third_party/blink/public/web/web_frame_widget.h"
#include "third_party/blink/renderer/core/clipboard/data_object.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/dom/user_gesture_indicator.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_image.h"
#include "third_party/blink/renderer/platform/heap/member.h"
namespace cc {
class Layer;
}
namespace gfx {
class Point;
}
namespace blink {
class AnimationWorkletMutatorDispatcherImpl;
class CompositorAnimationHost;
class GraphicsLayer;
class HitTestResult;
class PageWidgetEventHandler;
class WebLayerTreeView;
class WebLocalFrameImpl;
class WebViewImpl;
struct IntrinsicSizingInfo;
struct WebFloatPoint;
class CORE_EXPORT WebFrameWidgetBase
: public GarbageCollectedFinalized<WebFrameWidgetBase>,
public WebFrameWidget {
public:
explicit WebFrameWidgetBase(WebWidgetClient&);
virtual ~WebFrameWidgetBase();
WebWidgetClient* Client() const { return client_; }
WebLocalFrameImpl* LocalRootImpl() const { return local_root_; }
// Returns the bounding box of the block type node touched by the WebPoint.
WebRect ComputeBlockBound(const gfx::Point& point_in_root_frame,
bool ignore_clipping) const;
void BindLocalRoot(WebLocalFrame&);
// Called once the local root is bound via |BindLocalRoot()|.
virtual void Initialize() = 0;
virtual bool ForSubframe() const = 0;
virtual void IntrinsicSizingInfoChanged(const IntrinsicSizingInfo&) {}
virtual base::WeakPtr<AnimationWorkletMutatorDispatcherImpl>
EnsureCompositorMutatorDispatcher(
scoped_refptr<base::SingleThreadTaskRunner>* mutator_task_runner) = 0;
// Sets the root graphics layer. |GraphicsLayer| can be null when detaching
// the root layer.
virtual void SetRootGraphicsLayer(GraphicsLayer*) = 0;
virtual GraphicsLayer* RootGraphicsLayer() const = 0;
// Sets the root layer. The |layer| can be null when detaching the root layer.
virtual void SetRootLayer(scoped_refptr<cc::Layer> layer) = 0;
virtual WebLayerTreeView* GetLayerTreeView() const = 0;
virtual CompositorAnimationHost* AnimationHost() const = 0;
virtual HitTestResult CoreHitTestResultAt(const gfx::Point&) = 0;
// WebFrameWidget implementation.
void Close() override;
WebLocalFrame* LocalRoot() const override;
void UpdateAllLifecyclePhasesAndCompositeForTesting(bool do_raster) override;
WebDragOperation DragTargetDragEnter(const WebDragData&,
const WebFloatPoint& point_in_viewport,
const WebFloatPoint& screen_point,
WebDragOperationsMask operations_allowed,
int modifiers) override;
WebDragOperation DragTargetDragOver(const WebFloatPoint& point_in_viewport,
const WebFloatPoint& screen_point,
WebDragOperationsMask operations_allowed,
int modifiers) override;
void DragTargetDragLeave(const WebFloatPoint& point_in_viewport,
const WebFloatPoint& screen_point) override;
void DragTargetDrop(const WebDragData&,
const WebFloatPoint& point_in_viewport,
const WebFloatPoint& screen_point,
int modifiers) override;
void DragSourceEndedAt(const WebFloatPoint& point_in_viewport,
const WebFloatPoint& screen_point,
WebDragOperation) override;
void DragSourceSystemDragEnded() override;
WebLocalFrame* FocusedWebLocalFrameInWidget() const override;
// Called when a drag-n-drop operation should begin.
void StartDragging(network::mojom::ReferrerPolicy,
const WebDragData&,
WebDragOperationsMask,
const SkBitmap& drag_image,
const gfx::Point& drag_image_offset);
bool DoingDragAndDrop() { return doing_drag_and_drop_; }
static void SetIgnoreInputEvents(bool value) { ignore_input_events_ = value; }
static bool IgnoreInputEvents() { return ignore_input_events_; }
// WebWidget methods.
void DidAcquirePointerLock() override;
void DidNotAcquirePointerLock() override;
void DidLosePointerLock() override;
void ShowContextMenu(WebMenuSourceType) override;
// Image decode functionality.
void RequestDecode(const PaintImage&, base::OnceCallback<void(bool)>);
// Called when the FrameView for this Widget's local root is created.
virtual void DidCreateLocalRootView() {}
// This method returns the focused frame belonging to this WebWidget, that
// is, a focused frame with the same local root as the one corresponding
// to this widget. It will return nullptr if no frame is focused or, the
// focused frame has a different local root.
LocalFrame* FocusedLocalFrameInWidget() const;
virtual void Trace(blink::Visitor*);
protected:
enum DragAction { kDragEnter, kDragOver };
// Consolidate some common code between starting a drag over a target and
// updating a drag over a target. If we're starting a drag, |isEntering|
// should be true.
WebDragOperation DragTargetDragEnterOrOver(
const WebFloatPoint& point_in_viewport,
const WebFloatPoint& screen_point,
DragAction,
int modifiers);
// Helper function to call VisualViewport::viewportToRootFrame().
WebFloatPoint ViewportToRootFrame(
const WebFloatPoint& point_in_viewport) const;
WebViewImpl* View() const;
// Returns the page object associated with this widget. This may be null when
// the page is shutting down, but will be valid at all other times.
Page* GetPage() const;
// Helper function to process events while pointer locked.
void PointerLockMouseEvent(const WebCoalescedInputEvent&);
virtual PageWidgetEventHandler* GetPageWidgetEventHandler() = 0;
// A copy of the web drop data object we received from the browser.
Member<DataObject> current_drag_data_;
bool doing_drag_and_drop_ = false;
// The available drag operations (copy, move link...) allowed by the source.
WebDragOperation operations_allowed_ = kWebDragOperationNone;
// The current drag operation as negotiated by the source and destination.
// When not equal to DragOperationNone, the drag data can be dropped onto the
// current drop target in this WebView (the drop target can accept the drop).
WebDragOperation drag_operation_ = kWebDragOperationNone;
private:
void CancelDrag();
WebWidgetClient* client_;
// WebFrameWidget is associated with a subtree of the frame tree,
// corresponding to a maximal connected tree of LocalFrames. This member
// points to the root of that subtree.
Member<WebLocalFrameImpl> local_root_;
static bool ignore_input_events_;
scoped_refptr<UserGestureToken> pointer_lock_gesture_token_;
friend class WebViewImpl;
};
DEFINE_TYPE_CASTS(WebFrameWidgetBase, WebFrameWidget, widget, true, true);
} // namespace blink
#endif