Bug 698381 - Make Node.cloneNode aDeep argument optional, default to true. r=smaug

This commit is contained in:
Matthew Schranz 2012-02-23 14:23:30 +01:00
Родитель 2a964e5f93
Коммит e6f5aa8906
13 изменённых файлов: 90 добавлений и 16 удалений

Просмотреть файл

@ -480,10 +480,14 @@ nsDOMAttribute::Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDOMAttribute::CloneNode(bool aDeep, nsIDOMNode** aResult) nsDOMAttribute::CloneNode(bool aDeep, PRUint8 aOptionalArgc, nsIDOMNode** aResult)
{ {
OwnerDoc()->WarnOnceAbout(nsIDocument::eCloneNode); OwnerDoc()->WarnOnceAbout(nsIDocument::eCloneNode);
if (!aOptionalArgc) {
aDeep = true;
}
return nsNodeUtils::CloneNodeImpl(this, aDeep, true, aResult); return nsNodeUtils::CloneNodeImpl(this, aDeep, true, aResult);
} }

Просмотреть файл

@ -5830,8 +5830,12 @@ nsDocument::AppendChild(nsIDOMNode* aNewChild, nsIDOMNode** aReturn)
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDocument::CloneNode(bool aDeep, nsIDOMNode** aReturn) nsDocument::CloneNode(bool aDeep, PRUint8 aOptionalArgc, nsIDOMNode** aReturn)
{ {
if (!aOptionalArgc) {
aDeep = true;
}
return nsNodeUtils::CloneNodeImpl(this, aDeep, !mCreatingStaticClone, aReturn); return nsNodeUtils::CloneNodeImpl(this, aDeep, !mCreatingStaticClone, aReturn);
} }
@ -8062,7 +8066,7 @@ nsIDocument::CreateStaticClone(nsISupports* aCloneContainer)
nsCOMPtr<nsISupports> originalContainer = GetContainer(); nsCOMPtr<nsISupports> originalContainer = GetContainer();
SetContainer(aCloneContainer); SetContainer(aCloneContainer);
nsCOMPtr<nsIDOMNode> clonedNode; nsCOMPtr<nsIDOMNode> clonedNode;
nsresult rv = domDoc->CloneNode(true, getter_AddRefs(clonedNode)); nsresult rv = domDoc->CloneNode(true, 1, getter_AddRefs(clonedNode));
SetContainer(originalContainer); SetContainer(originalContainer);
nsCOMPtr<nsIDocument> clonedDoc; nsCOMPtr<nsIDocument> clonedDoc;

Просмотреть файл

@ -143,8 +143,12 @@ public:
nsresult IsSupported(const nsAString& aFeature, nsresult IsSupported(const nsAString& aFeature,
const nsAString& aVersion, const nsAString& aVersion,
bool* aReturn); bool* aReturn);
nsresult CloneNode(bool aDeep, nsIDOMNode** aReturn) nsresult CloneNode(bool aDeep, PRUint8 aOptionalArgc, nsIDOMNode** aReturn)
{ {
if (!aOptionalArgc) {
aDeep = true;
}
return nsNodeUtils::CloneNodeImpl(this, aDeep, true, aReturn); return nsNodeUtils::CloneNodeImpl(this, aDeep, true, aReturn);
} }

Просмотреть файл

@ -437,8 +437,12 @@ public:
// nsIDOMElement method implementation // nsIDOMElement method implementation
NS_DECL_NSIDOMELEMENT NS_DECL_NSIDOMELEMENT
nsresult CloneNode(bool aDeep, nsIDOMNode **aResult) nsresult CloneNode(bool aDeep, PRUint8 aOptionalArgc, nsIDOMNode **aResult)
{ {
if (!aOptionalArgc) {
aDeep = true;
}
return nsNodeUtils::CloneNodeImpl(this, aDeep, true, aResult); return nsNodeUtils::CloneNodeImpl(this, aDeep, true, aResult);
} }

Просмотреть файл

