зеркало из https://github.com/mozilla/gecko-dev.git
Bug 384003 - XPathEvaluator does not accept a Node as NSResolver, r=sicking, sr=peterv
This commit is contained in:
Родитель
d7e32cbddc
Коммит
fd6786da5d
|
@ -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>
|
Загрузка…
Ссылка в новой задаче