Commit a96a54d7 authored by Chromium WPT Sync's avatar Chromium WPT Sync Committed by Commit Bot

Import wpt@085b675a6a7dabadc080b34711f632d26ec2b634

Using wpt-import in Chromium 01dabee6.
With Chromium commits locally applied on WPT:
d5cd6b98 "SharedWorker: Assign unique names to SharedWorkers to avoid unintentional matching"
76ee218c "Split html/.../query-encoding/ tests"
1ce9585a "Clear-Site-Data must uncontrol affected service worker clients"
ea6dba31 "Align <pattern> and <*Gradient> attribute collection"
7d52b1d5 "[v8][wasm] Fix WebAssembly streaming tests"


Note to sheriffs: This CL imports external tests and adds
expectations for those tests; if this CL is large and causes
a few new failures, please fix the failures by adding new
lines to TestExpectations rather than reverting. See:
https://chromium.googlesource.com/chromium/src/+/master/docs/testing/web_platform_tests.md

Directory owners for changes in this CL:
foolip@chromium.org, lpz@chromium.org, robertma@chromium.org:
  external/wpt/tools
jsbell@chromium.org:
  external/wpt/resources
mkwst@chromium.org, andypaicu@chromium.org:
  external/wpt/content-security-policy

NOAUTOREVERT=true
TBR=raphael.kubo.da.costa

