Commit 120630de authored by Leon Han's avatar Leon Han Committed by Commit Bot

[webnfc] NDEFMessageInit#records is required and should not be empty

NDEFMessageInit#records is the only field of the dictionary
NDEFMessageInit, it's required, and being empty makes no sense for
constructing an NDEFMessage object.

BUG=520391

Change-Id: I87fd3fae3bbbba449d9068c0992ded2080e435b2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1983435
Commit-Queue: Leon Han <leon.han@intel.com>
Reviewed-by: default avatarRijubrata Bhaumik <rijubrata.bhaumik@intel.com>
Cr-Commit-Position: refs/heads/master@{#728120}
parent bd1c9552
......@@ -17,8 +17,17 @@ namespace blink {
NDEFMessage* NDEFMessage::Create(const ExecutionContext* execution_context,
const NDEFMessageInit* init,
ExceptionState& exception_state) {
// https://w3c.github.io/web-nfc/#creating-ndef-message
// NDEFMessageInit#records is a required field.
DCHECK(init->hasRecords());
if (init->records().IsEmpty()) {
exception_state.ThrowTypeError(
"NDEFMessageInit#records being empty makes no sense.");
return nullptr;
}
NDEFMessage* message = MakeGarbageCollected<NDEFMessage>();
if (init->hasRecords()) {
for (const NDEFRecordInit* record_init : init->records()) {
NDEFRecord* record =
NDEFRecord::Create(execution_context, record_init, exception_state);
......@@ -27,7 +36,6 @@ NDEFMessage* NDEFMessage::Create(const ExecutionContext* execution_context,
DCHECK(record);
message->records_.push_back(record);
}
}
return message;
}
......@@ -35,6 +43,7 @@ NDEFMessage* NDEFMessage::Create(const ExecutionContext* execution_context,
NDEFMessage* NDEFMessage::Create(const ExecutionContext* execution_context,
const NDEFMessageSource& source,
ExceptionState& exception_state) {
// https://w3c.github.io/web-nfc/#creating-ndef-message
if (source.IsString()) {
NDEFMessage* message = MakeGarbageCollected<NDEFMessage>();
message->records_.push_back(MakeGarbageCollected<NDEFRecord>(
......
......@@ -5,5 +5,5 @@
// https://w3c.github.io/web-nfc/#dom-ndefmessageinit
dictionary NDEFMessageInit {
sequence<NDEFRecordInit> records;
required sequence<NDEFRecordInit> records;
};
......@@ -66,7 +66,7 @@ ScriptPromise NDEFWriter::push(ScriptState* script_state,
return ScriptPromise();
}
// Step 10.10.1: Run "create NDEF message", if this throws an exception,
// Step 11.2: Run "create NDEF message", if this throws an exception,
// reject p with that exception and abort these steps.
NDEFMessage* ndef_message =
NDEFMessage::Create(execution_context, push_message, exception_state);
......@@ -74,12 +74,6 @@ ScriptPromise NDEFWriter::push(ScriptState* script_state,
return ScriptPromise();
}
// If NDEFMessage.records is empty, reject promise with TypeError
if (ndef_message->records().size() == 0) {
exception_state.ThrowTypeError("Empty NDEFMessage was provided.");
return ScriptPromise();
}
auto message = device::mojom::blink::NDEFMessage::From(ndef_message);
DCHECK(message);
......
......@@ -12,10 +12,20 @@
}, 'NDEFMessage constructor without init dict');
test(() => {
const message = new NDEFMessage(null);
assert_equals(message.records.length, 0, 'empty records');
assert_throws(new TypeError, () => new NDEFMessage(null),
'NDEFMessageInit#records is a required field.');
}, 'NDEFMessage constructor with null init dict');
test(() => {
assert_throws(new TypeError, () => new NDEFMessage({dummy_key: 'dummy_value'}),
'NDEFMessageInit#records is a required field.');
}, 'NDEFMessage constructor without NDEFMessageInit#records field');
test(() => {
assert_throws(new TypeError, () => new NDEFMessage({records: []}),
'NDEFMessageInit#records should not be empty.');
}, 'NDEFMessage constructor with NDEFMessageInit#records being empty');
test(() => {
const message = new NDEFMessage(
createMessage([createTextRecord(test_text_data)]));
......
......@@ -11,6 +11,12 @@
assert_throws(new TypeError, () => new NDEFReadingEvent('message'));
}, 'NDEFReadingEvent constructor without init dict');
test(() => {
assert_throws(new TypeError, () => new NDEFReadingEvent('type',
{serialNumber: '', message: null}),
'NDEFMessageInit#records is a required field.');
}, 'NDEFReadingEvent constructor failed to construct its NDEFMessage');
test(() => {
const message = createMessage([createMimeRecordFromJson(test_buffer_data)]);
const event = new NDEFReadingEvent('type', {serialNumber: null, message: message});
......@@ -23,11 +29,6 @@
assert_equals(event.serialNumber, '', 'serialNumber');
}, 'NDEFReadingEvent constructor with serialNumber not present');
test(() => {
const event = new NDEFReadingEvent('type', {serialNumber: '', message: null});
assert_equals(0, event.message.records.length, 'no records');
}, 'NDEFReadingEvent constructor with null message');
test(() => {
const message = createMessage([createMimeRecord(test_buffer_data)]);
const event = new NDEFReadingEvent('type', {serialNumber: '', message: message});
......
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