From 2277ba5c458918d51d9cae1eedcf14dc5cd0e933 Mon Sep 17 00:00:00 2001 From: "nisheeth%netscape.com" Date: Wed, 10 May 2000 23:02:32 +0000 Subject: [PATCH] Add support for loading an XML document from script within a XUL document also. --- .../base/public/nsIPrivateDOMImplementation.h | 49 +++++++++++++++++++ content/base/src/nsDocument.cpp | 35 ++++++++++++- content/xul/document/src/nsXULDocument.cpp | 18 +++++-- layout/base/public/MANIFEST | 1 + layout/base/public/Makefile.in | 7 +-- layout/base/public/makefile.win | 1 + .../base/public/nsIPrivateDOMImplementation.h | 49 +++++++++++++++++++ layout/base/src/nsDocument.cpp | 35 ++++++++++++- layout/build/nsLayoutCID.h | 4 ++ layout/build/nsLayoutFactory.cpp | 12 ++++- layout/build/nsLayoutModule.cpp | 2 + rdf/content/src/nsXULDocument.cpp | 18 +++++-- 12 files changed, 217 insertions(+), 14 deletions(-) create mode 100644 content/base/public/nsIPrivateDOMImplementation.h create mode 100644 layout/base/public/nsIPrivateDOMImplementation.h diff --git a/content/base/public/nsIPrivateDOMImplementation.h b/content/base/public/nsIPrivateDOMImplementation.h new file mode 100644 index 000000000000..2e2d4073fd4c --- /dev/null +++ b/content/base/public/nsIPrivateDOMImplementation.h @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +#ifndef nsIPrivateDOMImplementation_h__ +#define nsIPrivateDOMImplementation_h__ + +#include "nsISupports.h" + +class nsIDocument; + +/* + * Event listener manager interface. + */ +#define NS_IPRIVATEDOMIMPLEMENTATION_IID \ +{ /* d3205fb8-2652-11d4-ba06-0060b0fc76dd */ \ +0xd3205fb8, 0x2652, 0x11d4, \ +{0xba, 0x06, 0x00, 0x60, 0xb0, 0xfc, 0x76, 0xdd} } + +class nsIPrivateDOMImplementation : public nsISupports { + +public: + static const nsIID& GetIID() { static nsIID iid = NS_IPRIVATEDOMIMPLEMENTATION_IID; return iid; } + + NS_IMETHOD Init(nsIDocument* aDoc) = 0; +}; + +NS_LAYOUT nsresult +NS_NewDOMImplementation(nsIDOMDOMImplementation** aInstancePtrResult); + +#endif // nsIPrivateDOMImplementation_h__ diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index 5426f36c287f..e74e2d46efd8 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -92,6 +92,7 @@ #include "nsIScriptSecurityManager.h" #include "nsIAggregatePrincipal.h" +#include "nsIPrivateDOMImplementation.h" static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID); static NS_DEFINE_IID(kIDOMCommentIID, NS_IDOMCOMMENT_IID); @@ -116,6 +117,7 @@ static NS_DEFINE_IID(kIDOMRange, NS_IDOMRANGE_IID); static NS_DEFINE_IID(kIEnumeratorIID, NS_IENUMERATOR_IID); static NS_DEFINE_IID(kIDOMScriptObjectFactoryIID, NS_IDOM_SCRIPT_OBJECT_FACTORY_IID); static NS_DEFINE_IID(kDOMScriptObjectFactoryCID, NS_DOM_SCRIPT_OBJECT_FACTORY_CID); +static NS_DEFINE_IID(kIPrivateDOMImplementationIID, NS_IPRIVATEDOMIMPLEMENTATION_IID); #include "nsILineBreakerFactory.h" @@ -367,7 +369,8 @@ nsDOMStyleSheetList::DocumentWillBeDestroyed(nsIDocument *aDocument) // ================================================================== class nsDOMImplementation : public nsIDOMDOMImplementation, - public nsIScriptObjectOwner + public nsIScriptObjectOwner, + public nsIPrivateDOMImplementation { public: nsDOMImplementation(nsIDocument* aDocument = nsnull); @@ -375,6 +378,7 @@ public: NS_DECL_ISUPPORTS + // nsIDOMDOMImplementation NS_IMETHOD HasFeature(const nsString& aFeature, const nsString& aVersion, PRBool* aReturn); @@ -388,14 +392,28 @@ public: nsIDOMDocumentType* aDoctype, nsIDOMDocument** aReturn); + // nsIScriptObjectOwner NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject); NS_IMETHOD SetScriptObject(void *aScriptObject); + //nsIPrivateDOMImplementation + NS_IMETHOD Init(nsIDocument* aDoc); + protected: void *mScriptObject; nsCOMPtr mDocument; }; + +NS_LAYOUT nsresult +NS_NewDOMImplementation(nsIDOMDOMImplementation** aInstancePtrResult) +{ + nsDOMImplementation* domImpl = new nsDOMImplementation(); + if (domImpl == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + return domImpl->QueryInterface(kIDOMDOMImplementationIID, (void**) aInstancePtrResult); +} + nsDOMImplementation::nsDOMImplementation(nsIDocument* aDocument) { NS_INIT_REFCNT(); @@ -422,6 +440,12 @@ nsDOMImplementation::QueryInterface(REFNSIID aIID, void** aInstancePtr) NS_ADDREF_THIS(); return NS_OK; } + if (aIID.Equals(kIPrivateDOMImplementationIID)) { + nsIPrivateDOMImplementation* tmp = this; + *aInstancePtr = (void*) tmp; + NS_ADDREF_THIS(); + return NS_OK; + } if (aIID.Equals(kIScriptObjectOwnerIID)) { nsIScriptObjectOwner* tmp = this; *aInstancePtr = (void*) tmp; @@ -526,6 +550,13 @@ nsDOMImplementation::SetScriptObject(void *aScriptObject) return NS_OK; } +NS_IMETHODIMP +nsDOMImplementation::Init(nsIDocument* aDoc) +{ + mDocument = aDoc; + return NS_OK; +} + // ================================================================== // = // ================================================================== @@ -1953,7 +1984,7 @@ nsDocument::CreateElement(const nsString& aTagName, // Should be implemented by subclass return NS_ERROR_NOT_IMPLEMENTED; } - + NS_IMETHODIMP nsDocument::CreateTextNode(const nsString& aData, nsIDOMText** aReturn) { diff --git a/content/xul/document/src/nsXULDocument.cpp b/content/xul/document/src/nsXULDocument.cpp index 57f92b32bdb5..2bc054b2d94f 100644 --- a/content/xul/document/src/nsXULDocument.cpp +++ b/content/xul/document/src/nsXULDocument.cpp @@ -122,6 +122,8 @@ #include "rdf.h" #include "rdfutil.h" #include "nsIFrame.h" +#include "nsIPrivateDOMImplementation.h" +#include "nsIDOMDOMImplementation.h" #include "nsINodeInfo.h" //---------------------------------------------------------------------- @@ -156,6 +158,7 @@ static NS_DEFINE_CID(kXULContentUtilsCID, NS_XULCONTENTUTILS_CID); static NS_DEFINE_CID(kXULKeyListenerCID, NS_XULKEYLISTENER_CID); static NS_DEFINE_CID(kXULPrototypeCacheCID, NS_XULPROTOTYPECACHE_CID); static NS_DEFINE_CID(kXULTemplateBuilderCID, NS_XULTEMPLATEBUILDER_CID); +static NS_DEFINE_CID(kDOMImplementationCID, NS_DOM_IMPLEMENTATION_CID); static NS_DEFINE_IID(kIParserIID, NS_IPARSER_IID); @@ -2292,10 +2295,19 @@ nsXULDocument::GetDoctype(nsIDOMDocumentType** aDoctype) NS_IMETHODIMP nsXULDocument::GetImplementation(nsIDOMDOMImplementation** aImplementation) { - NS_NOTREACHED("nsXULDocument::GetImplementation"); - return NS_ERROR_NOT_IMPLEMENTED; -} + nsresult rv; + rv = nsComponentManager::CreateInstance(kDOMImplementationCID, + nsnull, + NS_GET_IID(nsIDOMDOMImplementation), + (void**) aImplementation); + if (NS_FAILED(rv)) return rv; + nsCOMPtr impl = do_QueryInterface(*aImplementation, &rv); + if (NS_FAILED(rv)) return rv; + + rv = impl->Init((nsIDocument*) this); + return rv; +} NS_IMETHODIMP nsXULDocument::GetDocumentElement(nsIDOMElement** aDocumentElement) diff --git a/layout/base/public/MANIFEST b/layout/base/public/MANIFEST index a6182e85d510..ec5f476d08da 100644 --- a/layout/base/public/MANIFEST +++ b/layout/base/public/MANIFEST @@ -56,3 +56,4 @@ nsILayoutHistoryState.h nsIStatefulFrame.h nsISelfScrollingFrame.h nsIScrollableFrame.h +nsIPrivateDOMImplementation.h \ No newline at end of file diff --git a/layout/base/public/Makefile.in b/layout/base/public/Makefile.in index b0e313deb4cd..3bf2dfa31541 100644 --- a/layout/base/public/Makefile.in +++ b/layout/base/public/Makefile.in @@ -84,13 +84,14 @@ nsILayoutHistoryState.h \ nsIStatefulFrame.h \ nsISelfScrollingFrame.h \ nsIScrollableFrame.h \ +nsIPrivateDOMImplementation.h \ $(NULL) XPIDLSRCS = \ nsIChromeEventHandler.idl \ - nsIContentPolicy.idl \ - nsISelectionController.idl \ - nsIPrintListener.idl \ + nsIContentPolicy.idl \ + nsISelectionController.idl \ + nsIPrintListener.idl \ $(NULL) EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS)) diff --git a/layout/base/public/makefile.win b/layout/base/public/makefile.win index 12101d724f88..013f3784f094 100644 --- a/layout/base/public/makefile.win +++ b/layout/base/public/makefile.win @@ -77,6 +77,7 @@ EXPORTS = \ nsIStatefulFrame.h \ nsISelfScrollingFrame.h \ nsIScrollableFrame.h \ + nsIPrivateDOMImplementation.h \ $(NULL) MODULE=raptor diff --git a/layout/base/public/nsIPrivateDOMImplementation.h b/layout/base/public/nsIPrivateDOMImplementation.h new file mode 100644 index 000000000000..2e2d4073fd4c --- /dev/null +++ b/layout/base/public/nsIPrivateDOMImplementation.h @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +#ifndef nsIPrivateDOMImplementation_h__ +#define nsIPrivateDOMImplementation_h__ + +#include "nsISupports.h" + +class nsIDocument; + +/* + * Event listener manager interface. + */ +#define NS_IPRIVATEDOMIMPLEMENTATION_IID \ +{ /* d3205fb8-2652-11d4-ba06-0060b0fc76dd */ \ +0xd3205fb8, 0x2652, 0x11d4, \ +{0xba, 0x06, 0x00, 0x60, 0xb0, 0xfc, 0x76, 0xdd} } + +class nsIPrivateDOMImplementation : public nsISupports { + +public: + static const nsIID& GetIID() { static nsIID iid = NS_IPRIVATEDOMIMPLEMENTATION_IID; return iid; } + + NS_IMETHOD Init(nsIDocument* aDoc) = 0; +}; + +NS_LAYOUT nsresult +NS_NewDOMImplementation(nsIDOMDOMImplementation** aInstancePtrResult); + +#endif // nsIPrivateDOMImplementation_h__ diff --git a/layout/base/src/nsDocument.cpp b/layout/base/src/nsDocument.cpp index 5426f36c287f..e74e2d46efd8 100644 --- a/layout/base/src/nsDocument.cpp +++ b/layout/base/src/nsDocument.cpp @@ -92,6 +92,7 @@ #include "nsIScriptSecurityManager.h" #include "nsIAggregatePrincipal.h" +#include "nsIPrivateDOMImplementation.h" static NS_DEFINE_IID(kIDOMTextIID, NS_IDOMTEXT_IID); static NS_DEFINE_IID(kIDOMCommentIID, NS_IDOMCOMMENT_IID); @@ -116,6 +117,7 @@ static NS_DEFINE_IID(kIDOMRange, NS_IDOMRANGE_IID); static NS_DEFINE_IID(kIEnumeratorIID, NS_IENUMERATOR_IID); static NS_DEFINE_IID(kIDOMScriptObjectFactoryIID, NS_IDOM_SCRIPT_OBJECT_FACTORY_IID); static NS_DEFINE_IID(kDOMScriptObjectFactoryCID, NS_DOM_SCRIPT_OBJECT_FACTORY_CID); +static NS_DEFINE_IID(kIPrivateDOMImplementationIID, NS_IPRIVATEDOMIMPLEMENTATION_IID); #include "nsILineBreakerFactory.h" @@ -367,7 +369,8 @@ nsDOMStyleSheetList::DocumentWillBeDestroyed(nsIDocument *aDocument) // ================================================================== class nsDOMImplementation : public nsIDOMDOMImplementation, - public nsIScriptObjectOwner + public nsIScriptObjectOwner, + public nsIPrivateDOMImplementation { public: nsDOMImplementation(nsIDocument* aDocument = nsnull); @@ -375,6 +378,7 @@ public: NS_DECL_ISUPPORTS + // nsIDOMDOMImplementation NS_IMETHOD HasFeature(const nsString& aFeature, const nsString& aVersion, PRBool* aReturn); @@ -388,14 +392,28 @@ public: nsIDOMDocumentType* aDoctype, nsIDOMDocument** aReturn); + // nsIScriptObjectOwner NS_IMETHOD GetScriptObject(nsIScriptContext *aContext, void** aScriptObject); NS_IMETHOD SetScriptObject(void *aScriptObject); + //nsIPrivateDOMImplementation + NS_IMETHOD Init(nsIDocument* aDoc); + protected: void *mScriptObject; nsCOMPtr mDocument; }; + +NS_LAYOUT nsresult +NS_NewDOMImplementation(nsIDOMDOMImplementation** aInstancePtrResult) +{ + nsDOMImplementation* domImpl = new nsDOMImplementation(); + if (domImpl == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + return domImpl->QueryInterface(kIDOMDOMImplementationIID, (void**) aInstancePtrResult); +} + nsDOMImplementation::nsDOMImplementation(nsIDocument* aDocument) { NS_INIT_REFCNT(); @@ -422,6 +440,12 @@ nsDOMImplementation::QueryInterface(REFNSIID aIID, void** aInstancePtr) NS_ADDREF_THIS(); return NS_OK; } + if (aIID.Equals(kIPrivateDOMImplementationIID)) { + nsIPrivateDOMImplementation* tmp = this; + *aInstancePtr = (void*) tmp; + NS_ADDREF_THIS(); + return NS_OK; + } if (aIID.Equals(kIScriptObjectOwnerIID)) { nsIScriptObjectOwner* tmp = this; *aInstancePtr = (void*) tmp; @@ -526,6 +550,13 @@ nsDOMImplementation::SetScriptObject(void *aScriptObject) return NS_OK; } +NS_IMETHODIMP +nsDOMImplementation::Init(nsIDocument* aDoc) +{ + mDocument = aDoc; + return NS_OK; +} + // ================================================================== // = // ================================================================== @@ -1953,7 +1984,7 @@ nsDocument::CreateElement(const nsString& aTagName, // Should be implemented by subclass return NS_ERROR_NOT_IMPLEMENTED; } - + NS_IMETHODIMP nsDocument::CreateTextNode(const nsString& aData, nsIDOMText** aReturn) { diff --git a/layout/build/nsLayoutCID.h b/layout/build/nsLayoutCID.h index 22236d116842..710fc0e266fc 100644 --- a/layout/build/nsLayoutCID.h +++ b/layout/build/nsLayoutCID.h @@ -155,6 +155,10 @@ #define NS_AUTOCOPYSERVICE_CID \ { 0x8775ca39, 0x4072, 0x4cc0, { 0x92, 0xd3, 0xa7, 0xc2, 0xb8, 0x20, 0x8, 0x9c } } +// 3a9cd622-264d-11d4-ba06-0060b0fc76dd +#define NS_DOM_IMPLEMENTATION_CID \ +{ 0x3a9cd622, 0x264d, 0x11d4, {0xba, 0x06, 0x00, 0x60, 0xb0, 0xfc, 0x76, 0xdd } } + // {AE52FE52-683A-437D-B661-DE55F4E0A873} #define NS_NODEINFOMANAGER_CID \ { 0xae52fe52, 0x683a, 0x437d, { 0xb6, 0x61, 0xde, 0x55, 0xf4, 0xe0, 0xa8, 0x73 } } diff --git a/layout/build/nsLayoutFactory.cpp b/layout/build/nsLayoutFactory.cpp index 01d99364021c..632ce49ecaab 100644 --- a/layout/build/nsLayoutFactory.cpp +++ b/layout/build/nsLayoutFactory.cpp @@ -52,6 +52,8 @@ #include "nsIDocumentEncoder.h" #include "nsCOMPtr.h" #include "nsIFrameSelection.h" +#include "nsIDOMDOMImplementation.h" +#include "nsIPrivateDOMImplementation.h" #include "nsIXBLService.h" #include "nsIBindingManager.h" @@ -98,10 +100,11 @@ static NS_DEFINE_CID(kTextEncoderCID, NS_TEXT_ENCODER_CID); static NS_DEFINE_CID(kXBLServiceCID, NS_XBLSERVICE_CID); static NS_DEFINE_CID(kBindingManagerCID, NS_BINDINGMANAGER_CID); +static NS_DEFINE_CID(kDOMImplementationCID, NS_DOM_IMPLEMENTATION_CID); static NS_DEFINE_CID(kNodeInfoManagerCID, NS_NODEINFOMANAGER_CID); - static NS_DEFINE_CID(kAutoCopyServiceCID, NS_AUTOCOPYSERVICE_CID); + extern nsresult NS_NewSelection(nsIFrameSelection** aResult); extern nsresult NS_NewRange(nsIDOMRange** aResult); extern nsresult NS_NewContentIterator(nsIContentIterator** aResult); @@ -398,6 +401,13 @@ nsLayoutFactory::CreateInstance(nsISupports *aOuter, return res; } } + else if (mClassID.Equals(kDOMImplementationCID)) { + res = NS_NewDOMImplementation((nsIDOMDOMImplementation**) &inst); + if (NS_FAILED(res)) { + LOG_NEW_FAILURE("NS_NewDOMImplementation", res); + return res; + } + } else { return NS_NOINTERFACE; } diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp index eed2d1523b22..a14c780ec516 100644 --- a/layout/build/nsLayoutModule.cpp +++ b/layout/build/nsLayoutModule.cpp @@ -318,6 +318,8 @@ static Components gComponents[] = { { "HTML style sheet", NS_HTMLSTYLESHEET_CID, nsnull, }, { "HTML-CSS style sheet", NS_HTML_CSS_STYLESHEET_CID, nsnull, }, + { "DOM implementation", NS_DOM_IMPLEMENTATION_CID, nsnull, }, + { "XML document", NS_XMLDOCUMENT_CID, nsnull, }, { "Image document", NS_IMAGEDOCUMENT_CID, nsnull, }, diff --git a/rdf/content/src/nsXULDocument.cpp b/rdf/content/src/nsXULDocument.cpp index 57f92b32bdb5..2bc054b2d94f 100644 --- a/rdf/content/src/nsXULDocument.cpp +++ b/rdf/content/src/nsXULDocument.cpp @@ -122,6 +122,8 @@ #include "rdf.h" #include "rdfutil.h" #include "nsIFrame.h" +#include "nsIPrivateDOMImplementation.h" +#include "nsIDOMDOMImplementation.h" #include "nsINodeInfo.h" //---------------------------------------------------------------------- @@ -156,6 +158,7 @@ static NS_DEFINE_CID(kXULContentUtilsCID, NS_XULCONTENTUTILS_CID); static NS_DEFINE_CID(kXULKeyListenerCID, NS_XULKEYLISTENER_CID); static NS_DEFINE_CID(kXULPrototypeCacheCID, NS_XULPROTOTYPECACHE_CID); static NS_DEFINE_CID(kXULTemplateBuilderCID, NS_XULTEMPLATEBUILDER_CID); +static NS_DEFINE_CID(kDOMImplementationCID, NS_DOM_IMPLEMENTATION_CID); static NS_DEFINE_IID(kIParserIID, NS_IPARSER_IID); @@ -2292,10 +2295,19 @@ nsXULDocument::GetDoctype(nsIDOMDocumentType** aDoctype) NS_IMETHODIMP nsXULDocument::GetImplementation(nsIDOMDOMImplementation** aImplementation) { - NS_NOTREACHED("nsXULDocument::GetImplementation"); - return NS_ERROR_NOT_IMPLEMENTED; -} + nsresult rv; + rv = nsComponentManager::CreateInstance(kDOMImplementationCID, + nsnull, + NS_GET_IID(nsIDOMDOMImplementation), + (void**) aImplementation); + if (NS_FAILED(rv)) return rv; + nsCOMPtr impl = do_QueryInterface(*aImplementation, &rv); + if (NS_FAILED(rv)) return rv; + + rv = impl->Init((nsIDocument*) this); + return rv; +} NS_IMETHODIMP nsXULDocument::GetDocumentElement(nsIDOMElement** aDocumentElement)