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
content / browser / web_contents / web_contents_view_drag_security_info.h [blame]
// Copyright 2023 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_CONTENTS_VIEW_DRAG_SECURITY_INFO_H_
#define CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_VIEW_DRAG_SECURITY_INFO_H_
#include "content/browser/site_instance_group.h"
namespace content {
struct DropData;
class RenderWidgetHostImpl;
// Used to track security-salient details about a drag source. This class is to
// be owned by a WebContentsView indirectly via the Aura or Mac impls. Because
// the security concerns that it addresses are those that arise when the
// WebContentsView that initiated the drag is also the target of that drag, this
// class's main question is "is the WebContentsView that is receiving the drag
// the same one that initiated that drag?" The answer to that question may be
// directly obtained via `did_initiate()`, and that answer will affect every
// other member function's return value.
class WebContentsViewDragSecurityInfo {
public:
WebContentsViewDragSecurityInfo();
~WebContentsViewDragSecurityInfo();
// Calls to be made by the owner to indicate that it has initiated or ended a
// drag.
void OnDragInitiated(RenderWidgetHostImpl* source_rwh,
const DropData& drop_data);
void OnDragEnded();
// Returns true iff the current drag was initiated by this WebContentsView.
// This will be false for drags originating from other WebContentsViews or
// from outside of the browser, as well as if there is no current drag.
bool did_initiate() const { return did_initiate_; }
// Returns whether the image on the drag is accessible. See
// https://crbug.com/1264873.
bool IsImageAccessibleFromFrame() const;
// Returns whether `target_rwh` is a valid RenderWidgetHost to be dragging
// over. This enforces that same-page, cross-site drags are not allowed. See
// https://crbug.com/666858, https://crbug.com/1266953,
// https://crbug.com/1485266.
bool IsValidDragTarget(RenderWidgetHostImpl* target_rwh) const;
private:
// See `did_initiate()`, above.
bool did_initiate_ = false;
// The site instance of the drag origin.
SiteInstanceGroupId site_instance_group_id_;
// A boolean to hold the accessibility value retrieved from the `DropData`.
// See https://crbug.com/1264873.
bool image_accessible_from_frame_ = true;
};
} // namespace content
#endif // CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_VIEW_DRAG_SECURITY_INFO_H_