1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
// 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_WEB_CONTENTS_WEB_DRAG_DEST_MAC_H_
#define CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_DEST_MAC_H_
#import <Cocoa/Cocoa.h>
#include "content/browser/web_contents/web_contents_view_drag_security_info.h"
#include "content/common/content_export.h"
#include "content/public/browser/global_routing_id.h"
#include "content/public/common/drop_data.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom.h"
#include "ui/gfx/geometry/point_f.h"
namespace content {
class RenderViewHost;
class RenderWidgetHostImpl;
class WebContentsImpl;
class WebDragDestDelegate;
} // namespace content
// A typedef for a RenderViewHost used for comparison purposes only.
using RenderViewHostIdentifier = content::RenderViewHost*;
namespace remote_cocoa::mojom {
class DraggingInfo;
} // namespace remote_cocoa::mojom
namespace content {
class WebContentsViewDelegate;
// A structure used to keep drop context for asynchronously finishing a drop
// operation. This is required because some drop event data can change before
// completeDropAsync is called.
struct CONTENT_EXPORT DropContext {
DropContext(const DropData drop_data,
const gfx::PointF client_pt,
const gfx::PointF screen_pt,
int modifier_flags,
base::WeakPtr<RenderWidgetHostImpl> target_rwh);
DropContext(const DropContext& other);
DropContext(DropContext&& other);
~DropContext();
DropData drop_data;
const gfx::PointF client_pt;
const gfx::PointF screen_pt;
const int modifier_flags;
base::WeakPtr<RenderWidgetHostImpl> target_rwh;
};
// Given a pasteboard, returns a `DropData` filled using its contents. The types
// handled by this method must be kept in sync with `-[WebContentsViewCocoa
// registerDragTypes]`.
DropData CONTENT_EXPORT PopulateDropDataFromPasteboard(NSPasteboard* pboard);
} // namespace content
// A class that handles tracking and event processing for a drag and drop
// over the content area. Assumes something else initiates the drag, this is
// only for processing during a drag.
CONTENT_EXPORT
@interface WebDragDest : NSObject
// |contents| is the WebContentsImpl representing this tab, used to communicate
// drag&drop messages to WebCore and handle navigation on a successful drop
// (if necessary).
- (id)initWithWebContentsImpl:(content::WebContentsImpl*)contents;
- (content::DropData*)currentDropData;
- (void)setDragDelegate:(content::WebDragDestDelegate*)delegate;
// Sets the current operation negotiated by the source and destination,
// which determines whether or not we should allow the drop. Takes effect the
// next time |-draggingUpdated:| is called.
//
// See mojo method FrameWidget::DragTargetDragEnter() for a discussion of
// |operation| and |documentOperation|.
- (void)setCurrentOperation:(ui::mojom::DragOperation)operation
documentIsHandlingDrag:(bool)documentIsHandlingDrag;
// Messages to send during the tracking of a drag, usually upon receiving
// calls from the view system. Communicates the drag messages to WebCore.
- (void)setDropData:(const content::DropData&)dropData;
- (NSDragOperation)draggingEntered:
(const remote_cocoa::mojom::DraggingInfo*)info;
- (void)draggingExited;
- (NSDragOperation)draggingUpdated:
(const remote_cocoa::mojom::DraggingInfo*)info;
- (BOOL)performDragOperation:(const remote_cocoa::mojom::DraggingInfo*)info
withWebContentsViewDelegate:
(content::WebContentsViewDelegate*)webContentsViewDelegate;
- (void)completeDropAsync:(std::optional<content::DropData>)dropData
withContext:(const content::DropContext)context;
// Helper to call WebWidgetHostInputEventRouter::GetRenderWidgetHostAtPoint().
- (content::RenderWidgetHostImpl*)
GetRenderWidgetHostAtPoint:(const gfx::PointF&)viewPoint
transformedPt:(gfx::PointF*)transformedPt;
// Called to indicate that the owning WebContents has initiated a drag.
- (void)initiateDragWithRenderWidgetHost:(content::RenderWidgetHostImpl*)rwhi
dropData:(const content::DropData&)dropData;
// Called to indicate that, if the owning WebContents has initiated a drag, that
// drag has ended. The closure will be called synchronously if the "dragend"
// event can be fired, or asynchronously if a "drop" event is still pending
// since it should be fired first.
- (void)endDrag:(base::OnceClosure)closure;
// Resets internal members for a pending drop.
- (void)resetDragDropState;
- (bool)dropInProgressForTesting;
- (void)setDropInProgressForTesting;
@end
// Public use only for unit tests.
@interface WebDragDest (Testing)
// Given a point in window coordinates and a view in that window, return a
// flipped point in the coordinate system of |view|.
- (NSPoint)flipWindowPointToView:(const NSPoint&)windowPoint
view:(NSView*)view;
// Given a point in window coordinates and a view in that window, return a
// flipped point in screen coordinates.
- (NSPoint)flipWindowPointToScreen:(const NSPoint&)windowPoint
view:(NSView*)view;
@end
#endif // CONTENT_BROWSER_WEB_CONTENTS_WEB_DRAG_DEST_MAC_H_
|