Commit fe84cac8 authored by Darwin Huang's avatar Darwin Huang Committed by Commit Bot

Clipboard API: Consolidate Read and Write Permission Checks

This will help avoid some duplicate Focus/etc checks, and allow for easier
extensibility, namely to add PermissionDescriptor modifiers like
allowWithoutGesture or allowWithoutSanitization.

No functional changes here though... it's just a refactoring change.

Bug: 897289
Change-Id: I3abf09cf0d0304f57fd77aee8940a93c6770e67b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1896296Reviewed-by: default avatarMarijn Kruisselbrink <mek@chromium.org>
Commit-Queue: Marijn Kruisselbrink <mek@chromium.org>
Auto-Submit: Darwin Huang <huangdarwin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#713099}
parent b036a73c
......@@ -129,14 +129,16 @@ void ClipboardPromise::RejectFromReadOrDecodeFailure() {
void ClipboardPromise::HandleRead() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
RequestReadPermission(WTF::Bind(&ClipboardPromise::HandleReadWithPermission,
WrapPersistent(this)));
RequestPermission(mojom::blink::PermissionName::CLIPBOARD_READ,
WTF::Bind(&ClipboardPromise::HandleReadWithPermission,
WrapPersistent(this)));
}
void ClipboardPromise::HandleReadText() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
RequestReadPermission(WTF::Bind(
&ClipboardPromise::HandleReadTextWithPermission, WrapPersistent(this)));
RequestPermission(mojom::blink::PermissionName::CLIPBOARD_READ,
WTF::Bind(&ClipboardPromise::HandleReadTextWithPermission,
WrapPersistent(this)));
}
void ClipboardPromise::HandleWrite(
......@@ -160,15 +162,17 @@ void ClipboardPromise::HandleWrite(
ClipboardItem* clipboard_item = (*clipboard_items)[0];
clipboard_item_data_ = clipboard_item->GetItems();
CheckWritePermission(WTF::Bind(&ClipboardPromise::HandleWriteWithPermission,
WrapPersistent(this)));
RequestPermission(mojom::blink::PermissionName::CLIPBOARD_WRITE,
WTF::Bind(&ClipboardPromise::HandleWriteWithPermission,
WrapPersistent(this)));
}
void ClipboardPromise::HandleWriteText(const String& data) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
plain_text_ = data;
CheckWritePermission(WTF::Bind(
&ClipboardPromise::HandleWriteTextWithPermission, WrapPersistent(this)));
RequestPermission(mojom::blink::PermissionName::CLIPBOARD_WRITE,
WTF::Bind(&ClipboardPromise::HandleWriteTextWithPermission,
WrapPersistent(this)));
}
void ClipboardPromise::HandleReadWithPermission(PermissionStatus status) {
......@@ -270,10 +274,13 @@ PermissionService* ClipboardPromise::GetPermissionService() {
return permission_service_.get();
}
void ClipboardPromise::RequestReadPermission(
PermissionService::RequestPermissionCallback callback) {
void ClipboardPromise::RequestPermission(
mojom::blink::PermissionName permission,
base::OnceCallback<void(::blink::mojom::PermissionStatus)> callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(script_promise_resolver_);
DCHECK(permission == mojom::blink::PermissionName::CLIPBOARD_READ ||
permission == mojom::blink::PermissionName::CLIPBOARD_WRITE);
if (!IsFocusedDocument(ExecutionContext::From(script_state_))) {
script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
......@@ -287,37 +294,19 @@ void ClipboardPromise::RequestReadPermission(
return;
}
// Query for permission if necessary.
// See crbug.com/795929 for moving this check into the Browser process.
permission_service_->RequestPermission(
CreateClipboardPermissionDescriptor(
mojom::blink::PermissionName::CLIPBOARD_READ, false),
false, std::move(callback));
}
void ClipboardPromise::CheckWritePermission(
PermissionService::HasPermissionCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(script_promise_resolver_);
if (!IsFocusedDocument(ExecutionContext::From(script_state_))) {
script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kNotAllowedError, "Document is not focused."));
return;
}
if (!GetPermissionService()) {
script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kNotAllowedError,
"Permission Service could not connect."));
auto permission_descriptor =
CreateClipboardPermissionDescriptor(permission, false);
if (permission == mojom::blink::PermissionName::CLIPBOARD_WRITE) {
// Check permission (but do not query the user).
// See crbug.com/795929 for moving this check into the Browser process.
permission_service_->HasPermission(std::move(permission_descriptor),
std::move(callback));
return;
}
// Check current permission (but do not query the user).
// Check permission, and query if necessary.
// See crbug.com/795929 for moving this check into the Browser process.
permission_service_->HasPermission(
CreateClipboardPermissionDescriptor(
mojom::blink::PermissionName::CLIPBOARD_WRITE, false),
std::move(callback));
permission_service_->RequestPermission(std::move(permission_descriptor),
false, std::move(callback));
}
scoped_refptr<base::SingleThreadTaskRunner> ClipboardPromise::GetTaskRunner() {
......
......@@ -61,10 +61,9 @@ class ClipboardPromise final : public GarbageCollected<ClipboardPromise>,
// Checks for permissions (interacting with PermissionService).
mojom::blink::PermissionService* GetPermissionService();
void RequestReadPermission(
mojom::blink::PermissionService::RequestPermissionCallback);
void CheckWritePermission(
mojom::blink::PermissionService::HasPermissionCallback);
void RequestPermission(
mojom::blink::PermissionName permission,
base::OnceCallback<void(::blink::mojom::PermissionStatus)> callback);
scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner();
bool IsFocusedDocument(ExecutionContext*);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment