Added (very) basic IE DOM support

git-svn-id: svn://10.0.0.236/trunk@24626 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
locka%iol.ie
1999-03-21 19:53:29 +00:00
parent 0b7e535830
commit af0e6693fe
10 changed files with 240 additions and 34 deletions

View File

@@ -19,6 +19,8 @@
#include "IEHtmlDocument.h"
#include "IEHtmlElementCollection.h"
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
CIEHtmlDocument::CIEHtmlDocument()
{
}
@@ -39,6 +41,18 @@ HRESULT STDMETHODCALLTYPE CIEHtmlDocument::get_Script(IDispatch __RPC_FAR *__RPC
// IHTMLDocument2 methods
HRESULT STDMETHODCALLTYPE CIEHtmlDocument::get_all(IHTMLElementCollection __RPC_FAR *__RPC_FAR *p)
{
// Get the associated document
nsIDOMNode *pIDOMNode = nsnull;
if (m_pIDOMNode != nsnull)
{
m_pIDOMNode->QueryInterface(kIDOMNodeIID, (void **) &pIDOMNode);
}
if (pIDOMNode == nsnull)
{
return E_UNEXPECTED;
}
// Validate parameters
if (p == NULL)
{
return E_INVALIDARG;
@@ -47,15 +61,15 @@ HRESULT STDMETHODCALLTYPE CIEHtmlDocument::get_all(IHTMLElementCollection __RPC_
*p = NULL;
CIEHtmlElementCollectionInstance *pCollection = NULL;
CIEHtmlElementCollectionInstance::CreateInstance(&pCollection);
if (pCollection == NULL)
CIEHtmlElementCollection::CreateFromParentNode(pIDOMNode, (CIEHtmlElementCollection **) &pCollection);
if (pCollection)
{
return E_OUTOFMEMORY;
pCollection->AddRef();
*p = pCollection;
}
// TODO get everything from NG and make some elements!
pIDOMNode->Release();
pCollection->QueryInterface(IID_IHTMLElementCollection, (void **) p);
return S_OK;
}

View File

@@ -18,7 +18,9 @@
#ifndef IEHTMLDOCUMENT_H
#define IEHTMLDOCUMENT_H
class CIEHtmlDocument : public CComObjectRootEx<CComSingleThreadModel>,
#include "IEHtmlNode.h"
class CIEHtmlDocument : public CIEHtmlNode,
public IDispatchImpl<IHTMLDocument2, &IID_IHTMLDocument2, &LIBID_MSHTML>
{
public:

View File

@@ -19,7 +19,9 @@
#include "stdafx.h"
#include "IEHtmlElement.h"
#include "IEHtmlElementCollection.h"
static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID);
CIEHtmlElement::CIEHtmlElement()
{
@@ -30,7 +32,6 @@ CIEHtmlElement::~CIEHtmlElement()
{
}
///////////////////////////////////////////////////////////////////////////////
// IHTMLElement implementation
@@ -56,7 +57,13 @@ HRESULT STDMETHODCALLTYPE CIEHtmlElement::put_className(BSTR v)
HRESULT STDMETHODCALLTYPE CIEHtmlElement::get_className(BSTR __RPC_FAR *p)
{
return E_NOTIMPL;
if (p == NULL)
{
return E_INVALIDARG;
}
// TODO
*p = SysAllocString(OLESTR(""));
return S_OK;
}
HRESULT STDMETHODCALLTYPE CIEHtmlElement::put_id(BSTR v)
@@ -66,12 +73,28 @@ HRESULT STDMETHODCALLTYPE CIEHtmlElement::put_id(BSTR v)
HRESULT STDMETHODCALLTYPE CIEHtmlElement::get_id(BSTR __RPC_FAR *p)
{
return E_NOTIMPL;
if (p == NULL)
{
return E_INVALIDARG;
}
// TODO
*p = SysAllocString(OLESTR(""));
return S_OK;
}
HRESULT STDMETHODCALLTYPE CIEHtmlElement::get_tagName(BSTR __RPC_FAR *p)
{
return E_NOTIMPL;
if (p == NULL)
{
return E_INVALIDARG;
}
nsString sNodeName;
m_pIDOMNode->GetNodeName(sNodeName);
USES_CONVERSION;
*p = SysAllocString(W2COLE((const PRUnichar *) sNodeName));
return S_OK;
}
HRESULT STDMETHODCALLTYPE CIEHtmlElement::get_parentElement(IHTMLElement __RPC_FAR *__RPC_FAR *p)
@@ -466,6 +489,35 @@ HRESULT STDMETHODCALLTYPE CIEHtmlElement::get_children(IDispatch __RPC_FAR *__RP
HRESULT STDMETHODCALLTYPE CIEHtmlElement::get_all(IDispatch __RPC_FAR *__RPC_FAR *p)
{
return E_NOTIMPL;
// Get the associated document
nsIDOMNode *pIDOMNode = nsnull;
if (m_pIDOMNode != nsnull)
{
m_pIDOMNode->QueryInterface(kIDOMNodeIID, (void **) &pIDOMNode);
}
if (pIDOMNode == nsnull)
{
return E_UNEXPECTED;
}
// Validate parameters
if (p == NULL)
{
return E_INVALIDARG;
}
*p = NULL;
CIEHtmlElementCollectionInstance *pCollection = NULL;
CIEHtmlElementCollection::CreateFromParentNode(pIDOMNode, (CIEHtmlElementCollection **) &pCollection);
if (pCollection)
{
pCollection->AddRef();
*p = pCollection;
}
pIDOMNode->Release();
return S_OK;
}

View File

@@ -18,13 +18,23 @@
#ifndef IEHTMLELEMENT_H
#define IEHTMLELEMENT_H
class CIEHtmlElement : public CComObjectRootEx<CComSingleThreadModel>,
#include "IEHtmlNode.h"
class CIEHtmlElement : public CIEHtmlNode,
public IDispatchImpl<IHTMLElement, &IID_IHTMLElement, &LIBID_MSHTML>
{
public:
CIEHtmlElement();
protected:
virtual ~CIEHtmlElement();
public:
BEGIN_COM_MAP(CIEHtmlElement)
COM_INTERFACE_ENTRY_IID(IID_IDispatch, IHTMLElement)
COM_INTERFACE_ENTRY_IID(IID_IHTMLElement, IHTMLElement)
END_COM_MAP()
// Implementation of IHTMLElement
virtual HRESULT STDMETHODCALLTYPE setAttribute(BSTR strAttributeName, VARIANT AttributeValue, LONG lFlags);
virtual HRESULT STDMETHODCALLTYPE getAttribute(BSTR strAttributeName, LONG lFlags, VARIANT __RPC_FAR *AttributeValue);
@@ -119,7 +129,6 @@ public:
COM_INTERFACE_ENTRY_IID(IID_IDispatch, IHTMLElement) \
COM_INTERFACE_ENTRY_IID(IID_IHTMLElement, IHTMLElement)
typedef CComObject<CIEHtmlElement> CIEHtmlElementInstance;
#endif

View File

@@ -16,6 +16,7 @@
* Reserved.
*/
#include "stdafx.h"
#include "IEHtmlElement.h"
#include "IEHtmlElementCollection.h"
CIEHtmlElementCollection::CIEHtmlElementCollection()
@@ -26,6 +27,75 @@ CIEHtmlElementCollection::~CIEHtmlElementCollection()
{
}
HRESULT CIEHtmlElementCollection::CreateFromParentNode(nsIDOMNode *pParentNode, CIEHtmlElementCollection **pInstance)
{
if (pInstance == NULL)
{
return E_INVALIDARG;
}
if (pParentNode == nsnull)
{
return E_INVALIDARG;
}
*pInstance = NULL;
CIEHtmlElementCollectionInstance *pCollection = NULL;
CIEHtmlElementCollectionInstance::CreateInstance(&pCollection);
// Get elements
nsIDOMNodeList *pIDOMNodeList = nsnull;
pParentNode->GetChildNodes(&pIDOMNodeList);
if (pIDOMNodeList)
{
PRUint32 aLength = 0;
pIDOMNodeList->GetLength(&aLength);
for (PRUint32 i = 0; i < aLength; i++)
{
nsIDOMNode *pChildNode = nsnull;
pIDOMNodeList->Item(i, &pChildNode);
// Create an equivalent IE element
CIEHtmlElementInstance *pElement = NULL;
CIEHtmlElementInstance::CreateInstance(&pElement);
if (pElement)
{
pElement->SetDOMNode(pChildNode);
pCollection->AddNode(pElement);
}
if (pChildNode)
{
pChildNode->Release();
}
}
pIDOMNodeList->Release();
}
*pInstance = pCollection;
return S_OK;
}
HRESULT CIEHtmlElementCollection::AddNode(IDispatch *pNode)
{
if (pNode == NULL)
{
return E_INVALIDARG;
}
m_cNodeList.push_back(pNode);
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// IHTMLElementCollection methods
HRESULT STDMETHODCALLTYPE CIEHtmlElementCollection::toString(BSTR __RPC_FAR *String)
{
if (String == NULL)
@@ -36,31 +106,57 @@ HRESULT STDMETHODCALLTYPE CIEHtmlElementCollection::toString(BSTR __RPC_FAR *Str
return S_OK;
}
HRESULT STDMETHODCALLTYPE CIEHtmlElementCollection::put_length(long v)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE CIEHtmlElementCollection::get_length(long __RPC_FAR *p)
{
if (p == NULL)
{
return E_INVALIDARG;
}
*p = m_cElementList.size();
*p = m_cNodeList.size();
return S_OK;
}
HRESULT STDMETHODCALLTYPE CIEHtmlElementCollection::get__newEnum(IUnknown __RPC_FAR *__RPC_FAR *p)
{
*p = NULL;
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE CIEHtmlElementCollection::item(VARIANT name, VARIANT index, IDispatch __RPC_FAR *__RPC_FAR *pdisp)
{
CComVariant vIndex;
if (FAILED(vIndex.ChangeType(VT_I4, &index)))
{
return E_INVALIDARG;
}
int nIndex = vIndex.lVal;
if (nIndex < 0 || nIndex >= m_cNodeList.size())
{
return E_INVALIDARG;
}
*pdisp = NULL;
return E_NOTIMPL;
IDispatch *pNode = m_cNodeList[nIndex];
if (pNode == NULL)
{
NG_ASSERT(0);
return E_UNEXPECTED;
}
pNode->QueryInterface(IID_IDispatch, (void **) pdisp);
return S_OK;
}
HRESULT STDMETHODCALLTYPE CIEHtmlElementCollection::tags(VARIANT tagName, IDispatch __RPC_FAR *__RPC_FAR *pdisp)

View File

@@ -15,27 +15,33 @@
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#ifndef IEHTMLELEMENTCOLLECTION_H
#define IEHTMLELEMENTCOLLECTION_H
#ifndef IEHTMLNODECOLLECTION_H
#define IEHTMLNODECOLLECTION_H
#include "IEHtmlElement.h"
#include "IEHtmlNode.h"
class CIEHtmlElementCollection : public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<IHTMLElementCollection, &IID_IHTMLElementCollection, &LIBID_MSHTML>
public IDispatchImpl<IHTMLElementCollection, &IID_IHTMLElementCollection, &LIBID_MSHTML>
{
std::list< CIEHtmlElement * > m_cElementList;
std::vector< CComQIPtr<IDispatch, &IID_IDispatch> > m_cNodeList;
public:
CIEHtmlElementCollection();
protected:
virtual ~CIEHtmlElementCollection();
public:
// Adds a node to the collection
virtual HRESULT AddNode(IDispatch *pNode);
// Helper method creates a collection from a parent node
static HRESULT CreateFromParentNode(nsIDOMNode *pParentNode, CIEHtmlElementCollection **pInstance);
BEGIN_COM_MAP(CIEHtmlElementCollection)
COM_INTERFACE_ENTRY_IID(IID_IDispatch, IHTMLElementCollection)
COM_INTERFACE_ENTRY_IID(IID_IHTMLElementCollection, IHTMLElementCollection)
END_COM_MAP()
// IHTMLElementCollection methods
virtual HRESULT STDMETHODCALLTYPE toString(BSTR __RPC_FAR *String);
virtual HRESULT STDMETHODCALLTYPE put_length(long v);
@@ -47,5 +53,4 @@ END_COM_MAP()
typedef CComObject<CIEHtmlElementCollection> CIEHtmlElementCollectionInstance;
#endif

View File

@@ -730,10 +730,10 @@ HRESULT STDMETHODCALLTYPE CMozillaBrowser::Navigate(BSTR URL, VARIANT __RPC_FAR
// Extract the launch flags parameter
LONG lFlags = 0;
if (Flags)
if (Flags && Flags->vt != VT_EMPTY && Flags->vt != VT_NULL)
{
CComVariant vFlags;
if (VariantChangeType(Flags, &vFlags, 0, VT_I4) != S_OK)
if (vFlags.ChangeType(VT_I4, Flags) != S_OK)
{
NG_ASSERT(0);
return E_INVALIDARG;
@@ -966,6 +966,13 @@ HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Document(IDispatch __RPC_FAR *__R
*ppDisp = NULL;
// Get hold of the DOM document
nsIDOMDocument *pIDOMDocument = nsnull;
if (FAILED(GetDOMDocument(&pIDOMDocument)) || pIDOMDocument == nsnull)
{
return E_UNEXPECTED;
}
CIEHtmlDocumentInstance *pDocument = NULL;
CIEHtmlDocumentInstance::CreateInstance(&pDocument);
if (pDocument == NULL)
@@ -974,8 +981,10 @@ HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Document(IDispatch __RPC_FAR *__R
}
pDocument->QueryInterface(IID_IDispatch, (void **) ppDisp);
pDocument->SetDOMNode(pIDOMDocument);
pIDOMDocument->Release();
return E_NOINTERFACE;
return S_OK;
}
HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_TopLevelContainer(VARIANT_BOOL __RPC_FAR *pBool)
@@ -1635,6 +1644,12 @@ HRESULT STDMETHODCALLTYPE CMozillaBrowser::Navigate2(VARIANT __RPC_FAR *URL, VAR
return E_UNEXPECTED;
}
if (URL == NULL)
{
NG_ASSERT(0);
return E_INVALIDARG;
}
CComVariant vURLAsString;
if (vURLAsString.ChangeType(VT_BSTR, URL) != S_OK)
{

View File

@@ -1,5 +1,5 @@
# Microsoft Developer Studio Project File - Name="MozillaControl" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 5.00
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) External Target" 0x0106
@@ -17,13 +17,12 @@ CFG=MozillaControl - Win32 Debug
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "MozillaControl - Win32 Release" (based on\
"Win32 (x86) External Target")
!MESSAGE "MozillaControl - Win32 Debug" (based on\
"Win32 (x86) External Target")
!MESSAGE "MozillaControl - Win32 Release" (based on "Win32 (x86) External Target")
!MESSAGE "MozillaControl - Win32 Debug" (based on "Win32 (x86) External Target")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
@@ -111,6 +110,10 @@ SOURCE=.\IEHtmlElementCollection.cpp
# End Source File
# Begin Source File
SOURCE=.\IEHtmlNode.cpp
# End Source File
# Begin Source File
SOURCE=.\LegacyPlugin.cpp
# End Source File
# Begin Source File
@@ -199,6 +202,10 @@ SOURCE=.\IEHtmlElementCollection.h
# End Source File
# Begin Source File
SOURCE=.\IEHtmlNode.h
# End Source File
# Begin Source File
SOURCE=.\MozillaBrowser.h
# End Source File
# Begin Source File

View File

@@ -93,7 +93,10 @@ typedef long int32;
#include "nsCRT.h"
#include "nsIDocumentViewer.h"
#include "nsIDOMNode.h"
#include "nsIDOMNodeList.h"
#include "nsIDOMDocument.h"
#include "nsIDOMElement.h"
// Mozilla control headers
#include "resource.h"

View File

@@ -42,8 +42,9 @@ OBJS = \
.\$(OBJDIR)\ControlSite.obj \
.\$(OBJDIR)\ControlSiteIPFrame.obj \
.\$(OBJDIR)\PropertyBag.obj \
.\$(OBJDIR)\IEHtmlElement.obj \
.\$(OBJDIR)\IEHtmlNode.obj \
.\$(OBJDIR)\IEHtmlElementCollection.obj \
.\$(OBJDIR)\IEHtmlElement.obj \
.\$(OBJDIR)\IEHtmlDocument.obj \
!ifdef MOZ_ACTIVEX_PLUGIN_SUPPORT
.\$(OBJDIR)\ActiveXPlugin.obj \
@@ -94,7 +95,7 @@ LLIBS = $(MYLIBS) \
shell32.lib \
-SUBSYSTEM:windows
LCFLAGS = /D "WIN32" /GX /FR
LCFLAGS = /D "WIN32" /GX /FR /U "ClientWallet"
LFLAGS = /DLL
include <$(DEPTH)\config\rules.mak>
@@ -128,11 +129,13 @@ ControlSite.cpp \
ControlSiteIPFrame.cpp \
PropertyBag.cpp : StdAfx.h PropertyBag.h ControlSite.h ControlSiteIPFrame.h
IEHtmlElement.cpp : StdAfx.h IEHtmlElement.h
IEHtmlNode.cpp : StdAfx.h IEHtmlNode.h
IEHtmlElementCollection.cpp : StdAfx.h IEHtmlElementCollection.h
IEHtmlDocument.cpp : StdAfx.h IEHtmlDocument.h
IEHtmlElement.cpp : StdAfx.h IEHtmlNode.h IEHtmlElement.h
IEHtmlDocument.cpp : StdAfx.h IEHtmlNode.h IEHtmlDocument.h
MozillaControl.cpp \
MozillaBrowser.cpp \