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