From e085a5b30ef3dac6ee725be2ccfc8862758a6cb6 Mon Sep 17 00:00:00 2001 From: Cameron Kaiser Date: Mon, 14 Aug 2017 18:13:41 -0700 Subject: [PATCH] #399: fix 'null' Blobs, add isSameNode(), fix select element non-match bug --- dom/base/nsContentUtils.cpp | 20 ++++++++++++++++++++ dom/base/nsINode.cpp | 6 ++++++ dom/base/nsINode.h | 1 + dom/html/HTMLSelectElement.cpp | 4 +++- dom/webidl/Node.webidl | 2 ++ 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index 99ae6209c..6a7688720 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -5973,6 +5973,26 @@ nsContentUtils::GetUTFOrigin(nsIURI* aURI, nsAString& aOrigin) NS_ENSURE_SUCCESS(rv, rv); if (uri && uri != aURI) { + return GetUTFOrigin(uri, aOrigin); + } + } else { + // We are probably dealing with an unknown blob. + bool isBlob = false; + nsresult rv = aURI->SchemeIs(BLOBURI_SCHEME, &isBlob); + NS_ENSURE_SUCCESS(rv, rv); + + if (isBlob) { + nsAutoCString path; + rv = aURI->GetPath(path); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr uri; + nsresult rv = NS_NewURI(getter_AddRefs(uri), path); + if (NS_FAILED(rv)) { + aOrigin.AssignLiteral("null"); + return NS_OK; + } + return GetUTFOrigin(uri, aOrigin); } } diff --git a/dom/base/nsINode.cpp b/dom/base/nsINode.cpp index eeebbff4f..205bd1450 100644 --- a/dom/base/nsINode.cpp +++ b/dom/base/nsINode.cpp @@ -968,6 +968,12 @@ nsINode::CompareDocumentPosition(nsINode& aOtherNode) const nsIDOMNode::DOCUMENT_POSITION_CONTAINED_BY); } +bool +nsINode::IsSameNode(nsINode *other) +{ + return other == this; +} + bool nsINode::IsEqualNode(nsINode* aOther) { diff --git a/dom/base/nsINode.h b/dom/base/nsINode.h index 9b4a28c6f..9b1b5de2b 100644 --- a/dom/base/nsINode.h +++ b/dom/base/nsINode.h @@ -1761,6 +1761,7 @@ public: } nsINode* RemoveChild(nsINode& aChild, mozilla::ErrorResult& aError); already_AddRefed CloneNode(bool aDeep, mozilla::ErrorResult& aError); + bool IsSameNode(nsINode* aNode); bool IsEqualNode(nsINode* aNode); void GetNamespaceURI(nsAString& aNamespaceURI) const { diff --git a/dom/html/HTMLSelectElement.cpp b/dom/html/HTMLSelectElement.cpp index 7243af841..824084fd3 100644 --- a/dom/html/HTMLSelectElement.cpp +++ b/dom/html/HTMLSelectElement.cpp @@ -1149,9 +1149,11 @@ HTMLSelectElement::SetValue(const nsAString& aValue) option->GetValue(optionVal); if (optionVal.Equals(aValue)) { SetSelectedIndexInternal(int32_t(i), true); - break; + return NS_OK; } } + // No matching option was found. + SetSelectedIndexInternal(-1, true); return NS_OK; } diff --git a/dom/webidl/Node.webidl b/dom/webidl/Node.webidl index d85f2a6a5..5400fff21 100644 --- a/dom/webidl/Node.webidl +++ b/dom/webidl/Node.webidl @@ -70,6 +70,8 @@ interface Node : EventTarget { [Throws] Node cloneNode(optional boolean deep = false); [Pure] + boolean isSameNode(Node? node); + [Pure] boolean isEqualNode(Node? node); const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;