No-Export: true
Change-Id: I5ee8bcc66072dc9fff1f1e1085f7009f234575c4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2070391Reviewed-by: default avatarWPT Autoroller <wpt-autoroller@chops-service-accounts.iam.gserviceaccount.com>
Commit-Queue: WPT Autoroller <wpt-autoroller@chops-service-accounts.iam.gserviceaccount.com>
Cr-Commit-Position: refs/heads/master@{#744074}
parent b55e04f8
...@@ -149,10 +149,10 @@ ...@@ -149,10 +149,10 @@
<nonce-element nonce="abc"></nonce-element> <nonce-element nonce="abc"></nonce-element>
<script nonce="abc"> <script nonce="abc">
test(t => { test(t => {
assert_object_equals(eventList[0], { type: "AttributeChanged", name: "nonce", oldValue: null, newValue: "abc" }, "AttributeChanged 1");
assert_object_equals(eventList[1], { type: "Connected" }, "Connected");
assert_object_equals(eventList[2], { type: "AttributeChanged", name: "nonce", oldValue: "abc", newValue: "" }, "AttributeChanged 2");
assert_equals(eventList.length, 3); assert_equals(eventList.length, 3);
assert_object_equals(eventList[0], { type: "AttributeChanged", name: "nonce", oldValue: null, newValue: "abc" });
assert_object_equals(eventList[1], { type: "Connected" });
assert_object_equals(eventList[2], { type: "AttributeChanged", name: "nonce", oldValue: "abc", newValue: "" });
}, "Custom elements expose the correct events."); }, "Custom elements expose the correct events.");
</script> </script>
......
This is a testharness.js-based test.
PASS Reading 'nonce' content attribute and IDL attribute.
PASS Cloned node retains nonce.
PASS Cloned node retains nonce when inserted.
FAIL Writing 'nonce' content attribute. assert_equals: expected "foo" but got "abc"
PASS Writing 'nonce' IDL attribute.
PASS Document-written script executes.
PASS Document-written script's nonce value.
PASS createElement.nonce.
PASS createElement.setAttribute.
Harness: the test ran to completion.
This is a testharness.js-based test.
PASS Reading 'nonce' content attribute and IDL attribute.
PASS Cloned node retains nonce.
PASS Cloned node retains nonce when inserted.
FAIL Writing 'nonce' content attribute. assert_equals: expected "foo" but got "abc"
PASS Writing 'nonce' IDL attribute.
PASS Document-written script executes.
PASS Document-written script's nonce value.
PASS createElement.nonce.
PASS createElement.setAttribute.
Harness: the test ran to completion.
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
test(t => { test(t => {
script.setAttribute('nonce', 'foo'); script.setAttribute('nonce', 'foo');
assert_equals(script.getAttribute('nonce'), 'foo'); assert_equals(script.getAttribute('nonce'), 'foo');
assert_equals(script.nonce, 'abc'); assert_equals(script.nonce, 'foo');
}, "Writing 'nonce' content attribute."); }, "Writing 'nonce' content attribute.");
// Set the IDL attribute to 'bar' // Set the IDL attribute to 'bar'
...@@ -77,6 +77,8 @@ ...@@ -77,6 +77,8 @@
innerScript.innerText = script.innerText; innerScript.innerText = script.innerText;
innerScript.nonce = 'abc'; innerScript.nonce = 'abc';
s.appendChild(innerScript); s.appendChild(innerScript);
assert_equals(innerScript.nonce, 'abc');
assert_equals(innerScript.getAttribute('nonce'), null, 'innerScript.getAttribute nonce');
document.body.appendChild(s); document.body.appendChild(s);
assert_equals(innerScript.nonce, 'abc'); assert_equals(innerScript.nonce, 'abc');
assert_equals(innerScript.getAttribute('nonce'), null, 'innerScript.getAttribute nonce'); assert_equals(innerScript.getAttribute('nonce'), null, 'innerScript.getAttribute nonce');
......
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
test(t => { test(t => {
script.setAttribute('nonce', 'foo'); script.setAttribute('nonce', 'foo');
assert_equals(script.getAttribute('nonce'), 'foo'); assert_equals(script.getAttribute('nonce'), 'foo');
assert_equals(script.nonce, 'abc'); assert_equals(script.nonce, 'foo');
}, "Writing 'nonce' content attribute."); }, "Writing 'nonce' content attribute.");
// Set the IDL attribute to 'bar' // Set the IDL attribute to 'bar'
......
W3C 3-clause BSD License
http://www.w3.org/Consortium/Legal/2008/03-bsd-license.html
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of works must retain the original copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the original copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the W3C nor the names of its contributors may be
used to endorse or promote products derived from this work without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This is a testharness.js-based test.
PASS global setup
FAIL FetchEvent.handled should resolve when respondWith() is not called assert_equals: expected "RESOLVED" but got "FAILED"
FAIL FetchEvent.handled should reject when respondWith() is not called and the event is canceled assert_equals: expected "REJECTED" but got "FAILED"
FAIL FetchEvent.handled should resolve when the promise provided to respondWith() is resolved assert_equals: expected "RESOLVED" but got "FAILED"
FAIL FetchEvent.handled should reject when the promise provided to respondWith() is resolved to an invalid response assert_equals: expected "REJECTED" but got "FAILED"
FAIL FetchEvent.handled should reject when the promise provided to respondWith() is rejected assert_equals: expected "REJECTED" but got "FAILED"
PASS global cleanup
Harness: the test ran to completion.
<!DOCTYPE html>
<html>
<title>Service Worker: FetchEvent.handled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
let frame = null;
let worker = null;
const script = 'resources/fetch-event-handled-worker.js';
const scope = 'resources/simple.html';
// Wait for a message from the service worker and removes the message handler.
function wait_for_message_from_worker() {
return new Promise((resolve) => {
const handler = (event) => {
frame.contentWindow.navigator.serviceWorker.removeEventListener(
'message', handler);
resolve(event.data);
};
frame.contentWindow.navigator.serviceWorker.addEventListener(
'message', handler);
});
}
// Global setup: this must be the first promise_test.
promise_test(async (t) => {
const registration =
await service_worker_unregister_and_register(t, script, scope);
worker = registration.installing;
await wait_for_state(t, worker, 'activated');
frame = await with_iframe(scope);
}, 'global setup');
promise_test(async (t) => {
frame.contentWindow.fetch('dummy.txt?respondWith-not-called');
const message = await wait_for_message_from_worker();
assert_equals(message, 'RESOLVED');
}, 'FetchEvent.handled should resolve when respondWith() is not called');
promise_test(async (t) => {
frame.contentWindow.fetch(
'dummy.txt?respondWith-not-called-and-event-canceled').catch((e) => {});
const message = await wait_for_message_from_worker();
assert_equals(message, 'REJECTED');
}, 'FetchEvent.handled should reject when respondWith() is not called and the' +
' event is canceled');
promise_test(async (t) => {
frame.contentWindow.fetch(
'dummy.txt?respondWith-called-and-promise-resolved');
const message = await wait_for_message_from_worker();
assert_equals(message, 'RESOLVED');
}, 'FetchEvent.handled should resolve when the promise provided' +
' to respondWith() is resolved');
promise_test(async (t) => {
frame.contentWindow.fetch(
'dummy.txt?respondWith-called-and-promise-resolved-to-invalid-response')
.catch((e) => {});
const message = await wait_for_message_from_worker();
assert_equals(message, 'REJECTED');
}, 'FetchEvent.handled should reject when the promise provided' +
' to respondWith() is resolved to an invalid response');
promise_test(async (t) => {
frame.contentWindow.fetch(
'dummy.txt?respondWith-called-and-promise-rejected').catch((e) => {});
const message = await wait_for_message_from_worker();
assert_equals(message, 'REJECTED');
}, 'FetchEvent.handled should reject when the promise provided to' +
' respondWith() is rejected');
// Global cleanup: the final promise_test.
promise_test(async (t) => {
if (frame)
frame.remove();
await service_worker_unregister(t, scope);
}, 'global cleanup');
</script>
</html>
// This worker reports back the final state of FetchEvent.handled (RESOLVED or
// REJECTED) to the test.
// Send a message to the client with the client id.
function send_message_to_client(message, clientId) {
clients.get(clientId).then((client) => {
client.postMessage(message);
});
}
self.addEventListener('fetch', function(event) {
const clientId = event.clientId;
try {
event.handled.then(() => {
send_message_to_client('RESOLVED', clientId);
}, () => {
send_message_to_client('REJECTED', clientId);
});
} catch (e) {
send_message_to_client('FAILED', clientId);
return;
}
const search = new URL(event.request.url).search;
switch (search) {
case '?respondWith-not-called':
break;
case '?respondWith-not-called-and-event-canceled':
event.preventDefault();
break;
case '?respondWith-called-and-promise-resolved':
event.respondWith(Promise.resolve(new Response('body')));
break;
case '?respondWith-called-and-promise-resolved-to-invalid-response':
event.respondWith(Promise.resolve('invalid response'));
break;
case '?respondWith-called-and-promise-rejected':
event.respondWith(Promise.reject(new Error('respondWith rejected')));
break;
}
});
Copyright 2012, Google Inc.
All rights reserved.
Licensed under the W3C Test Suite License (the "License"); you may not
use this software except in compliance with the License. You may
obtain a copy of the License at
http://www.w3.org/Consortium/Legal/2008/04-testsuite-license.html
Alternatively, this software may be distributed under the terms of the
W3C 3-clause BSD License. You may obtain a copy of the W3C 3-clause
BSD License at
http://www.w3.org/Consortium/Legal/2008/03-bsd-license.html
W3C Test Suite Licence
This document, Test Suites and other documents that link to this
statement are provided by the copyright holders under the following
license: By using and/or copying this document, or the W3C document
from which this statement is linked, you (the licensee) agree that you
have read, understood, and will comply with the following terms and
conditions:
Permission to copy, and distribute the contents of this document, or
the W3C document from which this statement is linked, in any medium
for any purpose and without fee or royalty is hereby granted, provided
that you include the following on ALL copies of the document, or
portions thereof, that you use:
1. A link or URL to the original W3C document.
2. The pre-existing copyright notice of the original author, or if
it doesn't exist, a notice (hypertext is preferred, but a textual
representation is permitted) of the form: "Copyright ©
[$date-of-document] World Wide Web Consortium, (Massachusetts
Institute of Technology, European Research Consortium for Informatics
and Mathematics, Keio University) and others. All Rights
Reserved. http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html"
3. If it exists, the STATUS of the W3C document. When space
permits, inclusion of the full text of this NOTICE should be
provided. We request that authorship attribution be provided in any
software, documents, or other items or products that you create
pursuant to the implementation of the contents of this document, or
any portion thereof.
No right to create modifications or derivatives of W3C documents is
granted pursuant to this license. However, if additional requirements
(documented in the Copyright FAQ) are satisfied, the right to create
modifications or derivatives is sometimes granted by the W3C to
individuals complying with those requirements.
If a Test Suite distinguishes the test harness (or, framework for
navigation) and the actual tests, permission is given to remove or
alter the harness or navigation if the Test Suite in question allows
to do so. The tests themselves shall NOT be changed in any way.
The name and trademarks of W3C and other copyright holders may NOT be
used in advertising or publicity pertaining to this document or other
documents that link to this statement without specific, written prior
permission. Title to copyright in this document will at all times
remain with copyright holders. Permission is given to use the
trademarked string W3C within claims of performance concerning W3C
Specifications or features described therein, and there only, if the
test suite so authorizes.
THIS WORK IS PROVIDED BY W3C, MIT, ERCIM, KEIO UNIVERSITY, THE
COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL W3C, MIT, ERCIM, KEIO UNIVERSITY, THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
W3C 3-clause BSD License
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of works must retain the original copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the original
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of the W3C nor the names of its contributors may
be used to endorse or promote products derived from this work without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
W3C 3-clause BSD License
http://www.w3.org/Consortium/Legal/2008/03-bsd-license.html
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of works must retain the original copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the original copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the W3C nor the names of its contributors may be
used to endorse or promote products derived from this work without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
...@@ -10,37 +10,6 @@ from .tree import Commit ...@@ -10,37 +10,6 @@ from .tree import Commit
here = os.path.abspath(os.path.split(__file__)[0]) here = os.path.abspath(os.path.split(__file__)[0])
bsd_license = """W3C 3-clause BSD License
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of works must retain the original copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the original copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the W3C nor the names of its contributors may be
used to endorse or promote products derived from this work without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
"""
def copy_wpt_tree(tree, dest, excludes=None, includes=None): def copy_wpt_tree(tree, dest, excludes=None, includes=None):
"""Copy the working copy of a Tree to a destination directory. """Copy the working copy of a Tree to a destination directory.
...@@ -84,16 +53,6 @@ def copy_wpt_tree(tree, dest, excludes=None, includes=None): ...@@ -84,16 +53,6 @@ def copy_wpt_tree(tree, dest, excludes=None, includes=None):
dest_path = os.path.join(dest, destination, os.path.split(source)[1]) dest_path = os.path.join(dest, destination, os.path.split(source)[1])
shutil.copy2(source_path, dest_path) shutil.copy2(source_path, dest_path)
add_license(dest)
def add_license(dest):
"""Write the bsd license string to a LICENSE file.
:param dest: Directory in which to place the LICENSE file."""
with open(os.path.join(dest, "LICENSE"), "w") as f:
f.write(bsd_license)
class UpdateCheckout(Step): class UpdateCheckout(Step):
"""Pull changes from upstream into the local sync tree.""" """Pull changes from upstream into the local sync tree."""
......
W3C 3-clause BSD License
http://www.w3.org/Consortium/Legal/2008/03-bsd-license.html
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of works must retain the original copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the original copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the W3C nor the names of its contributors may be
used to endorse or promote products derived from this work without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
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