Bug 384003 - XPathEvaluator does not accept a Node as NSResolver, r=sicking, sr=peterv

This commit is contained in:
Olli Pettay 2009-06-14 21:06:22 +03:00
Родитель d7e32cbddc
Коммит fd6786da5d
9 изменённых файлов: 105 добавлений и 6 удалений

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

@ -105,9 +105,9 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
// QueryInterface implementation for nsDOMAttribute
NS_INTERFACE_TABLE_HEAD(nsDOMAttribute)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_NODE_INTERFACE_TABLE7(nsDOMAttribute, nsIDOMAttr, nsIAttribute, nsINode,
NS_NODE_INTERFACE_TABLE8(nsDOMAttribute, nsIDOMAttr, nsIAttribute, nsINode,
nsIDOMNode, nsIDOM3Node, nsIDOM3Attr,
nsPIDOMEventTarget)
nsPIDOMEventTarget, nsIDOMXPathNSResolver)
NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(nsDOMAttribute)
NS_INTERFACE_MAP_ENTRY_TEAROFF(nsISupportsWeakReference,
new nsNodeSupportsWeakRefTearoff(this))

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

@ -54,6 +54,7 @@
#include "nsDOMAttributeMap.h"
#include "nsCycleCollectionParticipant.h"
#include "nsContentUtils.h"
#include "nsIDOMXPathNSResolver.h"
class nsDOMAttribute;
@ -61,7 +62,8 @@ class nsDOMAttribute;
// object that implements nsIDOMAttr, nsIDOM3Attr, nsIDOMNode, nsIDOM3Node
class nsDOMAttribute : public nsIAttribute,
public nsIDOMAttr,
public nsIDOM3Attr
public nsIDOM3Attr,
public nsIDOMXPathNSResolver
{
public:
nsDOMAttribute(nsDOMAttributeMap* aAttrMap, nsINodeInfo *aNodeInfo,

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

@ -1610,6 +1610,7 @@ NS_INTERFACE_TABLE_HEAD(nsDocument)
NS_INTERFACE_TABLE_ENTRY(nsDocument, nsIMutationObserver)
NS_INTERFACE_TABLE_ENTRY(nsDocument, nsIDOMNodeSelector)
NS_INTERFACE_TABLE_ENTRY(nsDocument, nsIApplicationCacheContainer)
NS_INTERFACE_TABLE_ENTRY(nsDocument, nsIDOMXPathNSResolver)
NS_OFFSET_AND_INTERFACE_TABLE_END
NS_OFFSET_AND_INTERFACE_TABLE_TO_MAP_SEGUE
NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(nsDocument)

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

@ -110,6 +110,7 @@
#include "nsContentUtils.h"
#include "nsThreadUtils.h"
#include "nsIDocumentViewer.h"
#include "nsIDOMXPathNSResolver.h"
#include "nsIInterfaceRequestor.h"
#include "nsILoadContext.h"
#include "nsIProgressEventSink.h"
@ -573,6 +574,7 @@ class nsDocument : public nsIDocument,
public nsIRadioGroupContainer,
public nsIDOMNodeSelector,
public nsIApplicationCacheContainer,
public nsIDOMXPathNSResolver,
public nsStubMutationObserver
{
public:

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

@ -120,6 +120,8 @@ NS_INTERFACE_MAP_BEGIN(nsGenericDOMDataNode)
NS_INTERFACE_MAP_ENTRY_TEAROFF(nsISupportsWeakReference,
new nsNodeSupportsWeakRefTearoff(this))
NS_INTERFACE_MAP_ENTRY_TEAROFF(nsIDOM3Node, new nsNode3Tearoff(this))
NS_INTERFACE_MAP_ENTRY_TEAROFF(nsIDOMXPathNSResolver,
new nsNode3Tearoff(this))
// nsNodeSH::PreCreate() depends on the identity pointer being the
// same as nsINode (which nsIContent inherits), so if you change the
// below line, make sure nsNodeSH::PreCreate() still does the right

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

@ -636,6 +636,7 @@ NS_IMPL_CYCLE_COLLECTION_1(nsNode3Tearoff, mContent)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsNode3Tearoff)
NS_INTERFACE_MAP_ENTRY(nsIDOM3Node)
NS_INTERFACE_MAP_ENTRY(nsIDOMXPathNSResolver)
NS_INTERFACE_MAP_END_AGGREGATED(mContent)
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsNode3Tearoff)
@ -856,7 +857,8 @@ nsNode3Tearoff::GetFeature(const nsAString& aFeature,
const nsAString& aVersion,
nsISupports** aReturn)
{
return nsGenericElement::InternalGetFeature(this, aFeature, aVersion, aReturn);
return nsGenericElement::InternalGetFeature(static_cast<nsIDOM3Node*>(this),
aFeature, aVersion, aReturn);
}
NS_IMETHODIMP
@ -4078,6 +4080,8 @@ NS_INTERFACE_MAP_BEGIN(nsGenericElement)
new nsNodeSupportsWeakRefTearoff(this))
NS_INTERFACE_MAP_ENTRY_TEAROFF(nsIDOMNodeSelector,
new nsNodeSelectorTearoff(this))
NS_INTERFACE_MAP_ENTRY_TEAROFF(nsIDOMXPathNSResolver,
new nsNode3Tearoff(this))
// nsNodeSH::PreCreate() depends on the identity pointer being the
// same as nsINode (which nsIContent inherits), so if you change the
// below line, make sure nsNodeSH::PreCreate() still does the right

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

