Commit 0cc25f26 authored by Kent Tamura's avatar Kent Tamura Committed by Commit Bot

FormDataEvent: Make the feature "experimental".

also, add test cases.

Bug: 825684
Change-Id: I0ce0bbbd5b4c218042f934264ab4de288eba9dae
Reviewed-on: https://chromium-review.googlesource.com/997316Reviewed-by: default avatarYoshifumi Inoue <yosin@chromium.org>
Commit-Queue: Kent Tamura <tkent@chromium.org>
Cr-Commit-Position: refs/heads/master@{#548692}
parent 5cb9113e
......@@ -100,6 +100,7 @@ PASS oldChildWindow.onemptied is newChildWindow.onemptied
PASS oldChildWindow.onended is newChildWindow.onended
PASS oldChildWindow.onerror is newChildWindow.onerror
PASS oldChildWindow.onfocus is newChildWindow.onfocus
PASS oldChildWindow.onformdata is newChildWindow.onformdata
PASS oldChildWindow.onfreeze is newChildWindow.onfreeze
PASS oldChildWindow.ongotpointercapture is newChildWindow.ongotpointercapture
PASS oldChildWindow.onhashchange is newChildWindow.onhashchange
......
......@@ -68,6 +68,7 @@ PASS childWindow.onemptied is null
PASS childWindow.onended is null
PASS childWindow.onerror is null
PASS childWindow.onfocus is null
PASS childWindow.onformdata is null
PASS childWindow.onfreeze is null
PASS childWindow.ongotpointercapture is null
PASS childWindow.onhashchange is null
......
......@@ -68,6 +68,7 @@ PASS childWindow.onemptied is null
PASS childWindow.onended is null
PASS childWindow.onerror is null
PASS childWindow.onfocus is null
PASS childWindow.onformdata is null
PASS childWindow.onfreeze is null
PASS childWindow.ongotpointercapture is null
PASS childWindow.onhashchange is null
......
<!DOCTYPE html>
<body>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<div id="container"></div>
<iframe name="t"></iframe>
<script>
let container = document.querySelector('#container');
function populateForm(opt_contentHtml) {
if (!opt_contentHtml)
opt_contentHtml = '';
container.innerHTML = `<form action="about:blank" target="t">${opt_contentHtml}</form>`;
return container.firstChild;
}
test(() => {
let didCallHandler = false;
let form = populateForm('<input type=submit>');
form.addEventListener('formdata', (e) => {
didCallHandler = true;
});
document.querySelector('input[type=submit]').click();
assert_true(didCallHandler);
}, 'Register a "formdata" event handler via addEventListener().');
test(() => {
let didCallHandler = false;
let form = populateForm();
form.onformdata = (e) => {
didCallHandler = true;
};
form.submit();
assert_true(didCallHandler);
}, 'Register a "formdata" event handler via onformdata IDL attribute.');
let didCallAttributeHandler = false;
test(() => {
let form = populateForm();
form.setAttribute('onformdata', 'didCallAttributeHandler = true;');
new FormData(form);
assert_true(didCallAttributeHandler);
}, 'Register a "formdata" event handler via onformdata content attribute.');
test(() => {
let didCallHandler = false;
let wasCancelable = true;
let form = populateForm();
document.addEventListener('formdata', (e) => {
didCallHandler = true;
wasCancelable = e.cancelable;
});
new FormData(form);
assert_true(didCallHandler);
assert_false(wasCancelable);
}, '"formdata" event bubbles, and is not cancelable.');
test(() => {
let didCallHandler = false;
let form = populateForm();
container.innerHTML = '<div></div>';
let orphanRoot = container.firstChild;
orphanRoot.appendChild(form);
orphanRoot.remove();
orphanRoot.addEventListener('formdata', (e) => {
didCallHandler = true;
});
new FormData(form);
assert_true(didCallHandler);
}, '"formdata" event bubbles in an orphan tree.');
test(() => {
let wasFormDataEmpty1 = false;
let wasFormDataEmpty2 = true;
let form = populateForm('<input name=n1 value=v1>');
form.addEventListener('formdata', (e) => {
wasFormDataEmpty1 = e.formData.entries().next().done;
e.formData.append('h1', 'vh1');
e.formData.append('h2', 'vh2');
});
form.addEventListener('formdata', (e) => {
if (e.formData.get('h1') == 'vh1' && e.formData.get('h2') == 'vh2')
wasFormDataEmpty2 = false;
});
form.submit();
assert_true(wasFormDataEmpty1);
assert_false(wasFormDataEmpty2);
}, '"formData" IDL attribute should be empty in the first event handler, ' +
'and the second handler can read entries set by the first handler.');
test(() => {
let form = populateForm('<input name=n1 value=v1>');
form.addEventListener('formdata', (e) => {
e.formData.append('h1', 'vh1');
});
let formData = new FormData(form);
assert_equals(formData.get('h1'), 'vh1');
assert_equals(formData.get('n1'), 'v1');
}, 'Newly created FormData contains entries added to "formData" IDL attribute of FormDataEvent.');
let t1 = async_test('Entries added to "formData" IDL attribute should be submitted.');
t1.step(() => {
let form = populateForm('<input name=n1 value=v1>');
form.addEventListener('formdata', (e) => {
e.formData.append('h1', 'vh1');
});
let iframe = document.querySelector('iframe');
iframe.onload = t1.step_func_done(() => {
assert_true(iframe.contentWindow.location.search.indexOf('h1=vh1&n1=v1') != -1);
});
container.firstChild.submit();
});
let t2 = async_test('Form submission is aborted if "formData" event handler disconnects the form.');
t2.step(() => {
let form = document.createElement('form');
document.body.appendChild(form);
form.action = 'about:blank';
form.target = 'iframe2';
form.onformdata = (e) => { e.target.remove(); };
form.innerHTML = '<input name=n1 value=v1>';
let iframe = document.createElement('iframe');
iframe.setAttribute('name', 'iframe2');
let wasLoaded = false;
document.body.appendChild(iframe);
// Request to load "about:blank", and immediately submit the form to
// the same frame. If the form submission is aborted, the first request
// will be completed.
iframe.onload = t2.step_func_done(() => {
wasLoaded = true;
assert_true(iframe.contentWindow.location.search.indexOf('n1=v1') == -1);
});
iframe.src = 'about:blank';
assert_false(wasLoaded, 'Make sure the first loading is ongoing.');
form.submit();
});
</script>
</body>
......@@ -147,6 +147,7 @@ namespace http://www.w3.org/1999/xhtml
property onended
property onerror
property onfocus
property onformdata
property onfullscreenchange
property onfullscreenerror
property ongotpointercapture
......@@ -1250,6 +1251,7 @@ namespace http://www.w3.org/2000/svg
property onended
property onerror
property onfocus
property onformdata
property onfullscreenchange
property onfullscreenerror
property ongotpointercapture
......
......@@ -1516,6 +1516,7 @@ interface Document : Node
getter onended
getter onerror
getter onfocus
getter onformdata
getter onfullscreenchange
getter onfullscreenerror
getter ongotpointercapture
......@@ -1702,6 +1703,7 @@ interface Document : Node
setter onended
setter onerror
setter onfocus
setter onformdata
setter onfullscreenchange
setter onfullscreenerror
setter ongotpointercapture
......@@ -2081,6 +2083,10 @@ interface FormData
method keys
method set
method values
interface FormDataEvent : Event
attribute @@toStringTag
getter formData
method constructor
interface GainNode : AudioNode
attribute @@toStringTag
getter gain
......@@ -2457,6 +2463,7 @@ interface HTMLElement : Element
getter onended
getter onerror
getter onfocus
getter onformdata
getter ongotpointercapture
getter oninput
getter oninvalid
......@@ -2552,6 +2559,7 @@ interface HTMLElement : Element
setter onended
setter onerror
setter onfocus
setter onformdata
setter ongotpointercapture
setter oninput
setter oninvalid
......@@ -5684,6 +5692,7 @@ interface SVGElement : Element
getter onended
getter onerror
getter onfocus
getter onformdata
getter ongotpointercapture
getter oninput
getter oninvalid
......@@ -5766,6 +5775,7 @@ interface SVGElement : Element
setter onended
setter onerror
setter onfocus
setter onformdata
setter ongotpointercapture
setter oninput
setter oninvalid
......@@ -9325,6 +9335,7 @@ interface webkitURL
getter onended
getter onerror
getter onfocus
getter onformdata
getter onfreeze
getter ongotpointercapture
getter onhashchange
......@@ -9510,6 +9521,7 @@ interface webkitURL
setter onended
setter onerror
setter onfocus
setter onformdata
setter onfreeze
setter ongotpointercapture
setter onhashchange
......
......@@ -493,6 +493,7 @@
},
{
name: "FormDataEvent",
status: "experimental",
},
{
name: "FractionalMouseEvent",
......
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