Commit 0ffbb24b authored by Julie Jeongeun Kim's avatar Julie Jeongeun Kim Committed by Commit Bot

Use [RaisesException] for immediate promise rejections in contacts_picker

This is a part of effort for using [RaisesException] when synchronously
rejecting a promise.

It uses [RaisesException] for
//third_party/blink/renderer/modules/contacts_picker.

Bug: 1001114
Change-Id: I9bff1f21d95e6690f50605421af317dbfb6c9e79
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1986473Reviewed-by: default avatarFinnur Thorarinsson <finnur@chromium.org>
Commit-Queue: Julie Kim <jkim@igalia.com>
Cr-Commit-Position: refs/heads/master@{#728182}
parent abc7db07
......@@ -14,6 +14,7 @@
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/modules/contacts_picker/contact_address.h"
#include "third_party/blink/renderer/modules/contacts_picker/contact_info.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/heap/visitor.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
......@@ -129,37 +130,33 @@ const Vector<String>& ContactsManager::GetProperties(
ScriptPromise ContactsManager::select(ScriptState* script_state,
const Vector<String>& properties,
ContactsSelectOptions* options) {
ContactsSelectOptions* options,
ExceptionState& exception_state) {
Document* document = To<Document>(ExecutionContext::From(script_state));
if (document->ParentDocument()) {
return ScriptPromise::RejectWithDOMException(
script_state,
MakeGarbageCollected<DOMException>(
DOMExceptionCode::kInvalidStateError,
"The contacts API can only be used in the top frame"));
exception_state.ThrowDOMException(
DOMExceptionCode::kInvalidStateError,
"The contacts API can only be used in the top frame");
return ScriptPromise();
}
if (!LocalFrame::HasTransientUserActivation(document ? document->GetFrame()
: nullptr)) {
return ScriptPromise::RejectWithDOMException(
script_state, MakeGarbageCollected<DOMException>(
DOMExceptionCode::kSecurityError,
"A user gesture is required to call this method"));
exception_state.ThrowSecurityError(
"A user gesture is required to call this method");
return ScriptPromise();
}
if (properties.IsEmpty()) {
return ScriptPromise::Reject(script_state,
V8ThrowException::CreateTypeError(
script_state->GetIsolate(),
"At least one property must be provided"));
exception_state.ThrowTypeError("At least one property must be provided");
return ScriptPromise();
}
if (contact_picker_in_use_) {
return ScriptPromise::RejectWithDOMException(
script_state, MakeGarbageCollected<DOMException>(
DOMExceptionCode::kInvalidStateError,
"Contacts Picker is already in use."));
exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
"Contacts Picker is already in use.");
return ScriptPromise();
}
bool include_names = false;
......@@ -170,12 +167,10 @@ ScriptPromise ContactsManager::select(ScriptState* script_state,
for (const String& property : properties) {
if (!base::Contains(GetProperties(script_state), property)) {
return ScriptPromise::Reject(
script_state,
V8ThrowException::CreateTypeError(
script_state->GetIsolate(),
"The provided value '" + property +
"' is not a valid enum value of type ContactProperty"));
exception_state.ThrowTypeError(
"The provided value '" + property +
"' is not a valid enum value of type ContactProperty");
return ScriptPromise();
}
if (property == kName)
......
......@@ -15,6 +15,7 @@
namespace blink {
class ExceptionState;
class ScriptPromiseResolver;
class ScriptState;
......@@ -29,7 +30,8 @@ class ContactsManager final : public ScriptWrappable {
// Web-exposed function defined in the IDL file.
ScriptPromise select(ScriptState* script_state,
const Vector<String>& properties,
ContactsSelectOptions* options);
ContactsSelectOptions* options,
ExceptionState& exception_state);
ScriptPromise getProperties(ScriptState* script_state);
private:
......
......@@ -10,5 +10,5 @@
RuntimeEnabled=ContactsManager
] interface ContactsManager {
[CallWith=ScriptState, MeasureAs=ContactsManagerGetProperties] Promise<sequence<ContactProperty>> getProperties();
[CallWith=ScriptState, MeasureAs=ContactsManagerSelect] Promise<sequence<ContactInfo>> select(sequence<ContactProperty> properties, optional ContactsSelectOptions options);
[CallWith=ScriptState, RaisesException, MeasureAs=ContactsManagerSelect] Promise<sequence<ContactInfo>> select(sequence<ContactProperty> properties, optional ContactsSelectOptions options);
};
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