Skip to content

Commit

Permalink
Do not submit disconnected form elements
Browse files Browse the repository at this point in the history
Also, no longer recognize button.type = "menu".

These were fixed as part of reconciling our to-upstream forms tests with the now-upstreamed ones, i.e. as part of #1855.
  • Loading branch information
domenic committed May 21, 2017
1 parent 5f3cbd6 commit ecf7449
Show file tree
Hide file tree
Showing 19 changed files with 34 additions and 872 deletions.
11 changes: 11 additions & 0 deletions lib/jsdom/living/helpers/traversal.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
"use strict";
const domSymbolTree = require("./internal-constants").domSymbolTree;
const { DOCUMENT_NODE } = require("../node-type");

// All these operate on and return impls, not wrappers!

Expand All @@ -14,6 +15,16 @@ exports.closest = (e, localName) => {
return null;
};

exports.isConnected = node => {
while (node) {
if (node.nodeType === DOCUMENT_NODE) {
return true;
}
node = domSymbolTree.parent(node);
}
return false;
};

exports.childrenByHTMLLocalName = (parent, localName) => {
return domSymbolTree.childrenToArray(parent, { filter(node) {
return node._localName === localName && node._namespaceURI === "http://www.w3.org/1999/xhtml";
Expand Down
4 changes: 1 addition & 3 deletions lib/jsdom/living/nodes/HTMLButtonElement-impl.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class HTMLButtonElementImpl extends HTMLElementImpl {
const form = this.form;
if (form) {
if (this.type === "submit" && !isDisabled(this)) {
form._dispatchSubmitEvent();
form._doSubmit();
}
}
}
Expand All @@ -30,7 +30,6 @@ class HTMLButtonElementImpl extends HTMLElementImpl {
case "submit":
case "reset":
case "button":
case "menu":
return typeAttr;
default:
return "submit";
Expand All @@ -43,7 +42,6 @@ class HTMLButtonElementImpl extends HTMLElementImpl {
case "submit":
case "reset":
case "button":
case "menu":
this.setAttribute("type", v);
break;
default:
Expand Down
11 changes: 7 additions & 4 deletions lib/jsdom/living/nodes/HTMLFormElement-impl.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

const HTMLElementImpl = require("./HTMLElement-impl").implementation;
const idlUtils = require("../generated/utils");
const descendantsByHTMLLocalNames = require("../helpers/traversal").descendantsByHTMLLocalNames;
const domSymbolTree = require("../helpers/internal-constants").domSymbolTree;
const { isConnected, descendantsByHTMLLocalNames } = require("../helpers/traversal");
const { domSymbolTree } = require("../helpers/internal-constants");
const createHTMLCollection = require("../../living/html-collection").create;
const notImplemented = require("../../browser/not-implemented");
const reflectURLAttribute = require("../../utils").reflectURLAttribute;
const { reflectURLAttribute } = require("../../utils");

// http://www.whatwg.org/specs/web-apps/current-work/#category-listed
const listedElements = new Set(["button", "fieldset", "input", "keygen", "object", "select", "textarea"]);
Expand Down Expand Up @@ -53,7 +53,10 @@ class HTMLFormElementImpl extends HTMLElementImpl {
return this.elements.length;
}

_dispatchSubmitEvent() {
_doSubmit() {
if (!isConnected(this)) {
return;
}
const ev = this._ownerDocument.createEvent("HTMLEvents");
ev.initEvent("submit", true, true);
if (this.dispatchEvent(ev)) {
Expand Down
2 changes: 1 addition & 1 deletion lib/jsdom/living/nodes/HTMLInputElement-impl.js
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ class HTMLInputElementImpl extends HTMLElementImpl {
} else if (this.type === "submit") {
const form = this.form;
if (form) {
form._dispatchSubmitEvent();
form._doSubmit();
}
}
}
Expand Down
1 change: 1 addition & 0 deletions test/to-port-to-wpts/misc2.js
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,7 @@ describe("jsdom/miscellaneous", () => {
const form = doc.createElement("form");
const bttn = doc.createElement("button");
form.appendChild(bttn);
doc.body.appendChild(form);
bttn.click();

assert(error, "expected console to log not implemented error");
Expand Down
13 changes: 13 additions & 0 deletions test/web-platform-tests/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,20 +135,33 @@ describe("Web Platform Tests", () => {
"html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-default-value.html",
// "html/infrastructure/urls/terminology-0/document-base-url.html", // we don't support srcdoc <base> correctly
"html/semantics/forms/attributes-common-to-form-controls/disabled-elements-01.html",
"html/semantics/forms/resetting-a-form/reset-form-2.html",
"html/semantics/forms/the-button-element/button-click-submits.html",
"html/semantics/forms/the-button-element/button-type.html",
"html/semantics/forms/the-form-element/form-action-reflection-with-base-url.html",
"html/semantics/forms/the-form-element/form-action-reflection.html",
"html/semantics/forms/the-input-element/checkbox-click-events.html",
"html/semantics/forms/the-input-element/color.html",
"html/semantics/forms/the-input-element/password.html",
"html/semantics/forms/the-input-element/radio-input-cancel.html",
"html/semantics/forms/the-input-element/search_input.html",
"html/semantics/forms/the-input-element/selection.html",
"html/semantics/forms/the-input-element/telephone.html",
"html/semantics/forms/the-input-element/url.html",
"html/semantics/forms/the-label-element/proxy-click-to-associated-element.html",
"html/semantics/forms/the-option-element/option-element-constructor.html",
"html/semantics/forms/the-option-element/option-form.html",
"html/semantics/forms/the-option-element/option-index.html",
// "html/semantics/forms/the-option-element/option-label.html", // our impl is wrong; see comments in HTMLOptionElement-impl.js
"html/semantics/forms/the-option-element/option-selected.html",
"html/semantics/forms/the-option-element/option-text-backslash.html",
"html/semantics/forms/the-option-element/option-text-label.html",
// "html/semantics/forms/the-option-element/option-text-recurse.html", // our impl is wrong; see comments in HTMLOptionElement-impl.js
"html/semantics/forms/the-option-element/option-text-spaces.html",
// "html/semantics/forms/the-option-element/option-value.html", // our impl is wrong; see comments in HTMLOptionElement-impl.js
"html/semantics/forms/the-select-element/select-multiple.html",
"html/semantics/forms/the-select-element/select-selectedOptions.html",
"html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html",
"html/semantics/disabled-elements/disabledElement.html",
"html/semantics/document-metadata/the-base-element/base_about_blank.html",
"html/semantics/document-metadata/the-base-element/base_href_empty.html",
Expand Down
12 changes: 0 additions & 12 deletions test/web-platform-tests/to-upstream.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,24 +76,12 @@ describe("Local tests in Web Platform Test format (to-upstream)", () => {
"html/named-access-on-window/removing.html",
"html/obsolete/requirements-for-implementations/other-elements-attributes-and-apis/applets.html",
"html/semantics/document-metadata/the-link-element/stylesheet-appropriate-time-to-obtain.html",
"html/semantics/forms/resetting-a-form/reset-form-2.html",
"html/semantics/forms/the-button-element/button-click-submits.html",
"html/semantics/forms/the-button-element/button-type.html",
"html/semantics/forms/the-form-element/form-action.html",
"html/semantics/forms/the-input-element/checkbox-click-events.html",
"html/semantics/forms/the-input-element/disabled-checkbox.html",
"html/semantics/forms/the-input-element/radio-input-cancel.html",
"html/semantics/forms/the-label-element/proxy-click-to-associated-element.html",
"html/semantics/forms/the-option-element/option-ask-for-a-reset.html",
"html/semantics/forms/the-option-element/option-index.html",
"html/semantics/forms/the-option-element/option-element-constructor.html",
"html/semantics/forms/the-select-element/select-multiple.html",
"html/semantics/forms/the-select-element/select-selectedOptions.html",
"html/semantics/forms/the-textarea-element/select.html",
"html/semantics/forms/the-textarea-element/set-value-reset-selection.html",
"html/semantics/forms/the-textarea-element/setRangeText.html",
"html/semantics/forms/the-textarea-element/setSelectionRange.html",
"html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html",
"html/semantics/links/links-created-by-a-and-area-elements/html-hyperlink-element-utils-href.html",
"html/semantics/scripting-1/the-script-element/script-languages-dont-upstream.html",
"html/semantics/scripting-1/the-script-element/changing-src.html",
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading

0 comments on commit ecf7449

Please sign in to comment.