Commit 40f67347 authored by Donna Wu's avatar Donna Wu Committed by Commit Bot

[webnfc] Avoid increasing ref-count for |resolver_| in Reader.

The |resolver_| is in the reader, so no need to pass it to a
closure carring the reader already. Also to align with other
places, OnScanRequestCompleted() has been made to be a member
method, so that |resolver_| can be cleared when settled.

Bug: 520391
Change-Id: Ie5718243aa0f60498e042550b33ffcea5700ad84
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2145262
Commit-Queue: Donna Wu <donna.wu@intel.com>
Reviewed-by: default avatarRijubrata Bhaumik <rijubrata.bhaumik@intel.com>
Cr-Commit-Position: refs/heads/master@{#758776}
parent 3c5cfe2c
......@@ -37,16 +37,6 @@ namespace {
constexpr char kNotSupportedOrPermissionDenied[] =
"WebNFC feature is unavailable or permission denied.";
void OnScanRequestCompleted(ScriptPromiseResolver* resolver,
device::mojom::blink::NDEFErrorPtr error) {
if (error) {
resolver->Reject(
NDEFErrorTypeToDOMException(error->error_type, error->error_message));
return;
}
resolver->Resolve();
}
} // namespace
// static
......@@ -118,16 +108,15 @@ ScriptPromise NDEFReader::scan(ScriptState* script_state,
// 8. If reader.[[Signal]] is not null, then add the following abort steps to
// reader.[[Signal]]:
if (options->hasSignal()) {
options->signal()->AddAlgorithm(WTF::Bind(&NDEFReader::Abort,
WrapPersistent(this),
WrapPersistent(resolver_.Get())));
options->signal()->AddAlgorithm(
WTF::Bind(&NDEFReader::Abort, WrapPersistent(this)));
}
GetPermissionService()->RequestPermission(
CreatePermissionDescriptor(PermissionName::NFC),
LocalFrame::HasTransientUserActivation(document->GetFrame()),
WTF::Bind(&NDEFReader::OnRequestPermission, WrapPersistent(this),
WrapPersistent(resolver_.Get()), WrapPersistent(options)));
WrapPersistent(options)));
return resolver_->Promise();
}
......@@ -140,17 +129,21 @@ PermissionService* NDEFReader::GetPermissionService() {
return permission_service_.get();
}
void NDEFReader::OnRequestPermission(ScriptPromiseResolver* resolver,
const NDEFScanOptions* options,
void NDEFReader::OnRequestPermission(const NDEFScanOptions* options,
PermissionStatus status) {
if (!resolver_)
return;
if (status != PermissionStatus::GRANTED) {
resolver->Reject(MakeGarbageCollected<DOMException>(
resolver_->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kNotAllowedError, "NFC permission request denied."));
resolver_.Clear();
return;
}
if (options->hasSignal() && options->signal()->aborted()) {
resolver->Reject(MakeGarbageCollected<DOMException>(
resolver_->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kAbortError, "The NFC operation was cancelled."));
resolver_.Clear();
return;
}
......@@ -160,7 +153,22 @@ void NDEFReader::OnRequestPermission(ScriptPromiseResolver* resolver,
GetNfcProxy()->StartReading(
this, options,
WTF::Bind(&OnScanRequestCompleted, WrapPersistent(resolver)));
WTF::Bind(&NDEFReader::OnScanRequestCompleted, WrapPersistent(this)));
}
void NDEFReader::OnScanRequestCompleted(
device::mojom::blink::NDEFErrorPtr error) {
if (!resolver_)
return;
if (error) {
resolver_->Reject(
NDEFErrorTypeToDOMException(error->error_type, error->error_message));
} else {
resolver_->Resolve();
}
resolver_.Clear();
}
void NDEFReader::Trace(Visitor* visitor) {
......@@ -190,6 +198,7 @@ void NDEFReader::OnMojoConnectionError() {
resolver_->Reject(NDEFErrorTypeToDOMException(
device::mojom::blink::NDEFErrorType::NOT_SUPPORTED,
kNotSupportedOrPermissionDenied));
resolver_.Clear();
}
// Dispatches an error event.
......@@ -202,14 +211,18 @@ void NDEFReader::ContextDestroyed() {
resolver_->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kAbortError,
"The execution context is going to be gone."));
resolver_.Clear();
}
GetNfcProxy()->StopReading(this);
}
void NDEFReader::Abort(ScriptPromiseResolver* resolver) {
// If |resolver| has already settled this rejection is silently ignored.
resolver->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kAbortError, "The NFC operation was cancelled."));
void NDEFReader::Abort() {
if (resolver_) {
resolver_->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kAbortError, "The NFC operation was cancelled."));
resolver_.Clear();
}
GetNfcProxy()->StopReading(this);
}
......
......@@ -59,13 +59,14 @@ class MODULES_EXPORT NDEFReader : public EventTargetWithInlineData,
// ExecutionContextLifecycleObserver overrides.
void ContextDestroyed() override;
void Abort(ScriptPromiseResolver*);
void Abort();
NFCProxy* GetNfcProxy() const;
void OnScanRequestCompleted(device::mojom::blink::NDEFErrorPtr error);
// Permission handling
void OnRequestPermission(ScriptPromiseResolver* resolver,
const NDEFScanOptions* options,
void OnRequestPermission(const NDEFScanOptions* options,
mojom::blink::PermissionStatus status);
mojom::blink::PermissionService* GetPermissionService();
mojo::Remote<mojom::blink::PermissionService> permission_service_;
......
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