@ -1596,7 +1596,7 @@ nsresult nsRange::CutContents(nsIDOMDocumentFragment** aFragment)
cutValue); cutValue);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIDOMNode> clone; nsCOMPtr<nsIDOMNode> clone;
rv = charData->CloneNode(false, getter_AddRefs(clone)); rv = charData->CloneNode(false, 1, getter_AddRefs(clone));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
clone->SetNodeValue(cutValue); clone->SetNodeValue(cutValue);
nodeToResult = clone; nodeToResult = clone;
@ -1656,7 +1656,7 @@ nsresult nsRange::CutContents(nsIDOMDocumentFragment** aFragment)
{ {
if (retval) { if (retval) {
nsCOMPtr<nsIDOMNode> clone; nsCOMPtr<nsIDOMNode> clone;
rv = node->CloneNode(false, getter_AddRefs(clone)); rv = node->CloneNode(false, 1, getter_AddRefs(clone));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
nodeToResult = clone; nodeToResult = clone;
} }
@ -1827,7 +1827,7 @@ nsRange::CloneParentsBetween(nsIDOMNode *aAncestor,
{ {
nsCOMPtr<nsIDOMNode> clone, tmpNode; nsCOMPtr<nsIDOMNode> clone, tmpNode;
res = parent->CloneNode(false, getter_AddRefs(clone)); res = parent->CloneNode(false, 1, getter_AddRefs(clone));
if (NS_FAILED(res)) return res; if (NS_FAILED(res)) return res;
if (!clone) return NS_ERROR_FAILURE; if (!clone) return NS_ERROR_FAILURE;
@ -1928,7 +1928,7 @@ nsRange::CloneContents(nsIDOMDocumentFragment** aReturn)
// Clone the current subtree! // Clone the current subtree!
nsCOMPtr<nsIDOMNode> clone; nsCOMPtr<nsIDOMNode> clone;
res = node->CloneNode(deepClone, getter_AddRefs(clone)); res = node->CloneNode(deepClone, 1, getter_AddRefs(clone));
if (NS_FAILED(res)) return res; if (NS_FAILED(res)) return res;
// If it's CharacterData, make sure we only clone what // If it's CharacterData, make sure we only clone what

Просмотреть файл

@ -555,6 +555,7 @@ _TEST_FILES2 = \
file_bug717511_2.html \ file_bug717511_2.html \
file_bug717511_2.html^headers^ \ file_bug717511_2.html^headers^ \
test_bug726364.html \ test_bug726364.html \
test_bug698381.html \
$(NULL) $(NULL)
_CHROME_FILES = \ _CHROME_FILES = \

Просмотреть файл

@ -0,0 +1,56 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=698381
-->
<head>
<title>Test for Bug 698381</title>
<script type="text/javascript"
src="/tests/SimpleTest/SimpleTest.js"></script>
<script src="/tests/SimpleTest/EventUtils.js"
type="text/javascript"></script>
<link rel="stylesheet" type="text/css"
href="/tests/SimpleTest/test.css" />
</head>
<body onload="runTests();">
<a target="_blank"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=698381">
Mozilla Bug 698381</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<div id="noChildren" style="display: none"></div>
<div id="hasChildren" style="display: none">
<div id="childOne" style="display: none"></div>
</div>
<pre id="test">
<script type="text/javascript">
/*
Checks to see if default parameter handling is correct when 0
parameters are passed.
If none are passed, then Node.cloneNode should default aDeep
to true.
*/
SimpleTest.waitForExplicitFinish();
var hasChildren = document.getElementById("hasChildren"),
noChildren = document.getElementById("noChildren"),
clonedNode;
function runTests() {
// Test Node.cloneNode when no arguments are given
clonedNode = hasChildren.cloneNode();
is(clonedNode.hasChildNodes(), true, "Node.cloneNode with true " +
"default on a node with children clones the child nodes.");
clonedNode = noChildren.cloneNode();
is(clonedNode.hasChildNodes(), false, "Node.cloneNode with true " +
"default on a node without children doesn't clone child nodes." );
SimpleTest.finish();
}
</script>
</pre>
</body>
</html>

Просмотреть файл

@ -808,7 +808,7 @@ nsHTMLSelectElement::SetLength(PRUint32 aLength)
if (i + 1 < aLength) { if (i + 1 < aLength) {
nsCOMPtr<nsIDOMNode> newNode; nsCOMPtr<nsIDOMNode> newNode;
rv = node->CloneNode(true, getter_AddRefs(newNode)); rv = node->CloneNode(true, 1, getter_AddRefs(newNode));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
node = newNode; node = newNode;

Просмотреть файл

@ -153,7 +153,7 @@ NS_IMETHODIMP nsXPathNamespace::HasChildNodes(bool *aResult)
} }
/* nsIDOMNode cloneNode (in boolean deep); */ /* nsIDOMNode cloneNode (in boolean deep); */
NS_IMETHODIMP nsXPathNamespace::CloneNode(bool deep, nsIDOMNode **aResult) NS_IMETHODIMP nsXPathNamespace::CloneNode(bool deep, PRUint8 aOptionalArgc, nsIDOMNode **aResult)
{ {
return NS_ERROR_NOT_IMPLEMENTED; return NS_ERROR_NOT_IMPLEMENTED;
} }

Просмотреть файл

@ -677,7 +677,7 @@ nsXULContentBuilder::BuildContentFromTemplate(nsIContent *aTemplateNode,
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
nsCOMPtr<nsIDOMNode> clonedNode; nsCOMPtr<nsIDOMNode> clonedNode;
tmplTextNode->CloneNode(false, getter_AddRefs(clonedNode)); tmplTextNode->CloneNode(false, 1, getter_AddRefs(clonedNode));
nsCOMPtr<nsIContent> clonedContent = do_QueryInterface(clonedNode); nsCOMPtr<nsIContent> clonedContent = do_QueryInterface(clonedNode);
if (!clonedContent) { if (!clonedContent) {
NS_ERROR("failed to clone textnode"); NS_ERROR("failed to clone textnode");

Просмотреть файл

@ -52,7 +52,7 @@ interface nsIDOMUserDataHandler;
* http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html * http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html
*/ */
[scriptable, uuid(ce82fb71-60f2-4c38-be31-de5f2f90dada)] [scriptable, uuid(5e9bcec9-5928-4f77-8a9c-424ef01c20e1)]
interface nsIDOMNode : nsISupports interface nsIDOMNode : nsISupports
{ {
const unsigned short ELEMENT_NODE = 1; const unsigned short ELEMENT_NODE = 1;
@ -94,7 +94,8 @@ interface nsIDOMNode : nsISupports
nsIDOMNode appendChild(in nsIDOMNode newChild) nsIDOMNode appendChild(in nsIDOMNode newChild)
raises(DOMException); raises(DOMException);
boolean hasChildNodes(); boolean hasChildNodes();
nsIDOMNode cloneNode(in boolean deep); // Modified in DOM Level 4:
[optional_argc] nsIDOMNode cloneNode([optional] in boolean deep);
// Modified in DOM Level 2: // Modified in DOM Level 2:
void normalize(); void normalize();
// Introduced in DOM Level 2: // Introduced in DOM Level 2:

Просмотреть файл

@ -98,7 +98,7 @@ NS_IMETHODIMP SplitElementTxn::DoTransaction(void)
if (!mExistingRightNode || !mEditor) { return NS_ERROR_NOT_INITIALIZED; } if (!mExistingRightNode || !mEditor) { return NS_ERROR_NOT_INITIALIZED; }
// create a new node // create a new node
nsresult result = mExistingRightNode->CloneNode(false, getter_AddRefs(mNewLeftNode)); nsresult result = mExistingRightNode->CloneNode(false, 1, getter_AddRefs(mNewLeftNode));
NS_ASSERTION(((NS_SUCCEEDED(result)) && (mNewLeftNode)), "could not create element."); NS_ASSERTION(((NS_SUCCEEDED(result)) && (mNewLeftNode)), "could not create element.");
NS_ENSURE_SUCCESS(result, result); NS_ENSURE_SUCCESS(result, result);
NS_ENSURE_TRUE(mNewLeftNode, NS_ERROR_NULL_POINTER); NS_ENSURE_TRUE(mNewLeftNode, NS_ERROR_NULL_POINTER);

Просмотреть файл

@ -2970,7 +2970,7 @@ nsWebBrowserPersist::GetNodeToFixup(nsIDOMNode *aNodeIn, nsIDOMNode **aNodeOut)
{ {
if (!(mPersistFlags & PERSIST_FLAGS_FIXUP_ORIGINAL_DOM)) if (!(mPersistFlags & PERSIST_FLAGS_FIXUP_ORIGINAL_DOM))
{ {
nsresult rv = aNodeIn->CloneNode(false, aNodeOut); nsresult rv = aNodeIn->CloneNode(false, 1, aNodeOut);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
} }
else else