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