Commit 0d88c752 authored by Alexander Shalamov's avatar Alexander Shalamov Committed by Commit Bot

[webnfc] Validate NFCWatchOptions.url in watch operation

This CL aligns implementation with specification [1] and validates
NFCWatchOptions.url argument, so that developers would be notified
immediately about invalid syntax of provided url.

[1] https://github.com/w3c/web-nfc/issues/124

Bug: 729000
Change-Id: I1212bda6c7fbfb6da6fb77fd50359c1106638dd5
Reviewed-on: https://chromium-review.googlesource.com/522666
Commit-Queue: Alexander Shalamov <alexander.shalamov@intel.com>
Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#477937}
parent f456b3c4
CONSOLE ERROR: Uncaught (in promise) NotFoundError: Invalid NFC watch Id was provided.
CONSOLE ERROR: Uncaught (in promise) NotFoundError: Invalid NFC watch Id was provided.
This is a testharness.js-based test.
Harness Error. harness_status.status = 1 , harness_status.message = Invalid NFC watch Id was provided.
PASS Test that nfc.watch succeeds if NFC hardware is enabled.
PASS Test that nfc.watch fails if NFC hardware is disabled.
PASS Test that nfc.watch fails if NFC hardware is not supported.
PASS Test that default NFCWatchOptions values are set correctly.
PASS Test that NFCWatchOptions values are correctly converted.
PASS Test that nfc.cancelWatch fails if invalid watch ID is provided.
PASS Test that nfc.cancelWatch fails if there are no active watchers.
PASS Test that nfc.cancelWatch succeeds if correct watch id is provided.
PASS Test that nfc.cancelWatch succeeds if there are active watchers.
PASS Test that watch callback is triggered with valid NFCMessage.
Harness: the test ran to completion.
...@@ -47,12 +47,12 @@ nfc_test(nfc => { ...@@ -47,12 +47,12 @@ nfc_test(nfc => {
nfc_test(nfc => { nfc_test(nfc => {
return navigator.nfc.watch(noop). return navigator.nfc.watch(noop).
then(id => { navigator.nfc.cancelWatch(id); }); then(id => navigator.nfc.cancelWatch(id));
}, 'Test that nfc.cancelWatch succeeds if correct watch id is provided.') }, 'Test that nfc.cancelWatch succeeds if correct watch id is provided.')
nfc_test(nfc => { nfc_test(nfc => {
return navigator.nfc.watch(noop). return navigator.nfc.watch(noop).
then(() => { navigator.nfc.cancelWatch(); }); then(() => navigator.nfc.cancelWatch());
}, 'Test that nfc.cancelWatch succeeds if there are active watchers.') }, 'Test that nfc.cancelWatch succeeds if there are active watchers.')
nfc_test(nfc => { nfc_test(nfc => {
...@@ -69,6 +69,40 @@ nfc_test(nfc => { ...@@ -69,6 +69,40 @@ nfc_test(nfc => {
resolve(); resolve();
}).then(id => { nfc.mockNFC.triggerWatchCallback(id, message); }, reject); }).then(id => { nfc.mockNFC.triggerWatchCallback(id, message); }, reject);
}); });
}, 'Test that watch callback is triggered with valid NFCMessage.') }, 'Test that watch callback is triggered with valid NFCMessage.');
nfc_test(nfc => {
return assertRejectsWithError(navigator.nfc.watch(noop, {url:"www.a.com"}),
'SyntaxError');
}, 'Test that nfc.watch fails if NFCWatchOptions.url is missing components.');
nfc_test(nfc => {
return assertRejectsWithError(navigator.nfc.watch(noop, {url:"invalid"}),
'SyntaxError');
}, 'Test that nfc.watch fails if NFCWatchOptions.url is invalid.');
nfc_test(nfc => {
return assertRejectsWithError(navigator.nfc.watch(noop, {url:"http://a.com"}),
'SyntaxError');
}, 'Test that nfc.watch fails if NFCWatchOptions.url has wrong protocol.');
nfc_test(nfc => {
return navigator.nfc.watch(noop, {url:"https://a.com"});
}, 'Test that nfc.watch succeeds if NFCWatchOptions.url is valid URL.');
nfc_test(nfc => {
return navigator.nfc.watch(noop, {url:"https://a.com/*"});
}, 'Test that nfc.watch succeeds if NFCWatchOptions.url is valid URL with "*"' +
' wildcard character in path.');
nfc_test(nfc => {
return navigator.nfc.watch(noop, {url:"https://foo.com/*/bar"});
}, 'Test that nfc.watch succeeds if NFCWatchOptions.url is valid URL with "*"' +
' wildcard character in the beginning of path component followed by' +
' subpath.');
nfc_test(nfc => {
return navigator.nfc.watch(noop, {url:""});
}, 'Test that nfc.watch succeeds if NFCWatchOptions.url is empty.')
</script> </script>
...@@ -28,6 +28,7 @@ const char kJsonMimeType[] = "application/json"; ...@@ -28,6 +28,7 @@ const char kJsonMimeType[] = "application/json";
const char kOpaqueMimeType[] = "application/octet-stream"; const char kOpaqueMimeType[] = "application/octet-stream";
const char kPlainTextMimeType[] = "text/plain"; const char kPlainTextMimeType[] = "text/plain";
const char kPlainTextMimePrefix[] = "text/"; const char kPlainTextMimePrefix[] = "text/";
const char kProtocolHttps[] = "https";
const char kCharSetUTF8[] = ";charset=UTF-8"; const char kCharSetUTF8[] = ";charset=UTF-8";
} // anonymous namespace } // anonymous namespace
...@@ -750,6 +751,15 @@ ScriptPromise NFC::watch(ScriptState* script_state, ...@@ -750,6 +751,15 @@ ScriptPromise NFC::watch(ScriptState* script_state,
if (!promise.IsEmpty()) if (!promise.IsEmpty())
return promise; return promise;
// https://w3c.github.io/web-nfc/#dom-nfc-watch (Step 9)
if (options.hasURL() && !options.url().IsEmpty()) {
KURL pattern_url(kParsedURLString, options.url());
if (!pattern_url.IsValid() || pattern_url.Protocol() != kProtocolHttps) {
return RejectWithDOMException(script_state, kSyntaxError,
"Invalid URL pattern was provided.");
}
}
callback->SetScriptState(script_state); callback->SetScriptState(script_state);
ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
requests_.insert(resolver); requests_.insert(resolver);
......
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