diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in
index 44cc36a6ea4..4b6fb7226bb 100644
--- a/dlls/mshtml/Makefile.in
+++ b/dlls/mshtml/Makefile.in
@@ -12,6 +12,7 @@ C_SRCS = \
hlink.c \
htmldoc.c \
htmldoc3.c \
+ htmlnode.c \
main.c \
navigate.c \
nsembed.c \
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 50e5b997d55..3aae8133125 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -142,6 +142,7 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
IOleDocumentView_SetInPlaceSite(DOCVIEW(This), NULL);
if(This->hwnd)
DestroyWindow(This->hwnd);
+ release_nodes(This);
if(This->nscontainer)
NSContainer_Release(This->nscontainer);
@@ -982,6 +983,7 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
ret->lpHTMLDocument2Vtbl = &HTMLDocumentVtbl;
ret->ref = 0;
ret->nscontainer = NULL;
+ ret->nodes = NULL;
hres = IHTMLDocument_QueryInterface(HTMLDOC(ret), riid, ppvObject);
if(FAILED(hres)) {
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
new file mode 100644
index 00000000000..55b6ad3cc0c
--- /dev/null
+++ b/dlls/mshtml/htmlnode.c
@@ -0,0 +1,364 @@
+/*
+ * Copyright 2006 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "config.h"
+
+#include
+#include
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winnls.h"
+#include "ole2.h"
+
+#include "wine/debug.h"
+
+#include "mshtml_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
+
+#define NSSUPPORTS(x) ((nsISupports*) &(x)->lpSupportsVtbl)
+
+#define HTMLDOMNODE_THIS(iface) DEFINE_THIS(HTMLDOMNode, HTMLDOMNode, iface)
+
+static HRESULT WINAPI HTMLDOMNode_QueryInterface(IHTMLDOMNode *iface,
+ REFIID riid, void **ppv)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+
+ if(This->impl.unk)
+ return IUnknown_QueryInterface(This->impl.unk, riid, ppv);
+
+ *ppv = NULL;
+
+ if(IsEqualGUID(&IID_IUnknown, riid)) {
+ TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
+ *ppv = HTMLDOMNODE(This);
+ }else if(IsEqualGUID(&IID_IDispatch, riid)) {
+ TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
+ *ppv = HTMLDOMNODE(This);
+ }else if(IsEqualGUID(&IID_IHTMLDOMNode, riid)) {
+ TRACE("(%p)->(IID_IHTMLDOMNode %p)\n", This, ppv);
+ *ppv = HTMLDOMNODE(This);
+ }
+
+ if(*ppv) {
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+ }
+
+ WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI HTMLDOMNode_AddRef(IHTMLDOMNode *iface)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+
+ if(This->impl.unk)
+ return IUnknown_AddRef(This->impl.unk);
+
+ TRACE("(%p)\n", This);
+ return IHTMLDocument2_AddRef(HTMLDOC(This->doc));
+}
+
+static ULONG WINAPI HTMLDOMNode_Release(IHTMLDOMNode *iface)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+
+ if(This->impl.unk)
+ return IUnknown_Release(This->impl.unk);
+
+ TRACE("(%p)\n", This);
+ return IHTMLDocument2_Release(HTMLDOC(This->doc));
+}
+
+static HRESULT WINAPI HTMLDOMNode_GetTypeInfoCount(IHTMLDOMNode *iface, UINT *pctinfo)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_GetTypeInfo(IHTMLDOMNode *iface, UINT iTInfo,
+ LCID lcid, ITypeInfo **ppTInfo)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%u %lu %p)\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_GetIDsOfNames(IHTMLDOMNode *iface, REFIID riid,
+ LPOLESTR *rgszNames, UINT cNames,
+ LCID lcid, DISPID *rgDispId)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%s %p %u %lu %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
+ lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_Invoke(IHTMLDOMNode *iface, DISPID dispIdMember,
+ REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
+ VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%ld %s %ld %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_get_nodeType(IHTMLDOMNode *iface, long *p)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_get_parentNode(IHTMLDOMNode *iface, IHTMLDOMNode **p)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_hasChildNodes(IHTMLDOMNode *iface, VARIANT_BOOL *fChildren)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, fChildren);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_get_childNodes(IHTMLDOMNode *iface, IDispatch **p)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_get_attributes(IHTMLDOMNode *iface, IDispatch **p)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_insertBefore(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
+ VARIANT refChild, IHTMLDOMNode **node)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p v %p)\n", This, newChild, node);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_removeChild(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
+ IHTMLDOMNode **node)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, newChild, node);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_replaceChild(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
+ IHTMLDOMNode *oldChild, IHTMLDOMNode **node)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p %p %p)\n", This, newChild, oldChild, node);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_cloneNode(IHTMLDOMNode *iface, VARIANT_BOOL fDeep,
+ IHTMLDOMNode **clonedNode)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%x %p)\n", This, fDeep, clonedNode);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_removeNode(IHTMLDOMNode *iface, VARIANT_BOOL fDeep,
+ IHTMLDOMNode **removed)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%x %p)\n", This, fDeep, removed);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_swapNode(IHTMLDOMNode *iface, IHTMLDOMNode *otherNode,
+ IHTMLDOMNode **swappedNode)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, otherNode, swappedNode);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_replaceNode(IHTMLDOMNode *iface, IHTMLDOMNode *replacement,
+ IHTMLDOMNode **replaced)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, replacement, replaced);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_appendChild(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
+ IHTMLDOMNode **node)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, newChild, node);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_get_nodeName(IHTMLDOMNode *iface, BSTR *p)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_put_nodeValue(IHTMLDOMNode *iface, VARIANT v)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_get_nodeValue(IHTMLDOMNode *iface, VARIANT *p)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_get_firstChild(IHTMLDOMNode *iface, IHTMLDOMNode **p)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_get_lastChild(IHTMLDOMNode *iface, IHTMLDOMNode **p)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_get_previousSibling(IHTMLDOMNode *iface, IHTMLDOMNode **p)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMNode_get_nextSibling(IHTMLDOMNode *iface, IHTMLDOMNode **p)
+{
+ HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static const IHTMLDOMNodeVtbl HTMLDOMNodeVtbl = {
+ HTMLDOMNode_QueryInterface,
+ HTMLDOMNode_AddRef,
+ HTMLDOMNode_Release,
+ HTMLDOMNode_GetTypeInfoCount,
+ HTMLDOMNode_GetTypeInfo,
+ HTMLDOMNode_GetIDsOfNames,
+ HTMLDOMNode_Invoke,
+ HTMLDOMNode_get_nodeType,
+ HTMLDOMNode_get_parentNode,
+ HTMLDOMNode_hasChildNodes,
+ HTMLDOMNode_get_childNodes,
+ HTMLDOMNode_get_attributes,
+ HTMLDOMNode_insertBefore,
+ HTMLDOMNode_removeChild,
+ HTMLDOMNode_replaceChild,
+ HTMLDOMNode_cloneNode,
+ HTMLDOMNode_removeNode,
+ HTMLDOMNode_swapNode,
+ HTMLDOMNode_replaceNode,
+ HTMLDOMNode_appendChild,
+ HTMLDOMNode_get_nodeName,
+ HTMLDOMNode_put_nodeValue,
+ HTMLDOMNode_get_nodeValue,
+ HTMLDOMNode_get_firstChild,
+ HTMLDOMNode_get_lastChild,
+ HTMLDOMNode_get_previousSibling,
+ HTMLDOMNode_get_nextSibling
+};
+
+/*
+ * FIXME
+ * List looks really ugly here. We should use a better data structure or
+ * (better) find a way to store HTMLDOMelement poiner in nsIDOMNode.
+ */
+
+HTMLDOMNode *get_node(HTMLDocument *This, nsIDOMNode *nsnode)
+{
+ HTMLDOMNode *iter = This->nodes, *ret;
+ PRUint16 node_type;
+
+ while(iter) {
+ if(iter->nsnode == nsnode)
+ break;
+ iter = iter->next;
+ }
+
+ if(iter)
+ return iter;
+
+ ret = HeapAlloc(GetProcessHeap(), 0, sizeof(HTMLDOMNode));
+ ret->lpHTMLDOMNodeVtbl = &HTMLDOMNodeVtbl;
+ ret->node_type = NT_UNKNOWN;
+ ret->impl.unk = NULL;
+ ret->doc = This;
+
+ nsIDOMNode_AddRef(nsnode);
+ ret->nsnode = nsnode;
+
+ ret->next = This->nodes;
+ This->nodes = ret;
+
+ nsIDOMNode_GetNodeType(nsnode, &node_type);
+
+#if 0
+ if(node_type == NS_ELEMENT_NODE
+ || node_type == NS_DOCUMENT_NODE)
+ HTMLElement_Create(ret);
+#endif
+
+ return ret;
+}
+
+void release_nodes(HTMLDocument *This)
+{
+ HTMLDOMNode *iter, *next;
+
+ if(!This->nodes)
+ return;
+
+ for(iter = This->nodes; iter; iter = next) {
+ next = iter->next;
+ if(iter->destructor)
+ iter->destructor(iter->impl.unk);
+ nsIDOMNode_Release(iter->nsnode);
+ HeapFree(GetProcessHeap(), 0, iter);
+ }
+}
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index ab89c9be70e..320f57582ea 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2005 Jacek Caban
+ * Copyright 2005-2006 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -40,7 +40,11 @@
#define NSAPI WINAPI
+#define NS_ELEMENT_NODE 1
+#define NS_DOCUMENT_NODE 9
+
typedef struct BindStatusCallback BindStatusCallback;
+typedef struct HTMLDOMNode HTMLDOMNode;
typedef struct {
const IHTMLDocument2Vtbl *lpHTMLDocument2Vtbl;
@@ -77,6 +81,8 @@ typedef struct {
BOOL container_locked;
BindStatusCallback *status_callback;
+
+ HTMLDOMNode *nodes;
} HTMLDocument;
struct NSContainer {
@@ -102,6 +108,27 @@ struct NSContainer {
BOOL load_call; /* hack */
};
+struct HTMLDOMNode {
+ const IHTMLDOMNodeVtbl *lpHTMLDOMNodeVtbl;
+
+ void (*destructor)(IUnknown*);
+
+ enum {
+ NT_UNKNOWN,
+ NT_HTMLELEM
+ } node_type;
+
+ union {
+ IUnknown *unk;
+ IHTMLElement *elem;
+ } impl;
+
+ nsIDOMNode *nsnode;
+ HTMLDocument *doc;
+
+ HTMLDOMNode *next;
+};
+
#define HTMLDOC(x) ((IHTMLDocument2*) &(x)->lpHTMLDocument2Vtbl)
#define HTMLDOC3(x) ((IHTMLDocument3*) &(x)->lpHTMLDocument3Vtbl)
#define PERSIST(x) ((IPersist*) &(x)->lpPersistFileVtbl)
@@ -129,6 +156,8 @@ struct NSContainer {
#define NSEMBWNDS(x) ((nsIEmbeddingSiteWindow*) &(x)->lpEmbeddingSiteWindowVtbl)
#define NSIFACEREQ(x) ((nsIInterfaceRequestor*) &(x)->lpInterfaceRequestorVtbl)
+#define HTMLDOMNODE(x) ((IHTMLDOMNode*) &(x)->lpHTMLDOMNodeVtbl)
+
#define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl)))
HRESULT HTMLDocument_Create(IUnknown*,REFIID,void**);
@@ -166,6 +195,9 @@ nsIInputStream *create_nsstream(const char*,PRInt32);
IHlink *Hlink_Create(void);
+HTMLDOMNode *get_node(HTMLDocument*,nsIDOMNode*);
+void release_nodes(HTMLDocument*);
+
DEFINE_GUID(CLSID_AboutProtocol, 0x3050F406, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
DEFINE_GUID(CLSID_JSProtocol, 0x3050F3B2, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
DEFINE_GUID(CLSID_MailtoProtocol, 0x3050F3DA, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl
index 83db2f4ee50..62592f3cbaf 100644
--- a/dlls/mshtml/nsiface.idl
+++ b/dlls/mshtml/nsiface.idl
@@ -54,6 +54,7 @@ typedef nsStringContainer nsAString;
interface nsIWebBrowserChrome;
interface nsILoadGroup;
+interface nsIDOMNode;
[
object,
@@ -74,7 +75,6 @@ typedef nsISupports nsISimpleEnumerator;
typedef nsISupports nsIWidget;
typedef nsISupports nsIProtocolHandler;
typedef nsISupports nsIDOMElement;
-typedef nsISupports nsIDOMNode;
typedef nsISupports nsIDOMEventTarget;
typedef nsISupports nsIDOMAbstractView;
typedef nsISupports nsIStreamListener;
@@ -85,6 +85,7 @@ typedef nsISupports nsIDOMWindowCollection;
typedef nsISupports nsISelection;
typedef nsISupports nsIPrompt;
typedef nsISupports nsIAuthPrompt;
+typedef nsISupports nsIDOMNamedNodeMap;
[
object,
@@ -299,6 +300,49 @@ interface nsIUploadChannel : nsISupports
nsresult GetUploadStream(nsIInputStream **aUploadStream);
}
+[
+ object,
+ uuid(a6cf907d-15b3-11d2-932e-00805f8add32)
+]
+interface nsIDOMNodeList : nsISupports
+{
+ nsresult Item(PRUint32 index, nsIDOMNode **_retval);
+ nsresult GetLength(PRUint32 *aLength);
+}
+
+[
+ object,
+ uuid(a6cf907c-15b3-11d2-932e-00805f8add32)
+]
+interface nsIDOMNode : nsISupports
+{
+ nsresult GetNodeName(nsAString *aNodeName);
+ nsresult GetNodeValue(nsAString *aNodeValue);
+ nsresult SetNodeValue(const nsAString *aNodeValue);
+ nsresult GetNodeType(PRUint16 *aNodeType);
+ nsresult GetParentNode(nsIDOMNode **aParentNode);
+ nsresult GetChildNodes(nsIDOMNodeList **aChildNodes);
+ nsresult GetFirstChild(nsIDOMNode **aFirstChild);
+ nsresult GetLastChild(nsIDOMNode **aLastChild);
+ nsresult GetPreviousSibling(nsIDOMNode **aPreviousSibling);
+ nsresult GetNextSibling(nsIDOMNode **aNextSibling);
+ nsresult GetAttributes(nsIDOMNamedNodeMap **aAttributes);
+ nsresult GetOwnerDocument(nsIDOMDocument **aOwnerDocument);
+ nsresult InsertBefore(nsIDOMNode *newChild, nsIDOMNode *refChild, nsIDOMNode **_retval);
+ nsresult ReplaceChild(nsIDOMNode *newChild, nsIDOMNode *oldChild, nsIDOMNode **_retval);
+ nsresult RemoveChild(nsIDOMNode *oldChild, nsIDOMNode **_retval);
+ nsresult AppendChild(nsIDOMNode *newChild, nsIDOMNode **_retval);
+ nsresult HasChildNodes(PRBool *_retval);
+ nsresult CloneNode(PRBool deep, nsIDOMNode **_retval);
+ nsresult Normalize();
+ nsresult IsSupported(const nsAString *feature, const nsAString *version, PRBool *_retval);
+ nsresult GetNamespaceURI(nsAString *aNamespaceURI);
+ nsresult GetPrefix(nsAString *aPrefix);
+ nsresult SetPrefix(const nsAString *aPrefix);
+ nsresult GetLocalName(nsAString *aLocalName);
+ nsresult HasAttributes(PRBool *_retval);
+}
+
[
object,
uuid(a6cf906b-15b3-11d2-932e-00805f8add32)