commit 4ac3e2125c70bb8bf024023a2056ddbfcb16fc38
parent cfc7832ef25bfb7e5bbc3755f5f5fd32b4d82d54
Author: Gastón Rodríguez <gastonr@microsoft.com>
Date: Mon, 27 Oct 2025 10:01:07 +0000
Bug 1995695 [wpt PR 55087] - Make dropEffect and effectAllowed blink web tests a WPT test, a=testonly
Automatic update from web-platform-tests
Make dropEffect and effectAllowed blink web tests a WPT test
This CL makes the `fast/events/drag-and-drop.html` web test into a WPT
test that uses the action driver API.
The new tests verify that dragging with different `effectAllowed`s
result in the correct behavior when dropping onto different
`dropEffect`s.
Test 029.html verifies that the values are properly set on the drop
event (sent to the drop target), and test 030.html verifies that the
values are properly set on the dragEnd event (sent to the drag div).
Bug: 434151262, 441537624
Change-Id: Iffd1788508a847c6b928c50fc3f44ebce147c4f9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6956095
Reviewed-by: Mustaq Ahmed <mustaq@chromium.org>
Commit-Queue: Gaston Rodriguez <gastonr@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#1533261}
--
wpt-commits: 7c68141cfe0266ec7fa87d6878b81d03abd85afd
wpt-pr: 55087
Diffstat:
10 files changed, 353 insertions(+), 18 deletions(-)
diff --git a/testing/web-platform/tests/html/editing/dnd/drop/001.xhtml b/testing/web-platform/tests/html/editing/dnd/drop/001.xhtml
@@ -5,6 +5,7 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
+<script src="support/dropEffect-test-helper.js"></script>
<script src="../resources/test-helper.js"></script>
<head>
<title>dropEffect is correctly set when it matches effectAllowed</title>
@@ -59,17 +60,11 @@
async function test() {
await new Promise(loaded => window.addEventListener("load", loaded));
- function onDropCallBack(event) {
- assert_equals(event.target.textContent, event.dataTransfer.dropEffect);
- assert_equals(event.target.textContent, event.dataTransfer
- .effectAllowed);
- return true;
- }
for (const effect of ['copy', 'move', 'link']) {
const dragDiv = document.getElementById(effect + '-drag');
const dropDiv = document.getElementById(effect + '-drop');
dragDropTest(
- dragDiv, dropDiv, onDropCallBack,
+ dragDiv, dropDiv, dropEffectOnDropCallBack,
'dropEffect should match effectAllowed on drop for ' + effect);
}
}
diff --git a/testing/web-platform/tests/html/editing/dnd/drop/002.xhtml b/testing/web-platform/tests/html/editing/dnd/drop/002.xhtml
@@ -5,6 +5,7 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
+<script src="support/dropEffect-test-helper.js"></script>
<script src="../resources/test-helper.js"></script>
<head>
<title>Text input selection drag and drop: allowed effects
diff --git a/testing/web-platform/tests/html/editing/dnd/drop/003.xhtml b/testing/web-platform/tests/html/editing/dnd/drop/003.xhtml
@@ -5,6 +5,7 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
+<script src="support/dropEffect-test-helper.js"></script>
<script src="../resources/test-helper.js"></script>
<head>
<title>dropEffect matches effectAllowed for link drag and drop</title>
diff --git a/testing/web-platform/tests/html/editing/dnd/drop/004.xhtml b/testing/web-platform/tests/html/editing/dnd/drop/004.xhtml
@@ -5,6 +5,7 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
+<script src="support/dropEffect-test-helper.js"></script>
<script src="../resources/test-helper.js"></script>
<head>
<title>dropEffect matches effectAllowed for PNG image drag and drop</title>
diff --git a/testing/web-platform/tests/html/editing/dnd/drop/005.xhtml b/testing/web-platform/tests/html/editing/dnd/drop/005.xhtml
@@ -5,6 +5,7 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
+<script src="support/dropEffect-test-helper.js"></script>
<script src="../resources/test-helper.js"></script>
<head>
<title>SVG image drag and drop: allowed effects 'copy','move','link'</title>
diff --git a/testing/web-platform/tests/html/editing/dnd/drop/006.xhtml b/testing/web-platform/tests/html/editing/dnd/drop/006.xhtml
@@ -5,6 +5,7 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
+<script src="support/dropEffect-test-helper.js"></script>
<script src="../resources/test-helper.js"></script>
<head>
<title>Canvas drag and drop: allowed effects 'copy','move','link'</title>
diff --git a/testing/web-platform/tests/html/editing/dnd/drop/029.html b/testing/web-platform/tests/html/editing/dnd/drop/029.html
@@ -0,0 +1,94 @@
+<!doctype html>
+<meta name="variant" content="?dropeffect=none&effectallowed=none">
+<meta name="variant" content="?dropeffect=none&effectallowed=uninitialized">
+<meta name="variant" content="?dropeffect=none&effectallowed=undefined">
+<meta name="variant" content="?dropeffect=none&effectallowed=all">
+<meta name="variant" content="?dropeffect=none&effectallowed=copy">
+<meta name="variant" content="?dropeffect=none&effectallowed=move">
+<meta name="variant" content="?dropeffect=none&effectallowed=link">
+<meta name="variant" content="?dropeffect=none&effectallowed=copyMove">
+<meta name="variant" content="?dropeffect=none&effectallowed=copyLink">
+<meta name="variant" content="?dropeffect=none&effectallowed=linkMove">
+<meta name="variant" content="?dropeffect=none&effectallowed=dummy">
+<meta name="variant" content="?dropeffect=copy&effectallowed=none">
+<meta name="variant" content="?dropeffect=copy&effectallowed=uninitialized">
+<meta name="variant" content="?dropeffect=copy&effectallowed=undefined">
+<meta name="variant" content="?dropeffect=copy&effectallowed=all">
+<meta name="variant" content="?dropeffect=copy&effectallowed=copy">
+<meta name="variant" content="?dropeffect=copy&effectallowed=move">
+<meta name="variant" content="?dropeffect=copy&effectallowed=link">
+<meta name="variant" content="?dropeffect=copy&effectallowed=copyMove">
+<meta name="variant" content="?dropeffect=copy&effectallowed=copyLink">
+<meta name="variant" content="?dropeffect=copy&effectallowed=linkMove">
+<meta name="variant" content="?dropeffect=copy&effectallowed=dummy">
+<meta name="variant" content="?dropeffect=move&effectallowed=uninitialized">
+<meta name="variant" content="?dropeffect=move&effectallowed=undefined">
+<meta name="variant" content="?dropeffect=move&effectallowed=none">
+<meta name="variant" content="?dropeffect=move&effectallowed=all">
+<meta name="variant" content="?dropeffect=move&effectallowed=copy">
+<meta name="variant" content="?dropeffect=move&effectallowed=move">
+<meta name="variant" content="?dropeffect=move&effectallowed=link">
+<meta name="variant" content="?dropeffect=move&effectallowed=copyMove">
+<meta name="variant" content="?dropeffect=move&effectallowed=copyLink">
+<meta name="variant" content="?dropeffect=move&effectallowed=linkMove">
+<meta name="variant" content="?dropeffect=move&effectallowed=dummy">
+<meta name="variant" content="?dropeffect=link&effectallowed=uninitialized">
+<meta name="variant" content="?dropeffect=link&effectallowed=undefined">
+<meta name="variant" content="?dropeffect=link&effectallowed=none">
+<meta name="variant" content="?dropeffect=link&effectallowed=all">
+<meta name="variant" content="?dropeffect=link&effectallowed=copy">
+<meta name="variant" content="?dropeffect=link&effectallowed=move">
+<meta name="variant" content="?dropeffect=link&effectallowed=link">
+<meta name="variant" content="?dropeffect=link&effectallowed=copyMove">
+<meta name="variant" content="?dropeffect=link&effectallowed=copyLink">
+<meta name="variant" content="?dropeffect=link&effectallowed=linkMove">
+<meta name="variant" content="?dropeffect=link&effectallowed=dummy">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=uninitialized">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=undefined">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=none">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=all">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=copy">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=move">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=link">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=copyMove">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=copyLink">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=linkMove">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=dummy">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/dnd.html#dropEffect-initialisation">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="support/dropEffect-test-helper.js"></script>
+<script src="../resources/test-helper.js"></script>
+<head>
+ <title>Test all effectAlloweds against all dropEffects on drop event</title>
+ <style>
+ div {
+ display: inline-block;
+ vertical-align: top;
+ background-color: olive;
+ color: white;
+ margin-left: 20px;
+ margin-top: 20px;
+ width: 75px;
+ height: 75px;
+ font-size: small;
+ }
+ </style>
+</head>
+<body>
+ <p>These are the draggable elements with different effectAllowed
+ settings:
+ <p id="drag-container"> </p>
+ </p>
+ <p> Drop targets with different dropEffects:
+ <p id="drop-container"> </p>
+ </p>
+</body>
+<script>
+ const urlSearch = new URLSearchParams(window.location.search);
+ runDropEffectTestOnDrop(urlSearch.get('effectallowed'), urlSearch.get('dropeffect'));
+</script>
+</html>
diff --git a/testing/web-platform/tests/html/editing/dnd/drop/030.html b/testing/web-platform/tests/html/editing/dnd/drop/030.html
@@ -0,0 +1,96 @@
+<!doctype html>
+<meta name="variant" content="?dropeffect=none&effectallowed=none">
+<meta name="variant" content="?dropeffect=none&effectallowed=uninitialized">
+<meta name="variant" content="?dropeffect=none&effectallowed=undefined">
+<meta name="variant" content="?dropeffect=none&effectallowed=all">
+<meta name="variant" content="?dropeffect=none&effectallowed=copy">
+<meta name="variant" content="?dropeffect=none&effectallowed=move">
+<meta name="variant" content="?dropeffect=none&effectallowed=link">
+<meta name="variant" content="?dropeffect=none&effectallowed=copyMove">
+<meta name="variant" content="?dropeffect=none&effectallowed=copyLink">
+<meta name="variant" content="?dropeffect=none&effectallowed=linkMove">
+<meta name="variant" content="?dropeffect=none&effectallowed=dummy">
+<meta name="variant" content="?dropeffect=copy&effectallowed=none">
+<meta name="variant" content="?dropeffect=copy&effectallowed=uninitialized">
+<meta name="variant" content="?dropeffect=copy&effectallowed=undefined">
+<meta name="variant" content="?dropeffect=copy&effectallowed=all">
+<meta name="variant" content="?dropeffect=copy&effectallowed=copy">
+<meta name="variant" content="?dropeffect=copy&effectallowed=move">
+<meta name="variant" content="?dropeffect=copy&effectallowed=link">
+<meta name="variant" content="?dropeffect=copy&effectallowed=copyMove">
+<meta name="variant" content="?dropeffect=copy&effectallowed=copyLink">
+<meta name="variant" content="?dropeffect=copy&effectallowed=linkMove">
+<meta name="variant" content="?dropeffect=copy&effectallowed=dummy">
+<meta name="variant" content="?dropeffect=move&effectallowed=uninitialized">
+<meta name="variant" content="?dropeffect=move&effectallowed=undefined">
+<meta name="variant" content="?dropeffect=move&effectallowed=none">
+<meta name="variant" content="?dropeffect=move&effectallowed=all">
+<meta name="variant" content="?dropeffect=move&effectallowed=copy">
+<meta name="variant" content="?dropeffect=move&effectallowed=move">
+<meta name="variant" content="?dropeffect=move&effectallowed=link">
+<meta name="variant" content="?dropeffect=move&effectallowed=copyMove">
+<meta name="variant" content="?dropeffect=move&effectallowed=copyLink">
+<meta name="variant" content="?dropeffect=move&effectallowed=linkMove">
+<meta name="variant" content="?dropeffect=move&effectallowed=dummy">
+<meta name="variant" content="?dropeffect=link&effectallowed=uninitialized">
+<meta name="variant" content="?dropeffect=link&effectallowed=undefined">
+<meta name="variant" content="?dropeffect=link&effectallowed=none">
+<meta name="variant" content="?dropeffect=link&effectallowed=all">
+<meta name="variant" content="?dropeffect=link&effectallowed=copy">
+<meta name="variant" content="?dropeffect=link&effectallowed=move">
+<meta name="variant" content="?dropeffect=link&effectallowed=link">
+<meta name="variant" content="?dropeffect=link&effectallowed=copyMove">
+<meta name="variant" content="?dropeffect=link&effectallowed=copyLink">
+<meta name="variant" content="?dropeffect=link&effectallowed=linkMove">
+<meta name="variant" content="?dropeffect=link&effectallowed=dummy">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=uninitialized">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=undefined">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=none">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=all">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=copy">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=move">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=link">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=copyMove">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=copyLink">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=linkMove">
+<meta name="variant" content="?dropeffect=dummy&effectallowed=dummy">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="support/dropEffect-test-helper.js"></script>
+<script src="../resources/test-helper.js"></script>
+
+<head>
+ <title>Test all effectAlloweds against against all dropEffects on dragEnd</title>
+ <style>
+ div {
+ display: inline-block;
+ vertical-align: top;
+ background-color: olive;
+ color: white;
+ margin-left: 20px;
+ margin-top: 20px;
+ width: 75px;
+ height: 75px;
+ font-size: small;
+ }
+ </style>
+</head>
+
+<body>
+ <p>These are the draggable elements with different effectAllowed
+ settings:
+ <p id="drag-container"> </p>
+ </p>
+ <p> Drop targets with different dropEffects:
+ <p id="drop-container"> </p>
+ </p>
+</body>
+<script>
+ const urlSearch = new URLSearchParams(window.location.search);
+ runDropEffectTestOnDragEnd(urlSearch.get('effectallowed'),urlSearch.get('dropeffect'));
+</script>
+
+</html>
diff --git a/testing/web-platform/tests/html/editing/dnd/drop/support/dropEffect-test-helper.js b/testing/web-platform/tests/html/editing/dnd/drop/support/dropEffect-test-helper.js
@@ -0,0 +1,131 @@
+const effectAllowedList = ["uninitialized", "undefined", "none", "all",
+ "copy",
+ "move", "link", "copyMove", "copyLink", "linkMove", "dummy"
+];
+const dropEffectList = [ "none", "copy", "move", "link", "dummy" ];
+
+// Drop callback used for `dropEffect` tests in `dnd/drop/`. This function
+// compares the text content of the drop target with the `dropEffect` and
+// `effectAllowed` values of the `dataTransfer` object. The only
+// `effectAllowed` values that will be compared are "copy", "move", and "link"
+// since they have to correspond to the `dropEffect` value of the event.
+function dropEffectOnDropCallBack(event) {
+ assert_equals(event.target.textContent, event.dataTransfer.dropEffect);
+ assert_equals(event.target.textContent, event.dataTransfer.effectAllowed);
+ return true;
+}
+
+function buildDragAndDropDivs() {
+ effectAllowedList.forEach(effectAllowed => {
+ document.getElementById('drag-container').innerHTML +=
+ `<div id="drag-${effectAllowed}" draggable="true" ondragstart="event.dataTransfer.effectAllowed = '${effectAllowed}'">${effectAllowed}</div>`;
+ });
+ dropEffectList.forEach(dropEffect => {
+ document.getElementById('drop-container').innerHTML +=
+ `<div id="drop-${dropEffect}" ondragover="onDragOver(event, '${dropEffect}')">${dropEffect}</div>`;
+ });
+}
+
+function expectedDropEffectForEffectAllowed(chosenDropEffect,
+ chosenEffectAllowed) {
+ if (chosenDropEffect == "dummy") {
+ switch (chosenEffectAllowed) {
+ case "undefined":
+ case "copyLink":
+ case "copyMove":
+ case "uninitialized":
+ case "all":
+ return "copy";
+ case "linkMove":
+ return "link";
+ case "move":
+ return "move";
+ default:
+ return chosenEffectAllowed;
+ }
+ }
+ return chosenDropEffect;
+}
+
+function dropEventShouldBeSent(dropEffect, effectAllowed) {
+ dropEffect = expectedDropEffectForEffectAllowed(dropEffect, effectAllowed);
+ if (effectAllowed === 'dummy' || effectAllowed === 'undefined') {
+ effectAllowed = 'uninitialized';
+ }
+ if (effectAllowed === 'none' || dropEffect === 'none') {
+ return false;
+ }
+ if (effectAllowed === 'uninitialized' || effectAllowed === 'all') {
+ return true;
+ }
+ // Matches cases like `copyLink` / `link`.
+ if (effectAllowed.toLowerCase().includes(dropEffect)) {
+ return true;
+ }
+ return false;
+}
+
+function onDropCallBack(event, chosenDropEffect, chosenEffectAllowed) {
+ const actualDropEffect = event.dataTransfer.dropEffect;
+ const actualEffectAllowed = event.dataTransfer.effectAllowed;
+ let expectedEffectAllowed = chosenEffectAllowed;
+ if (chosenEffectAllowed === 'dummy' || chosenEffectAllowed ===
+ 'undefined') {
+ expectedEffectAllowed = 'uninitialized';
+ }
+ assert_equals(actualEffectAllowed, expectedEffectAllowed,
+ `chosenDropEffect: ${chosenDropEffect}, chosenEffectAllowed: ${chosenEffectAllowed}; failed effectAllowed check:`
+ );
+ let expectedDropEffect = expectedDropEffectForEffectAllowed(
+ chosenDropEffect, actualEffectAllowed);
+ // `dragend` events with invalid dropEffect-effectAllowed combinations have a
+ // `none` dropEffect.
+ if (!dropEventShouldBeSent(chosenDropEffect, chosenEffectAllowed)) {
+ expectedDropEffect = 'none';
+ }
+ assert_equals(actualDropEffect, expectedDropEffect,
+ `chosenDropEffect: ${chosenDropEffect}, chosenEffectAllowed: ${chosenEffectAllowed}; failed dropEffect check:`
+ );
+ return true;
+}
+
+function onDragOver(event, dropEffect) {
+ event.dataTransfer.dropEffect = dropEffect;
+ event.preventDefault();
+}
+
+// This function creates the divs with all the `effectAllowed`s defined in
+// `effectAllowedList` and runs a drag and drop test that verifies that
+// the correct events are sent (or not) depending on the combination of
+// `dropEffect` and `effectAllowed`.
+// `effectAllowed`: string with the `effectAllowed` that will be set on the
+// drag target.
+// `dropEffect`: string with the `dropEffect` that will be set on the
+// drop target.
+function runDropEffectTestOnDragEnd(effectAllowed, dropEffect) {
+ buildDragAndDropDivs();
+ const dragDiv = document.getElementById("drag-" + effectAllowed);
+ const dropDiv = document.getElementById("drop-" + dropEffect);
+ dragEndTest(dragDiv, dropDiv, (e) => onDropCallBack(e,
+ dropEffect, effectAllowed),
+ `${effectAllowed} / ${dropEffect}`);
+}
+
+// Like `runDropEffectTestOnDragEnd`, but verifies that the drop event has the
+// correct `dropEffect` and `effectAllowed` values on the drop target, instead
+// of `dragEnd` on the drag element.
+function runDropEffectTestOnDrop(effectAllowed, dropEffect) {
+ buildDragAndDropDivs();
+ const dragDiv = document.getElementById("drag-" + effectAllowed);
+ const dropDiv = document.getElementById("drop-" + dropEffect);
+ const shouldReceiveDropEvent = dropEventShouldBeSent(dropEffect,
+ effectAllowed);
+ if (shouldReceiveDropEvent) {
+ dragDropTest(dragDiv, dropDiv, (e) => onDropCallBack(e,
+ dropEffect, effectAllowed),
+ `${effectAllowed} / ${dropEffect}`);
+ } else {
+ dragDropTestNoDropEvent(dragDiv, dropDiv,
+ `${effectAllowed} / ${dropEffect}`);
+ }
+}
diff --git a/testing/web-platform/tests/html/editing/dnd/resources/test-helper.js b/testing/web-platform/tests/html/editing/dnd/resources/test-helper.js
@@ -127,6 +127,31 @@ function dragDropTest(dragElement, dropElement, onDropCallBack, testDescription,
}, testDescription));
}
+// Similar to `dragDropTest`, but instead of listening to the `drop` event on the
+// `dropElement`, this function listens to `dragend` on the `dragElement`.
+function dragEndTest(dragElement, dropElement, onDropCallBack, testDescription,
+ dragIframe = undefined, dropIframe = undefined) {
+ promise_test((t) => new Promise(async (resolve, reject) => {
+ dragElement.addEventListener('dragend', t.step_func((event) => {
+ if (onDropCallBack(event) == true) {
+ resolve();
+ } else {
+ reject();
+ }
+ }));
+ try {
+ var actions = new test_driver.Actions();
+ actions = movePointerToCenter(dragElement, dragIframe, actions)
+ .pointerDown();
+ actions = movePointerToCenter(dropElement, dropIframe, actions)
+ .pointerUp();
+ await actions.send();
+ } catch (e) {
+ reject(e);
+ }
+ }, testDescription));
+}
+
// The dragDropTestNoDropEvent function performs a drag-and-drop test but expects
// no drop event to occur. This is useful for testing scenarios where drag-and-drop
// should be blocked or ignored (e.g., dropping on root scrollbars). The test
@@ -187,14 +212,3 @@ const calculateScrollbarThickness = () => {
return widthBefore - widthAfter;
}
-
-// Drop callback used for `dropEffect` tests in `dnd/drop/`. This function
-// compares the text content of the drop target with the `dropEffect` and
-// `effectAllowed` values of the `dataTransfer` object. The only
-// `effectAllowed` values that will be compared are "copy", "move", and "link"
-// since they have to correspond to the `dropEffect` value of the event.
-function dropEffectOnDropCallBack(event) {
- assert_equals(event.target.textContent, event.dataTransfer.dropEffect);
- assert_equals(event.target.textContent, event.dataTransfer.effectAllowed);
- return true;
-}