diff --git a/mozilla/webshell/embed/ActiveX/IEHtmlDocument.cpp b/mozilla/webshell/embed/ActiveX/IEHtmlDocument.cpp index 95a54e1d019..2e856b7ef79 100644 --- a/mozilla/webshell/embed/ActiveX/IEHtmlDocument.cpp +++ b/mozilla/webshell/embed/ActiveX/IEHtmlDocument.cpp @@ -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; } diff --git a/mozilla/webshell/embed/ActiveX/IEHtmlDocument.h b/mozilla/webshell/embed/ActiveX/IEHtmlDocument.h index 71d105850a6..6cb069b06d6 100644 --- a/mozilla/webshell/embed/ActiveX/IEHtmlDocument.h +++ b/mozilla/webshell/embed/ActiveX/IEHtmlDocument.h @@ -18,7 +18,9 @@ #ifndef IEHTMLDOCUMENT_H #define IEHTMLDOCUMENT_H -class CIEHtmlDocument : public CComObjectRootEx, +#include "IEHtmlNode.h" + +class CIEHtmlDocument : public CIEHtmlNode, public IDispatchImpl { public: diff --git a/mozilla/webshell/embed/ActiveX/IEHtmlElement.cpp b/mozilla/webshell/embed/ActiveX/IEHtmlElement.cpp index 0fd51dcf29a..aef143ef168 100644 --- a/mozilla/webshell/embed/ActiveX/IEHtmlElement.cpp +++ b/mozilla/webshell/embed/ActiveX/IEHtmlElement.cpp @@ -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; } diff --git a/mozilla/webshell/embed/ActiveX/IEHtmlElement.h b/mozilla/webshell/embed/ActiveX/IEHtmlElement.h index 4a4f3d291f5..fdb455decf0 100644 --- a/mozilla/webshell/embed/ActiveX/IEHtmlElement.h +++ b/mozilla/webshell/embed/ActiveX/IEHtmlElement.h @@ -18,13 +18,23 @@ #ifndef IEHTMLELEMENT_H #define IEHTMLELEMENT_H -class CIEHtmlElement : public CComObjectRootEx, +#include "IEHtmlNode.h" + +class CIEHtmlElement : public CIEHtmlNode, public IDispatchImpl { 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 CIEHtmlElementInstance; #endif \ No newline at end of file diff --git a/mozilla/webshell/embed/ActiveX/IEHtmlElementCollection.cpp b/mozilla/webshell/embed/ActiveX/IEHtmlElementCollection.cpp index de0d5cf1f77..f84d9d1bcc6 100644 --- a/mozilla/webshell/embed/ActiveX/IEHtmlElementCollection.cpp +++ b/mozilla/webshell/embed/ActiveX/IEHtmlElementCollection.cpp @@ -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) diff --git a/mozilla/webshell/embed/ActiveX/IEHtmlElementCollection.h b/mozilla/webshell/embed/ActiveX/IEHtmlElementCollection.h index c52f0efb863..ee955ac78b2 100644 --- a/mozilla/webshell/embed/ActiveX/IEHtmlElementCollection.h +++ b/mozilla/webshell/embed/ActiveX/IEHtmlElementCollection.h @@ -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, - public IDispatchImpl + public IDispatchImpl { - std::list< CIEHtmlElement * > m_cElementList; + std::vector< CComQIPtr > 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 CIEHtmlElementCollectionInstance; - #endif \ No newline at end of file diff --git a/mozilla/webshell/embed/ActiveX/MozillaBrowser.cpp b/mozilla/webshell/embed/ActiveX/MozillaBrowser.cpp index 05ff1c5b3ed..9815f904a00 100644 --- a/mozilla/webshell/embed/ActiveX/MozillaBrowser.cpp +++ b/mozilla/webshell/embed/ActiveX/MozillaBrowser.cpp @@ -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) { diff --git a/mozilla/webshell/embed/ActiveX/MozillaControl.dsp b/mozilla/webshell/embed/ActiveX/MozillaControl.dsp index e6bef2ce951..6f2290121d2 100644 --- a/mozilla/webshell/embed/ActiveX/MozillaControl.dsp +++ b/mozilla/webshell/embed/ActiveX/MozillaControl.dsp @@ -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 diff --git a/mozilla/webshell/embed/ActiveX/StdAfx.h b/mozilla/webshell/embed/ActiveX/StdAfx.h index c9cb182f16a..6078d7667fc 100644 --- a/mozilla/webshell/embed/ActiveX/StdAfx.h +++ b/mozilla/webshell/embed/ActiveX/StdAfx.h @@ -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" diff --git a/mozilla/webshell/embed/ActiveX/makefile.win b/mozilla/webshell/embed/ActiveX/makefile.win index 85846e48f67..882b5051aed 100644 --- a/mozilla/webshell/embed/ActiveX/makefile.win +++ b/mozilla/webshell/embed/ActiveX/makefile.win @@ -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 \