@ -64,6 +64,7 @@
#include "nsCycleCollectionParticipant.h"
#include "nsIDocument.h"
#include "nsIDOMNodeSelector.h"
#include "nsIDOMXPathNSResolver.h"
#ifdef MOZ_SMIL
#include "nsISMILAttr.h"
@ -144,14 +145,14 @@ private:
/**
* A tearoff class for nsGenericElement to implement additional interfaces
*/
class nsNode3Tearoff : public nsIDOM3Node
class nsNode3Tearoff : public nsIDOM3Node, public nsIDOMXPathNSResolver
{
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_NSIDOM3NODE
NS_DECL_CYCLE_COLLECTION_CLASS(nsNode3Tearoff)
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsNode3Tearoff, nsIDOM3Node)
nsNode3Tearoff(nsIContent *aContent) : mContent(aContent)
{

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

@ -129,6 +129,7 @@ _TEST_FILES = test_bug5141.html \
test_bug382113.html \
test_bug382871.html \
test_bug383430.html \
test_bug384003.xhtml \
test_bug390219.html \
test_bug390735.html \
test_bug392318.html \

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

@ -0,0 +1,86 @@
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml" attr="value">
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=384003
-->
<head>
<title>Test for Bug 384003</title>
<script type="application/javascript" src="/MochiKit/packed.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=384003">Mozilla Bug 384003</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test" xmlns:foo="http://www.foo.org"><foo:foo/>
<script type="application/javascript">
<![CDATA[
/** Test for Bug 384003 **/
function resolverTest(expr, resolver, result, extype) {
if (!extype) {
extype = 0;
}
try {
is(document.evaluate(expr, document, resolver,
XPathResult.FIRST_ORDERED_NODE_TYPE, null).
singleNodeValue,
result,
"Wrong XPathResult");
if (extype) {
ok(false, "Should have got an exception!");
}
} catch(ex) {
is(ex.code, extype, "Wrong exception");
}
}
// Expression should return document element.
// Document resolver
resolverTest("*", document, document.documentElement);
// Element resolver
resolverTest("*", document.documentElement, document.documentElement);
// Attribute resolver
resolverTest("*", document.documentElement.getAttributeNode("attr"),
document.documentElement);
// Text node resolver
resolverTest("*", document.documentElement.firstChild,
document.documentElement);
// Comment node resolver
resolverTest("*", document.documentElement.firstChild.nextSibling,
document.documentElement);
// Expression should return foo element, but because of the
// resolver it may throw an exception.
var NAMESPACE_ERR = 14;
var foo = document.getElementById("test").firstChild;
// Document resolver
resolverTest("//foo:foo", document, foo, NAMESPACE_ERR);
// Element resolver
resolverTest("//foo:foo", document.documentElement, foo, NAMESPACE_ERR);
// Attribute resolver
resolverTest("//foo:foo", document.documentElement.getAttributeNode("attr"),
foo, NAMESPACE_ERR);
// Text node resolver
resolverTest("//foo:foo", document.documentElement.firstChild,
foo, NAMESPACE_ERR);
// Comment node resolver
resolverTest("//foo:foo", document.documentElement.firstChild.nextSibling,
foo, NAMESPACE_ERR);
// Function resolver
resolverTest("//foo:foo",
function(p) { return (p == "foo") ? "http://www.foo.org" : ""; },
foo);
// Element resolver, which has definition for foo namespace
resolverTest("//foo:foo", foo.parentNode, foo);
]]>
</script>
</pre>
</body>
</html>