diff --git a/mozilla/content/html/document/public/MANIFEST b/mozilla/content/html/document/public/MANIFEST
new file mode 100644
index 00000000000..96630fd8881
--- /dev/null
+++ b/mozilla/content/html/document/public/MANIFEST
@@ -0,0 +1,4 @@
+#
+# This is a list of local files which get copied to the mozilla:dist:layout directory
+#
+nsIHTMLElementFactory.h
diff --git a/mozilla/content/html/document/public/Makefile.in b/mozilla/content/html/document/public/Makefile.in
new file mode 100644
index 00000000000..a6898c76add
--- /dev/null
+++ b/mozilla/content/html/document/public/Makefile.in
@@ -0,0 +1,35 @@
+#!gmake
+#
+# The contents of this file are subject to the Netscape Public License
+# Version 1.0 (the "NPL"); you may not use this file except in
+# compliance with the NPL. You may obtain a copy of the NPL at
+# http://www.mozilla.org/NPL/
+#
+# Software distributed under the NPL is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+# for the specific language governing rights and limitations under the
+# NPL.
+#
+# The Initial Developer of this code under the NPL is Netscape
+# Communications Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All Rights
+# Reserved.
+
+DEPTH = ../../../..
+topsrcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+MODULE=layout
+
+EXPORTS = \
+ nsIHTMLElementFactory.h \
+ $(NULL)
+
+EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS))
+
+include $(topsrcdir)/config/config.mk
+
+include $(topsrcdir)/config/rules.mk
diff --git a/mozilla/content/html/document/public/makefile.win b/mozilla/content/html/document/public/makefile.win
new file mode 100644
index 00000000000..298b5e6291f
--- /dev/null
+++ b/mozilla/content/html/document/public/makefile.win
@@ -0,0 +1,27 @@
+#!nmake
+#
+# The contents of this file are subject to the Netscape Public License
+# Version 1.0 (the "NPL"); you may not use this file except in
+# compliance with the NPL. You may obtain a copy of the NPL at
+# http://www.mozilla.org/NPL/
+#
+# Software distributed under the NPL is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+# for the specific language governing rights and limitations under the
+# NPL.
+#
+# The Initial Developer of this code under the NPL is Netscape
+# Communications Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All Rights
+# Reserved.
+
+DEPTH=..\..\..\..
+
+EXPORTS = \
+ nsIHTMLElementFactory.h \
+ $(NULL)
+
+MODULE=raptor
+
+include <$(DEPTH)\config\rules.mak>
+
diff --git a/mozilla/layout/base/nsILayoutDebugger.h b/mozilla/layout/base/nsILayoutDebugger.h
new file mode 100644
index 00000000000..1c4e0b6a1be
--- /dev/null
+++ b/mozilla/layout/base/nsILayoutDebugger.h
@@ -0,0 +1,51 @@
+/* -*- 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.0 (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 Communicator client 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.
+ */
+#ifndef nsILayoutDebugger_h___
+#define nsILayoutDebugger_h___
+
+#include "nslayout.h"
+#include "nsISupports.h"
+
+class nsIDocument;
+class nsIPresShell;
+
+/* a6cf90f8-15b3-11d2-932e-00805f8add32 */
+#define NS_ILAYOUT_DEBUGGER_IID \
+ { 0xa6cf90f8, 0x15b3, 0x11d2,{0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}}
+
+/**
+ * API for access and control of layout debugging
+ */
+class nsILayoutDebugger : public nsISupports {
+public:
+ NS_IMETHOD SetShowFrameBorders(PRBool aEnable) = 0;
+
+ NS_IMETHOD GetShowFrameBorders(PRBool* aResult) = 0;
+
+ NS_IMETHOD GetContentSize(nsIDocument* aDocument,
+ PRInt32* aSizeInBytesResult) = 0;
+
+ NS_IMETHOD GetFrameSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult) = 0;
+
+ NS_IMETHOD GetStyleSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult) = 0;
+};
+
+#endif /* nsILayoutDebugger_h___ */
diff --git a/mozilla/layout/base/nsLayoutDebugger.cpp b/mozilla/layout/base/nsLayoutDebugger.cpp
new file mode 100644
index 00000000000..26aad0ca0c8
--- /dev/null
+++ b/mozilla/layout/base/nsLayoutDebugger.cpp
@@ -0,0 +1,107 @@
+/* -*- 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.0 (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 Communicator client 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.
+ */
+#include "nsILayoutDebugger.h"
+#include "nsIFrame.h"
+
+static NS_DEFINE_IID(kILayoutDebuggerIID, NS_ILAYOUT_DEBUGGER_IID);
+
+class nsLayoutDebugger : public nsILayoutDebugger {
+public:
+ nsLayoutDebugger();
+ virtual ~nsLayoutDebugger();
+
+ NS_DECL_ISUPPORTS
+
+ NS_IMETHOD SetShowFrameBorders(PRBool aEnable);
+
+ NS_IMETHOD GetShowFrameBorders(PRBool* aResult);
+
+ NS_IMETHOD GetContentSize(nsIDocument* aDocument,
+ PRInt32* aSizeInBytesResult);
+
+ NS_IMETHOD GetFrameSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult);
+
+ NS_IMETHOD GetStyleSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult);
+
+};
+
+nsresult
+NS_NewLayoutDebugger(nsILayoutDebugger** aResult)
+{
+ NS_PRECONDITION(aResult, "null OUT ptr");
+ if (!aResult) {
+ return NS_ERROR_NULL_POINTER;
+ }
+ nsLayoutDebugger* it = new nsLayoutDebugger();
+ if (!it) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ return it->QueryInterface(kILayoutDebuggerIID, (void**)aResult);
+}
+
+nsLayoutDebugger::nsLayoutDebugger()
+{
+ NS_INIT_REFCNT();
+}
+
+nsLayoutDebugger::~nsLayoutDebugger()
+{
+}
+
+NS_IMPL_ISUPPORTS(nsLayoutDebugger, kILayoutDebuggerIID);
+
+NS_IMETHODIMP
+nsLayoutDebugger::SetShowFrameBorders(PRBool aEnable)
+{
+ nsIFrame::ShowFrameBorders(aEnable);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsLayoutDebugger::GetShowFrameBorders(PRBool* aResult)
+{
+ *aResult = nsIFrame::GetShowFrameBorders();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsLayoutDebugger::GetContentSize(nsIDocument* aDocument,
+ PRInt32* aSizeInBytesResult)
+{
+ *aSizeInBytesResult = 0;
+ return NS_ERROR_FAILURE;
+}
+
+NS_IMETHODIMP
+nsLayoutDebugger::GetFrameSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult)
+{
+ *aSizeInBytesResult = 0;
+ return NS_ERROR_FAILURE;
+}
+
+NS_IMETHODIMP
+nsLayoutDebugger::GetStyleSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult)
+{
+ *aSizeInBytesResult = 0;
+ return NS_ERROR_FAILURE;
+}
diff --git a/mozilla/layout/base/public/nsILayoutDebugger.h b/mozilla/layout/base/public/nsILayoutDebugger.h
new file mode 100644
index 00000000000..1c4e0b6a1be
--- /dev/null
+++ b/mozilla/layout/base/public/nsILayoutDebugger.h
@@ -0,0 +1,51 @@
+/* -*- 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.0 (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 Communicator client 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.
+ */
+#ifndef nsILayoutDebugger_h___
+#define nsILayoutDebugger_h___
+
+#include "nslayout.h"
+#include "nsISupports.h"
+
+class nsIDocument;
+class nsIPresShell;
+
+/* a6cf90f8-15b3-11d2-932e-00805f8add32 */
+#define NS_ILAYOUT_DEBUGGER_IID \
+ { 0xa6cf90f8, 0x15b3, 0x11d2,{0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}}
+
+/**
+ * API for access and control of layout debugging
+ */
+class nsILayoutDebugger : public nsISupports {
+public:
+ NS_IMETHOD SetShowFrameBorders(PRBool aEnable) = 0;
+
+ NS_IMETHOD GetShowFrameBorders(PRBool* aResult) = 0;
+
+ NS_IMETHOD GetContentSize(nsIDocument* aDocument,
+ PRInt32* aSizeInBytesResult) = 0;
+
+ NS_IMETHOD GetFrameSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult) = 0;
+
+ NS_IMETHOD GetStyleSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult) = 0;
+};
+
+#endif /* nsILayoutDebugger_h___ */
diff --git a/mozilla/layout/base/src/nsLayoutDebugger.cpp b/mozilla/layout/base/src/nsLayoutDebugger.cpp
new file mode 100644
index 00000000000..26aad0ca0c8
--- /dev/null
+++ b/mozilla/layout/base/src/nsLayoutDebugger.cpp
@@ -0,0 +1,107 @@
+/* -*- 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.0 (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 Communicator client 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.
+ */
+#include "nsILayoutDebugger.h"
+#include "nsIFrame.h"
+
+static NS_DEFINE_IID(kILayoutDebuggerIID, NS_ILAYOUT_DEBUGGER_IID);
+
+class nsLayoutDebugger : public nsILayoutDebugger {
+public:
+ nsLayoutDebugger();
+ virtual ~nsLayoutDebugger();
+
+ NS_DECL_ISUPPORTS
+
+ NS_IMETHOD SetShowFrameBorders(PRBool aEnable);
+
+ NS_IMETHOD GetShowFrameBorders(PRBool* aResult);
+
+ NS_IMETHOD GetContentSize(nsIDocument* aDocument,
+ PRInt32* aSizeInBytesResult);
+
+ NS_IMETHOD GetFrameSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult);
+
+ NS_IMETHOD GetStyleSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult);
+
+};
+
+nsresult
+NS_NewLayoutDebugger(nsILayoutDebugger** aResult)
+{
+ NS_PRECONDITION(aResult, "null OUT ptr");
+ if (!aResult) {
+ return NS_ERROR_NULL_POINTER;
+ }
+ nsLayoutDebugger* it = new nsLayoutDebugger();
+ if (!it) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ return it->QueryInterface(kILayoutDebuggerIID, (void**)aResult);
+}
+
+nsLayoutDebugger::nsLayoutDebugger()
+{
+ NS_INIT_REFCNT();
+}
+
+nsLayoutDebugger::~nsLayoutDebugger()
+{
+}
+
+NS_IMPL_ISUPPORTS(nsLayoutDebugger, kILayoutDebuggerIID);
+
+NS_IMETHODIMP
+nsLayoutDebugger::SetShowFrameBorders(PRBool aEnable)
+{
+ nsIFrame::ShowFrameBorders(aEnable);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsLayoutDebugger::GetShowFrameBorders(PRBool* aResult)
+{
+ *aResult = nsIFrame::GetShowFrameBorders();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsLayoutDebugger::GetContentSize(nsIDocument* aDocument,
+ PRInt32* aSizeInBytesResult)
+{
+ *aSizeInBytesResult = 0;
+ return NS_ERROR_FAILURE;
+}
+
+NS_IMETHODIMP
+nsLayoutDebugger::GetFrameSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult)
+{
+ *aSizeInBytesResult = 0;
+ return NS_ERROR_FAILURE;
+}
+
+NS_IMETHODIMP
+nsLayoutDebugger::GetStyleSize(nsIPresShell* aPresentation,
+ PRInt32* aSizeInBytesResult)
+{
+ *aSizeInBytesResult = 0;
+ return NS_ERROR_FAILURE;
+}
diff --git a/mozilla/layout/build/nsLayoutDLF.cpp b/mozilla/layout/build/nsLayoutDLF.cpp
new file mode 100644
index 00000000000..6c54d857672
--- /dev/null
+++ b/mozilla/layout/build/nsLayoutDLF.cpp
@@ -0,0 +1,593 @@
+/* -*- 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.0 (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 Communicator client 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.
+ */
+#include "nsIComponentManager.h"
+#include "nsIDocumentLoader.h"
+#include "nsIDocument.h"
+#include "nsIDocumentViewer.h"
+#include "nsIURL.h"
+#include "nsICSSParser.h"
+#include "nsICSSStyleSheet.h"
+#include "nsString.h"
+#include "nsLayoutCID.h"
+#include "nsCOMPtr.h"
+#include "prprf.h"
+#include "plstr.h"
+
+#include "nsRDFCID.h"
+#include "nsIXULParentDocument.h"
+#include "nsIXULChildDocument.h"
+#include "nsIRDFResource.h"
+#include "nsIXULDocumentInfo.h"
+#include "nsIStreamLoadableDocument.h"
+#include "nsIDocStreamLoaderFactory.h"
+
+// Factory code for creating variations on html documents
+
+#undef NOISY_REGISTRY
+
+// URL for the "user agent" style sheet
+#define UA_CSS_URL "resource:/res/ua.css"
+
+static NS_DEFINE_IID(kIDocumentLoaderFactoryIID, NS_IDOCUMENTLOADERFACTORY_IID);
+static NS_DEFINE_IID(kIDocStreamLoaderFactoryIID, NS_IDOCSTREAMLOADERFACTORY_IID);
+static NS_DEFINE_IID(kIDocumentIID, NS_IDOCUMENT_IID);
+static NS_DEFINE_IID(kHTMLDocumentCID, NS_HTMLDOCUMENT_CID);
+static NS_DEFINE_IID(kXMLDocumentCID, NS_XMLDOCUMENT_CID);
+static NS_DEFINE_IID(kImageDocumentCID, NS_IMAGEDOCUMENT_CID);
+static NS_DEFINE_IID(kXULDocumentCID, NS_XULDOCUMENT_CID);
+
+extern nsresult NS_NewDocumentViewer(nsIDocumentViewer** aResult);
+
+static char* gHTMLTypes[] = {
+ "text/html",
+ "application/rtf",
+ "text/plain",
+ 0
+};
+
+static char* gXMLTypes[] = {
+ "text/xml",
+ "application/xml",
+ 0
+};
+
+static char* gRDFTypes[] = {
+ "text/rdf",
+ "text/xul",
+ 0
+};
+
+static char* gImageTypes[] = {
+ "image/gif",
+ "image/jpeg",
+ "image/png",
+ 0
+};
+
+// XXX temporary
+static char* gPluginTypes[] = {
+ "video/quicktime",
+ "video/msvideo",
+ "video/x-msvideo",
+ "application/vnd.netfpx",
+ "image/vnd.fpx",
+ "model/vrml",
+ "x-world/x-vrml",
+ "audio/midi",
+ "audio/x-midi",
+ "audio/wav",
+ "audio/x-wav",
+ "audio/aiff",
+ "audio/x-aiff",
+ "audio/basic",
+ "application/x-shockwave-flash",
+ "application/pdf",
+ "application/npapi-test",
+ 0
+};
+
+extern nsresult
+NS_NewPluginContentViewer(const char* aCommand,
+ nsIStreamListener** aDocListener,
+ nsIContentViewer** aDocViewer);
+
+class nsLayoutDLF : public nsIDocumentLoaderFactory,
+ public nsIDocStreamLoaderFactory
+{
+public:
+ nsLayoutDLF();
+
+ NS_DECL_ISUPPORTS
+
+ // for nsIDocumentLoaderFactory
+ NS_IMETHOD CreateInstance(nsIURL* aURL,
+ const char* aContentType,
+ const char* aCommand,
+ nsIContentViewerContainer* aContainer,
+ nsISupports* aExtraInfo,
+ nsIStreamListener** aDocListener,
+ nsIContentViewer** aDocViewer);
+
+ // for nsIDocStreamLoaderFactory
+ NS_METHOD CreateInstance(nsIInputStream& aInputStream,
+ const char* aContentType,
+ const char* aCommand,
+ nsIContentViewerContainer* aContainer,
+ nsISupports* aExtraInfo,
+ nsIContentViewer** aDocViewer);
+
+ nsresult InitUAStyleSheet();
+
+ nsresult CreateDocument(nsIURL* aURL,
+ const char* aCommand,
+ nsIContentViewerContainer* aContainer,
+ const nsCID& aDocumentCID,
+ nsIStreamListener** aDocListener,
+ nsIContentViewer** aDocViewer);
+
+ nsresult CreateRDFDocument(const char* aContentType, nsIURL* aURL,
+ const char* aCommand,
+ nsIContentViewerContainer* aContainer,
+ nsISupports* aExtraInfo,
+ nsIStreamListener** aDocListener,
+ nsIContentViewer** aDocViewer);
+
+ nsresult CreateXULDocumentFromStream(nsIInputStream& aXULStream,
+ const char* aCommand,
+ nsIContentViewerContainer* aContainer,
+ nsISupports* aExtraInfo,
+ nsIContentViewer** aDocViewer);
+
+ nsresult CreateRDFDocument(nsISupports*,
+ nsCOMPtr*,
+ nsCOMPtr*);
+
+ static nsICSSStyleSheet* gUAStyleSheet;
+};
+
+nsresult
+NS_NewLayoutDocumentLoaderFactory(nsIDocumentLoaderFactory** aResult)
+{
+ NS_PRECONDITION(aResult, "null OUT ptr");
+ if (!aResult) {
+ return NS_ERROR_NULL_POINTER;
+ }
+ nsLayoutDLF* it = new nsLayoutDLF();
+ if (!it) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ return it->QueryInterface(kIDocumentLoaderFactoryIID, (void**)aResult);
+}
+
+nsICSSStyleSheet* nsLayoutDLF::gUAStyleSheet;
+
+nsLayoutDLF::nsLayoutDLF()
+{
+ NS_INIT_REFCNT();
+}
+
+NS_IMPL_ADDREF(nsLayoutDLF)
+NS_IMPL_RELEASE(nsLayoutDLF)
+
+NS_IMETHODIMP
+nsLayoutDLF::QueryInterface(REFNSIID aIID, void** aInstancePtrResult)
+{
+ if (NULL == aInstancePtrResult) {
+ return NS_ERROR_NULL_POINTER;
+ }
+
+ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+ if (aIID.Equals(kIDocumentLoaderFactoryIID)) {
+ nsIDocumentLoaderFactory *tmp = this;
+ *aInstancePtrResult = (void*) tmp;
+ AddRef();
+ return NS_OK;
+ }
+ if (aIID.Equals(kIDocStreamLoaderFactoryIID)) {
+ nsIDocStreamLoaderFactory *tmp = this;
+ *aInstancePtrResult = (void*) tmp;
+ AddRef();
+ return NS_OK;
+ }
+ if (aIID.Equals(kISupportsIID)) {
+ nsIDocumentLoaderFactory *tmp = this;
+ nsISupports *tmp2 = tmp;
+ *aInstancePtrResult = (void*) tmp2;
+ AddRef();
+ return NS_OK;
+ }
+ return NS_NOINTERFACE;
+}
+
+NS_IMETHODIMP
+nsLayoutDLF::CreateInstance(nsIURL* aURL,
+ const char* aContentType,
+ const char *aCommand,
+ nsIContentViewerContainer* aContainer,
+ nsISupports* aExtraInfo,
+ nsIStreamListener** aDocListener,
+ nsIContentViewer** aDocViewer)
+{
+ nsresult rv = NS_ERROR_FAILURE;
+
+ // XXX vile hack
+ if(0==PL_strcmp(gXMLTypes[0],aContentType))
+ if(0==PL_strcmp(aCommand,"view-source"))
+ aContentType=gHTMLTypes[0];
+
+ // Try html
+ int typeIndex=0;
+ while(gHTMLTypes[typeIndex]) {
+ if (0== PL_strcmp(gHTMLTypes[typeIndex++], aContentType)) {
+ return CreateDocument(aURL, aCommand, aContainer, kHTMLDocumentCID,
+ aDocListener, aDocViewer);
+ }
+ }
+
+ // Try XML
+ typeIndex = 0;
+ while(gXMLTypes[typeIndex]) {
+ if (0== PL_strcmp(gXMLTypes[typeIndex++], aContentType)) {
+ return CreateDocument(aURL, aCommand, aContainer, kXMLDocumentCID,
+ aDocListener, aDocViewer);
+ }
+ }
+
+ // Try RDF
+ typeIndex = 0;
+ while (gRDFTypes[typeIndex]) {
+ if (0 == PL_strcmp(gRDFTypes[typeIndex++], aContentType)) {
+ return CreateRDFDocument(aContentType, aURL, aCommand, aContainer,
+ aExtraInfo, aDocListener, aDocViewer);
+ }
+ }
+
+ // Try image types
+ typeIndex = 0;
+ while(gImageTypes[typeIndex]) {
+ if (0== PL_strcmp(gImageTypes[typeIndex++], aContentType)) {
+ return CreateDocument(aURL, aCommand, aContainer, kImageDocumentCID,
+ aDocListener, aDocViewer);
+ }
+ }
+
+ // Try plugin types
+ typeIndex = 0;
+ while(gPluginTypes[typeIndex]) {
+ if (0== PL_strcmp(gPluginTypes[typeIndex++], aContentType)) {
+ return NS_NewPluginContentViewer(aCommand, aDocListener, aDocViewer);
+ }
+ }
+
+ return rv;
+}
+
+nsresult
+nsLayoutDLF::CreateDocument(nsIURL* aURL,
+ const char* aCommand,
+ nsIContentViewerContainer* aContainer,
+ const nsCID& aDocumentCID,
+ nsIStreamListener** aDocListener,
+ nsIContentViewer** aDocViewer)
+{
+ nsresult rv = NS_ERROR_FAILURE;
+
+#ifdef NOISY_CREATE_DOC
+ if (nsnull != aURL) {
+ nsAutoString tmp;
+ aURL->ToString(tmp);
+ fputs(tmp, stdout);
+ printf(": creating document\n");
+ }
+#endif
+
+ // Load the UA style sheet if we haven't already done that
+ if (nsnull == gUAStyleSheet) {
+ InitUAStyleSheet();
+ }
+
+ nsCOMPtr doc;
+ nsCOMPtr docv;
+ do {
+ // Create the document
+ rv = nsComponentManager::CreateInstance(aDocumentCID, nsnull,
+ kIDocumentIID,
+ getter_AddRefs(doc));
+ if (NS_FAILED(rv))
+ break;
+
+ // Create the document viewer
+ rv = NS_NewDocumentViewer(getter_AddRefs(docv));
+ if (NS_FAILED(rv))
+ break;
+ docv->SetUAStyleSheet(gUAStyleSheet);
+
+ // Initialize the document to begin loading the data. An
+ // nsIStreamListener connected to the parser is returned in
+ // aDocListener.
+ rv = doc->StartDocumentLoad(aURL, aContainer, aDocListener, aCommand);
+ if (NS_FAILED(rv))
+ break;
+
+ // Bind the document to the Content Viewer
+ rv = docv->BindToDocument(doc, aCommand);
+ *aDocViewer = docv;
+ NS_IF_ADDREF(*aDocViewer);
+ } while (PR_FALSE);
+
+ return rv;
+}
+
+NS_IMETHODIMP
+nsLayoutDLF::CreateInstance(nsIInputStream& aInputStream,
+ const char* aContentType,
+ const char* aCommand,
+ nsIContentViewerContainer* aContainer,
+ nsISupports* aExtraInfo,
+ nsIContentViewer** aDocViewer)
+
+{
+ nsresult status = NS_ERROR_FAILURE;
+
+ // Try RDF
+ int typeIndex = 0;
+ while (gRDFTypes[typeIndex]) {
+ if (0 == PL_strcmp(gRDFTypes[typeIndex++], aContentType)) {
+ return CreateXULDocumentFromStream(aInputStream,
+ aCommand,
+ aContainer,
+ aExtraInfo,
+ aDocViewer);
+ }
+ }
+
+ return status;
+}
+
+// ...common work for |CreateRDFDocument| and |CreateXULDocumentFromStream|
+nsresult
+nsLayoutDLF::CreateRDFDocument(nsISupports* aExtraInfo,
+ nsCOMPtr* doc,
+ nsCOMPtr* docv)
+{
+ nsresult rv = NS_ERROR_FAILURE;
+ nsCOMPtr xulDocumentInfo;
+ xulDocumentInfo = do_QueryInterface(aExtraInfo);
+
+ // Load the UA style sheet if we haven't already done that
+ if (nsnull == gUAStyleSheet) {
+ InitUAStyleSheet();
+ }
+
+ do {
+ // Create the XUL document
+ rv = nsComponentManager::CreateInstance(kXULDocumentCID, nsnull,
+ kIDocumentIID,
+ getter_AddRefs(*doc));
+ if (NS_FAILED(rv))
+ break;
+
+ /*
+ * Create the image content viewer...
+ */
+ rv = NS_NewDocumentViewer(getter_AddRefs(*docv));
+ if (NS_FAILED(rv))
+ break;
+ (*docv)->SetUAStyleSheet(gUAStyleSheet);
+
+ // We are capable of being a XUL child document. If we have extra
+ // info that supports the XUL document info interface, then we'll
+ // know for sure.
+ if (xulDocumentInfo) {
+ // We are a XUL fragment. Retrieve the parent document and the
+ // fragment's root position within the parent document.
+ nsCOMPtr parentDocument;
+ nsCOMPtr fragmentRoot;
+ rv = xulDocumentInfo->GetDocument(getter_AddRefs(parentDocument));
+ if (NS_FAILED(rv))
+ break;
+ rv = xulDocumentInfo->GetResource(getter_AddRefs(fragmentRoot));
+ if (NS_FAILED(rv))
+ break;
+
+ // We were able to obtain a resource and a parent document.
+ parentDocument->AddSubDocument(*doc);
+ (*doc)->SetParentDocument(parentDocument);
+
+ // We need to set our fragment root as well. The
+ // XUL child document interface is required to do this.
+ nsCOMPtr xulChildDoc;
+ xulChildDoc = do_QueryInterface(*doc);
+ if (xulChildDoc) {
+ xulChildDoc->SetFragmentRoot(fragmentRoot);
+ }
+ }
+ } while (PR_FALSE);
+
+ return rv;
+}
+
+// ...note, this RDF document _may_ be XUL :-)
+nsresult
+nsLayoutDLF::CreateRDFDocument(const char* aContentType,
+ nsIURL* aURL,
+ const char* aCommand,
+ nsIContentViewerContainer* aContainer,
+ nsISupports* aExtraInfo,
+ nsIStreamListener** aDocListener,
+ nsIContentViewer** aDocViewer)
+{
+ nsCOMPtr doc;
+ nsCOMPtr docv;
+ nsresult rv = CreateRDFDocument(aExtraInfo, &doc, &docv);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ /*
+ * Initialize the document to begin loading the data...
+ *
+ * An nsIStreamListener connected to the parser is returned in
+ * aDocListener.
+ */
+ rv = doc->StartDocumentLoad(aURL, aContainer, aDocListener, aCommand);
+ if (NS_SUCCEEDED(rv)) {
+ /*
+ * Bind the document to the Content Viewer...
+ */
+ rv = docv->BindToDocument(doc, aCommand);
+ *aDocViewer = docv;
+ NS_IF_ADDREF(*aDocViewer);
+ }
+
+ return rv;
+}
+
+nsresult
+nsLayoutDLF::CreateXULDocumentFromStream(nsIInputStream& aXULStream,
+ const char* aCommand,
+ nsIContentViewerContainer* aContainer,
+ nsISupports* aExtraInfo,
+ nsIContentViewer** aDocViewer)
+{
+ nsresult status = NS_OK;
+
+ do
+ {
+ nsCOMPtr doc;
+ nsCOMPtr docv;
+ if ( NS_FAILED(status = CreateRDFDocument(aExtraInfo, &doc, &docv)) )
+ break;
+
+ if ( NS_FAILED(status = docv->BindToDocument(doc, aCommand)) )
+ break;
+
+ *aDocViewer = docv;
+ NS_IF_ADDREF(*aDocViewer);
+
+ nsCOMPtr loader = do_QueryInterface(doc, &status);
+ if ( NS_FAILED(status) )
+ break;
+
+ status = loader->LoadFromStream(aXULStream, aContainer, aCommand);
+ }
+ while (0);
+
+ return status;
+}
+
+// XXX move this into nsDocumentViewer.cpp
+nsresult
+nsLayoutDLF::InitUAStyleSheet()
+{
+ nsresult rv = NS_OK;
+
+ if (nsnull == gUAStyleSheet) { // snarf one
+ nsIURL* uaURL;
+ rv = NS_NewURL(&uaURL, nsString(UA_CSS_URL)); // XXX this bites, fix it
+ if (NS_SUCCEEDED(rv)) {
+ // Get an input stream from the url
+ nsIInputStream* in;
+ rv = NS_OpenURL(uaURL, &in);
+ if (NS_SUCCEEDED(rv)) {
+ // Translate the input using the argument character set id into unicode
+ nsIUnicharInputStream* uin;
+ rv = NS_NewConverterStream(&uin, nsnull, in);
+ if (NS_SUCCEEDED(rv)) {
+ // Create parser and set it up to process the input file
+ nsICSSParser* css;
+ rv = NS_NewCSSParser(&css);
+ if (NS_SUCCEEDED(rv)) {
+ // Parse the input and produce a style set
+ // XXX note: we are ignoring rv until the error code stuff in the
+ // input routines is converted to use nsresult's
+ css->Parse(uin, uaURL, gUAStyleSheet);
+ NS_RELEASE(css);
+ }
+ NS_RELEASE(uin);
+ }
+ NS_RELEASE(in);
+ }
+ else {
+ printf("open of %s failed: error=%x\n", UA_CSS_URL, rv);
+ rv = NS_ERROR_ILLEGAL_VALUE; // XXX need a better error code here
+ }
+
+ NS_RELEASE(uaURL);
+ }
+ }
+ return rv;
+}
+
+static NS_DEFINE_IID(kDocumentFactoryImplCID, NS_LAYOUT_DOCUMENT_LOADER_FACTORY_CID);
+
+static nsresult
+RegisterTypes(nsIComponentManager* cm, const char* aPath, char** aTypes)
+{
+ nsresult rv = NS_OK;
+ while (*aTypes) {
+ char progid[500];
+ char* contentType = *aTypes++;
+ PR_snprintf(progid, sizeof(progid),
+ NS_DOCUMENT_LOADER_FACTORY_PROGID_PREFIX "view/%s",
+ contentType);
+#ifdef NOISY_REGISTRY
+ printf("Register %s => %s\n", progid, aPath);
+#endif
+ rv = cm->RegisterComponent(kDocumentFactoryImplCID,
+ "Layout", progid, aPath, PR_TRUE, PR_TRUE);
+ if (NS_FAILED(rv)) {
+ break;
+ }
+ }
+ return rv;
+}
+
+nsresult
+NS_RegisterDocumentFactories(nsIComponentManager* cm, const char* aPath)
+{
+ nsresult rv;
+
+ do {
+ rv = RegisterTypes(cm, aPath, gHTMLTypes);
+ if (NS_FAILED(rv))
+ break;
+ rv = RegisterTypes(cm, aPath, gXMLTypes);
+ if (NS_FAILED(rv))
+ break;
+ rv = RegisterTypes(cm, aPath, gImageTypes);
+ if (NS_FAILED(rv))
+ break;
+ rv = RegisterTypes(cm, aPath, gPluginTypes);
+ if (NS_FAILED(rv))
+ break;
+ rv = RegisterTypes(cm, aPath, gRDFTypes);
+ if (NS_FAILED(rv))
+ break;
+ } while (PR_FALSE);
+ return rv;
+}
+
+nsresult
+NS_UnregisterDocumentFactories(nsIComponentManager* cm, const char* aPath)
+{
+ nsresult rv;
+ rv = cm->UnregisterComponent(kDocumentFactoryImplCID, aPath);
+ return rv;
+}
diff --git a/mozilla/layout/html/document/public/MANIFEST b/mozilla/layout/html/document/public/MANIFEST
new file mode 100644
index 00000000000..96630fd8881
--- /dev/null
+++ b/mozilla/layout/html/document/public/MANIFEST
@@ -0,0 +1,4 @@
+#
+# This is a list of local files which get copied to the mozilla:dist:layout directory
+#
+nsIHTMLElementFactory.h
diff --git a/mozilla/layout/html/document/public/Makefile.in b/mozilla/layout/html/document/public/Makefile.in
new file mode 100644
index 00000000000..a6898c76add
--- /dev/null
+++ b/mozilla/layout/html/document/public/Makefile.in
@@ -0,0 +1,35 @@
+#!gmake
+#
+# The contents of this file are subject to the Netscape Public License
+# Version 1.0 (the "NPL"); you may not use this file except in
+# compliance with the NPL. You may obtain a copy of the NPL at
+# http://www.mozilla.org/NPL/
+#
+# Software distributed under the NPL is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+# for the specific language governing rights and limitations under the
+# NPL.
+#
+# The Initial Developer of this code under the NPL is Netscape
+# Communications Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All Rights
+# Reserved.
+
+DEPTH = ../../../..
+topsrcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+MODULE=layout
+
+EXPORTS = \
+ nsIHTMLElementFactory.h \
+ $(NULL)
+
+EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS))
+
+include $(topsrcdir)/config/config.mk
+
+include $(topsrcdir)/config/rules.mk
diff --git a/mozilla/layout/html/document/public/makefile.win b/mozilla/layout/html/document/public/makefile.win
new file mode 100644
index 00000000000..298b5e6291f
--- /dev/null
+++ b/mozilla/layout/html/document/public/makefile.win
@@ -0,0 +1,27 @@
+#!nmake
+#
+# The contents of this file are subject to the Netscape Public License
+# Version 1.0 (the "NPL"); you may not use this file except in
+# compliance with the NPL. You may obtain a copy of the NPL at
+# http://www.mozilla.org/NPL/
+#
+# Software distributed under the NPL is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+# for the specific language governing rights and limitations under the
+# NPL.
+#
+# The Initial Developer of this code under the NPL is Netscape
+# Communications Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All Rights
+# Reserved.
+
+DEPTH=..\..\..\..
+
+EXPORTS = \
+ nsIHTMLElementFactory.h \
+ $(NULL)
+
+MODULE=raptor
+
+include <$(DEPTH)\config\rules.mak>
+
diff --git a/mozilla/layout/html/document/public/nsIHTMLElementFactory.h b/mozilla/layout/html/document/public/nsIHTMLElementFactory.h
new file mode 100644
index 00000000000..f6e5553a954
--- /dev/null
+++ b/mozilla/layout/html/document/public/nsIHTMLElementFactory.h
@@ -0,0 +1,41 @@
+/* -*- 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.0 (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 Communicator client 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.
+ */
+#ifndef nsIHTMLElementFactory_h___
+#define nsIHTMLElementFactory_h___
+
+#include "nslayout.h"
+#include "nsISupports.h"
+
+class nsIHTMLContent;
+class nsString;
+
+/* a6cf90fb-15b3-11d2-932e-00805f8add32 */
+#define NS_IHTML_ELEMENT_FACTORY_IID \
+ { 0xa6cf90fb, 0x15b3, 0x11d2,{0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}}
+
+/**
+ * An API for creating html content objects
+ */
+class nsIHTMLElementFactory : public nsISupports {
+public:
+ NS_IMETHOD CreateInstanceByTag(const nsString& aTag,
+ nsIHTMLContent** aResult) = 0;
+};
+
+#endif /* nsIHTMLElementFactory_h___ */