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() { ...@@ -129,14 +129,16 @@ void ClipboardPromise::RejectFromReadOrDecodeFailure() {
void ClipboardPromise::HandleRead() { void ClipboardPromise::HandleRead() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
RequestReadPermission(WTF::Bind(&ClipboardPromise::HandleReadWithPermission, RequestPermission(mojom::blink::PermissionName::CLIPBOARD_READ,
WrapPersistent(this))); WTF::Bind(&ClipboardPromise::HandleReadWithPermission,
WrapPersistent(this)));
} }
void ClipboardPromise::HandleReadText() { void ClipboardPromise::HandleReadText() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
RequestReadPermission(WTF::Bind( RequestPermission(mojom::blink::PermissionName::CLIPBOARD_READ,
&ClipboardPromise::HandleReadTextWithPermission, WrapPersistent(this))); WTF::Bind(&ClipboardPromise::HandleReadTextWithPermission,
WrapPersistent(this)));
} }
void ClipboardPromise::HandleWrite( void ClipboardPromise::HandleWrite(
...@@ -160,15 +162,17 @@ void ClipboardPromise::HandleWrite( ...@@ -160,15 +162,17 @@ void ClipboardPromise::HandleWrite(
ClipboardItem* clipboard_item = (*clipboard_items)[0]; ClipboardItem* clipboard_item = (*clipboard_items)[0];
clipboard_item_data_ = clipboard_item->GetItems(); clipboard_item_data_ = clipboard_item->GetItems();
CheckWritePermission(WTF::Bind(&ClipboardPromise::HandleWriteWithPermission, RequestPermission(mojom::blink::PermissionName::CLIPBOARD_WRITE,
WrapPersistent(this))); WTF::Bind(&ClipboardPromise::HandleWriteWithPermission,
WrapPersistent(this)));
} }
void ClipboardPromise::HandleWriteText(const String& data) { void ClipboardPromise::HandleWriteText(const String& data) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
plain_text_ = data; plain_text_ = data;
CheckWritePermission(WTF::Bind( RequestPermission(mojom::blink::PermissionName::CLIPBOARD_WRITE,
&ClipboardPromise::HandleWriteTextWithPermission, WrapPersistent(this))); WTF::Bind(&ClipboardPromise::HandleWriteTextWithPermission,
WrapPersistent(this)));
} }
void ClipboardPromise::HandleReadWithPermission(PermissionStatus status) { void ClipboardPromise::HandleReadWithPermission(PermissionStatus status) {
...@@ -270,10 +274,13 @@ PermissionService* ClipboardPromise::GetPermissionService() { ...@@ -270,10 +274,13 @@ PermissionService* ClipboardPromise::GetPermissionService() {
return permission_service_.get(); return permission_service_.get();
} }
void ClipboardPromise::RequestReadPermission( void ClipboardPromise::RequestPermission(
PermissionService::RequestPermissionCallback callback) { mojom::blink::PermissionName permission,
base::OnceCallback<void(::blink::mojom::PermissionStatus)> callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(script_promise_resolver_); DCHECK(script_promise_resolver_);
DCHECK(permission == mojom::blink::PermissionName::CLIPBOARD_READ ||
permission == mojom::blink::PermissionName::CLIPBOARD_WRITE);
if (!IsFocusedDocument(ExecutionContext::From(script_state_))) { if (!IsFocusedDocument(ExecutionContext::From(script_state_))) {
script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>( script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
...@@ -287,37 +294,19 @@ void ClipboardPromise::RequestReadPermission( ...@@ -287,37 +294,19 @@ void ClipboardPromise::RequestReadPermission(
return; return;
} }
// Query for permission if necessary. auto permission_descriptor =
// See crbug.com/795929 for moving this check into the Browser process. CreateClipboardPermissionDescriptor(permission, false);
permission_service_->RequestPermission( if (permission == mojom::blink::PermissionName::CLIPBOARD_WRITE) {
CreateClipboardPermissionDescriptor( // Check permission (but do not query the user).
mojom::blink::PermissionName::CLIPBOARD_READ, false), // See crbug.com/795929 for moving this check into the Browser process.
false, std::move(callback)); permission_service_->HasPermission(std::move(permission_descriptor),
} 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."));
return; return;
} }
// Check permission, and query if necessary.
// Check current permission (but do not query the user).
// See crbug.com/795929 for moving this check into the Browser process. // See crbug.com/795929 for moving this check into the Browser process.
permission_service_->HasPermission( permission_service_->RequestPermission(std::move(permission_descriptor),
CreateClipboardPermissionDescriptor( false, std::move(callback));
mojom::blink::PermissionName::CLIPBOARD_WRITE, false),
std::move(callback));
} }
scoped_refptr<base::SingleThreadTaskRunner> ClipboardPromise::GetTaskRunner() { scoped_refptr<base::SingleThreadTaskRunner> ClipboardPromise::GetTaskRunner() {
......
...@@ -61,10 +61,9 @@ class ClipboardPromise final : public GarbageCollected<ClipboardPromise>, ...@@ -61,10 +61,9 @@ class ClipboardPromise final : public GarbageCollected<ClipboardPromise>,
// Checks for permissions (interacting with PermissionService). // Checks for permissions (interacting with PermissionService).
mojom::blink::PermissionService* GetPermissionService(); mojom::blink::PermissionService* GetPermissionService();
void RequestReadPermission( void RequestPermission(
mojom::blink::PermissionService::RequestPermissionCallback); mojom::blink::PermissionName permission,
void CheckWritePermission( base::OnceCallback<void(::blink::mojom::PermissionStatus)> callback);
mojom::blink::PermissionService::HasPermissionCallback);
scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(); scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner();
bool IsFocusedDocument(ExecutionContext*); 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