mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-04 23:08:39 +09:00
Bug 1276438 part 3. Align the .body setter with the spec a bit better.
There are two changes here: 1) We allow setting .body even if the root element is not an <html:html>. This is what the spec says to do, and what we used to do before the changes in bug 366200. No tests for this yet, pending https://github.com/whatwg/html/issues/3403 getting resolved. 2) We use GetBody(), not GetBodyElement(), to look for an existing thing to replace. This matters if there are <frameset>s involved. Tag UXP Issue #1344 Tag UXP Issue #252
This commit is contained in:
parent
c939244e89
commit
e8e20e994d
2 changed files with 53 additions and 5 deletions
|
|
@ -6562,18 +6562,16 @@ nsIDocument::SetBody(nsGenericHTMLElement* newBody, ErrorResult& rv)
|
|||
nsCOMPtr<Element> root = GetRootElement();
|
||||
|
||||
// The body element must be either a body tag or a frameset tag. And we must
|
||||
// have a html root tag, otherwise GetBody will not return the newly set
|
||||
// body.
|
||||
// have a root element to be able to add kids to it.
|
||||
if (!newBody ||
|
||||
!newBody->IsAnyOfHTMLElements(nsGkAtoms::body, nsGkAtoms::frameset) ||
|
||||
!root || !root->IsHTMLElement() ||
|
||||
!root->IsHTMLElement(nsGkAtoms::html)) {
|
||||
!root) {
|
||||
rv.Throw(NS_ERROR_DOM_HIERARCHY_REQUEST_ERR);
|
||||
return;
|
||||
}
|
||||
|
||||
// Use DOM methods so that we pass through the appropriate security checks.
|
||||
nsCOMPtr<Element> currentBody = GetBodyElement();
|
||||
nsCOMPtr<Element> currentBody = GetBody();
|
||||
if (currentBody) {
|
||||
root->ReplaceChild(*newBody, *currentBody, rv);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -166,4 +166,54 @@ test(function() {
|
|||
doc.body = new_frameset;
|
||||
assert_equals(doc.body, new_frameset, "test6-3, append frameset to a new document");
|
||||
}, "Setting document.body to a new frameset element.");
|
||||
|
||||
test(function() {
|
||||
var doc = createDocument();
|
||||
var html = doc.appendChild(doc.createElement("html"));
|
||||
var f =
|
||||
html.appendChild(doc.createElement("frameset"));
|
||||
assert_equals(doc.body, f);
|
||||
|
||||
var b = doc.createElement("body");
|
||||
doc.body = b;
|
||||
|
||||
assert_equals(f.parentNode, null,
|
||||
"Frameset should have been removed from the tree");
|
||||
assert_equals(doc.body, b, "Body should be the new doc.body");
|
||||
}, "Setting document.body to a body will replace an existing frameset if there is one.");
|
||||
|
||||
test(function() {
|
||||
var doc = createDocument();
|
||||
var html = doc.appendChild(doc.createElement("html"));
|
||||
var b =
|
||||
html.appendChild(doc.createElement("body"));
|
||||
assert_equals(doc.body, b);
|
||||
|
||||
var f = doc.createElement("frameset");
|
||||
doc.body = f;
|
||||
|
||||
assert_equals(b.parentNode, null,
|
||||
"Body should have been removed from the tree");
|
||||
assert_equals(doc.body, f, "Frameset should be the new doc.body");
|
||||
}, "Setting document.body to a frameset will replace an existing body if there is one.");
|
||||
|
||||
test(function() {
|
||||
var doc = createDocument();
|
||||
var html = doc.appendChild(doc.createElement("html"));
|
||||
var b =
|
||||
html.appendChild(doc.createElement("body"));
|
||||
var f1 = html.appendChild(doc.createElement("frameset"));
|
||||
assert_equals(doc.body, b);
|
||||
|
||||
var f2 = doc.createElement("frameset");
|
||||
doc.body = f2;
|
||||
|
||||
assert_equals(b.parentNode, null,
|
||||
"Body should have been removed from the tree");
|
||||
assert_equals(f1.parentNode, html,
|
||||
"Frameset following body should still be in the tree.");
|
||||
assert_equals(doc.body, f2, "New frameset should be the new doc.body");
|
||||
assert_equals(f2.nextSibling, f1, "New frameset should have replaced the body");
|
||||
}, "Setting document.body to a frameset will replace the first existing body/frameset.");
|
||||
|
||||
</script>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue