From 8a6a52bef1c14ac93bd1dbbd2a23192c0096aaee Mon Sep 17 00:00:00 2001 From: "nisheeth%netscape.com" Date: Mon, 1 May 2000 06:58:53 +0000 Subject: [PATCH] 1) Added support for loading an XML document "out of band" from script and manipulating it via dom interfaces. 2) Fixed compile errors in XSL glue code that happened after the recent nsString landing by scc. 3) Added a check for a null URI before de-referencing it in nsCodeBasePrincipal.cpp. git-svn-id: svn://10.0.0.236/trunk@67709 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/caps/src/nsCodebasePrincipal.cpp | 2 +- mozilla/content/base/public/nsIDocument.h | 11 ++- mozilla/content/base/src/nsDocument.cpp | 40 ++++++++--- mozilla/content/base/src/nsDocument.h | 4 +- mozilla/content/events/src/nsDOMEvent.cpp | 7 +- .../html/document/src/nsHTMLDocument.cpp | 7 +- .../html/document/src/nsHTMLDocument.h | 3 +- .../html/document/src/nsImageDocument.cpp | 8 ++- .../xml/document/src/nsXMLContentSink.cpp | 4 +- .../xml/document/src/nsXMLDocument.cpp | 70 +++++++++++++++++-- .../content/xml/document/src/nsXMLDocument.h | 7 +- .../xsl/document/src/nsTransformMediator.cpp | 2 +- .../xul/document/src/nsXULDocument.cpp | 10 ++- .../content/xul/document/src/nsXULDocument.h | 4 +- mozilla/docshell/base/nsDocShell.cpp | 2 +- mozilla/docshell/base/nsWebShell.cpp | 8 ++- mozilla/dom/public/coreDom/nsIDOMNSDocument.h | 4 ++ mozilla/dom/public/idl/coreDom/Document.idl | 6 +- mozilla/dom/public/nsDOMPropEnums.h | 1 + mozilla/dom/public/nsDOMPropNames.h | 1 + mozilla/dom/src/coreDOM/nsJSDocument.cpp | 49 +++++++++++++ mozilla/htmlparser/src/nsExpatTokenizer.cpp | 2 +- mozilla/htmlparser/src/nsIParser.h | 1 + mozilla/htmlparser/src/nsParser.cpp | 6 ++ mozilla/htmlparser/src/nsParser.h | 2 + mozilla/layout/base/public/nsIDocument.h | 11 ++- mozilla/layout/base/src/nsDocument.cpp | 40 ++++++++--- mozilla/layout/base/src/nsDocument.h | 4 +- mozilla/layout/build/nsLayoutDLF.cpp | 4 +- mozilla/layout/doc/layout.css | 6 +- mozilla/layout/events/src/nsDOMEvent.cpp | 7 +- .../html/document/src/nsHTMLDocument.cpp | 7 +- .../layout/html/document/src/nsHTMLDocument.h | 3 +- .../html/document/src/nsImageDocument.cpp | 8 ++- mozilla/layout/html/tests/makefile.win | 3 + .../xml/document/src/nsXMLContentSink.cpp | 4 +- .../layout/xml/document/src/nsXMLDocument.cpp | 70 +++++++++++++++++-- .../layout/xml/document/src/nsXMLDocument.h | 7 +- .../xsl/document/src/nsTransformMediator.cpp | 2 +- .../htmlparser/src/nsExpatTokenizer.cpp | 2 +- mozilla/parser/htmlparser/src/nsIParser.h | 1 + mozilla/parser/htmlparser/src/nsParser.cpp | 6 ++ mozilla/parser/htmlparser/src/nsParser.h | 2 + mozilla/rdf/content/src/nsXULDocument.cpp | 10 ++- mozilla/rdf/content/src/nsXULDocument.h | 4 +- mozilla/webshell/src/nsWebShell.cpp | 8 ++- 46 files changed, 386 insertions(+), 84 deletions(-) diff --git a/mozilla/caps/src/nsCodebasePrincipal.cpp b/mozilla/caps/src/nsCodebasePrincipal.cpp index 47a38fe7360..4f32fa511a4 100644 --- a/mozilla/caps/src/nsCodebasePrincipal.cpp +++ b/mozilla/caps/src/nsCodebasePrincipal.cpp @@ -253,7 +253,7 @@ nsresult nsCodebasePrincipal::Init(nsIURI *uri) { char *codebase; - if (NS_FAILED(uri->GetSpec(&codebase))) + if (uri == nsnull || NS_FAILED(uri->GetSpec(&codebase))) return NS_ERROR_FAILURE; if (NS_FAILED(mJSPrincipals.Init(codebase))) { nsCRT::free(codebase); diff --git a/mozilla/content/base/public/nsIDocument.h b/mozilla/content/base/public/nsIDocument.h index b0720f16373..260c215d0ef 100644 --- a/mozilla/content/base/public/nsIDocument.h +++ b/mozilla/content/base/public/nsIDocument.h @@ -57,6 +57,8 @@ class nsIWordBreaker; class nsIDOMSelection; class nsIChannel; class nsIPrincipal; +class nsIDOMDocument; +class nsIDOMDocumentType; // IID for the nsIDocument interface #define NS_IDOCUMENT_IID \ @@ -102,7 +104,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) = 0; + nsIStreamListener **aDocListener, + PRBool aReset) = 0; NS_IMETHOD StopDocumentLoad() = 0; @@ -340,6 +343,12 @@ extern NS_LAYOUT nsresult extern NS_LAYOUT nsresult NS_NewDocumentFragment(nsIDOMDocumentFragment** aInstancePtrResult, nsIDocument* aOwnerDocument); +extern NS_LAYOUT nsresult + NS_NewDOMDocument(nsIDOMDocument** aInstancePtrResult, + const nsString& aNamespaceURI, + const nsString& aQualifiedName, + nsIDOMDocumentType* aDoctype, + nsIURI* aBaseURI); // Note: The buffer passed into NewPostData(...) becomes owned by the IPostData // instance and is freed when the instance is destroyed... diff --git a/mozilla/content/base/src/nsDocument.cpp b/mozilla/content/base/src/nsDocument.cpp index 36b7f96fc8a..6db30dc52f2 100644 --- a/mozilla/content/base/src/nsDocument.cpp +++ b/mozilla/content/base/src/nsDocument.cpp @@ -369,7 +369,7 @@ class nsDOMImplementation : public nsIDOMDOMImplementation, public nsIScriptObjectOwner { public: - nsDOMImplementation(); + nsDOMImplementation(nsIDocument* aDocument = nsnull); virtual ~nsDOMImplementation(); NS_DECL_ISUPPORTS @@ -392,12 +392,14 @@ public: protected: void *mScriptObject; + nsCOMPtr mDocument; }; -nsDOMImplementation::nsDOMImplementation() +nsDOMImplementation::nsDOMImplementation(nsIDocument* aDocument) { NS_INIT_REFCNT(); mScriptObject = nsnull; + mDocument = aDocument; } nsDOMImplementation::~nsDOMImplementation() @@ -477,12 +479,20 @@ nsDOMImplementation::CreateDocument(const nsString& aNamespaceURI, const nsString& aQualifiedName, nsIDOMDocumentType* aDoctype, nsIDOMDocument** aReturn) -{ - NS_ENSURE_ARG_POINTER(aReturn); - +{ + NS_ENSURE_ARG_POINTER(aReturn); + + nsresult rv = NS_OK; *aReturn = nsnull; - return NS_OK; + nsIURI* baseURI; + rv = mDocument->GetBaseURL(baseURI); + if (NS_FAILED(rv)) return rv; + + NS_NewDOMDocument(aReturn, aNamespaceURI, aQualifiedName, aDoctype, baseURI); + + NS_RELEASE(baseURI); + return rv; } NS_IMETHODIMP @@ -788,7 +798,7 @@ NS_IMPL_RELEASE(nsDocument) nsresult nsDocument::Init() { nsresult rv = NS_NewHeapArena(&mArena, nsnull); - + NS_NewNameSpaceManager(&mNameSpaceManager); return rv; } @@ -878,9 +888,13 @@ nsDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) + nsIStreamListener **aDocListener, + PRBool aReset) { - return Reset(aChannel, aLoadGroup); + nsresult rv = NS_OK; + if (aReset) + rv = Reset(aChannel, aLoadGroup); + return rv; } NS_IMETHODIMP @@ -1894,7 +1908,7 @@ nsDocument::GetImplementation(nsIDOMDOMImplementation** aImplementation) { // For now, create a new implementation every time. This shouldn't // be a high bandwidth operation - nsDOMImplementation* impl = new nsDOMImplementation(); + nsDOMImplementation* impl = new nsDOMImplementation(this); if (nsnull == impl) { return NS_ERROR_OUT_OF_MEMORY; } @@ -2188,6 +2202,12 @@ nsDocument::GetHeight(PRInt32* aHeight) return result; } +NS_IMETHODIMP +nsDocument::Load (const nsString& aUrl, const nsString& aMimeType) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + // // nsIDOMNode methods // diff --git a/mozilla/content/base/src/nsDocument.h b/mozilla/content/base/src/nsDocument.h index 5f9487d6e56..3f711b2ff8d 100644 --- a/mozilla/content/base/src/nsDocument.h +++ b/mozilla/content/base/src/nsDocument.h @@ -128,7 +128,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener); + nsIStreamListener **aDocListener, + PRBool aReset = PR_TRUE); NS_IMETHOD StopDocumentLoad(); @@ -357,6 +358,7 @@ public: NS_IMETHOD CreateRange(nsIDOMRange** aReturn); NS_IMETHOD GetWidth(PRInt32* aWidth); NS_IMETHOD GetHeight(PRInt32* aHeight); + NS_IMETHOD Load (const nsString& aUrl, const nsString& aMimeType); // nsIDOMNode interface NS_DECL_IDOMNODE diff --git a/mozilla/content/events/src/nsDOMEvent.cpp b/mozilla/content/events/src/nsDOMEvent.cpp index 26967114d4f..d4fdf6f5a1d 100644 --- a/mozilla/content/events/src/nsDOMEvent.cpp +++ b/mozilla/content/events/src/nsDOMEvent.cpp @@ -46,7 +46,8 @@ static char* mEventNames[] = { nsDOMEvent::nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent) { mPresContext = aPresContext; - NS_ADDREF(mPresContext); + if (mPresContext) + NS_ADDREF(mPresContext); mEvent = aEvent; mTarget = nsnull; mText = nsnull; @@ -82,7 +83,7 @@ nsDOMEvent::nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent) { } nsDOMEvent::~nsDOMEvent() { - NS_RELEASE(mPresContext); + NS_IF_RELEASE(mPresContext); NS_IF_RELEASE(mTarget); NS_IF_RELEASE(mTextRange); @@ -127,7 +128,7 @@ NS_METHOD nsDOMEvent::GetTarget(nsIDOMNode** aTarget) } nsIEventStateManager *manager; - nsIContent *targetContent; + nsIContent *targetContent; if (NS_OK == mPresContext->GetEventStateManager(&manager)) { manager->GetEventTargetContent(mEvent, &targetContent); diff --git a/mozilla/content/html/document/src/nsHTMLDocument.cpp b/mozilla/content/html/document/src/nsHTMLDocument.cpp index d222b0b04cc..662aae28e41 100644 --- a/mozilla/content/html/document/src/nsHTMLDocument.cpp +++ b/mozilla/content/html/document/src/nsHTMLDocument.cpp @@ -392,7 +392,8 @@ nsHTMLDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) + nsIStreamListener **aDocListener, + PRBool aReset) { PRBool needsParser=PR_TRUE; if (aCommand) @@ -406,8 +407,8 @@ nsHTMLDocument::StartDocumentLoad(const char* aCommand, nsresult rv = nsDocument::StartDocumentLoad(aCommand, aChannel, aLoadGroup, - aContainer, - aDocListener); + aContainer, + aDocListener, aReset); if (NS_FAILED(rv)) { return rv; } nsAutoString charset; charset.AssignWithConversion("ISO-8859-1"); // fallback value in case webShell return error diff --git a/mozilla/content/html/document/src/nsHTMLDocument.h b/mozilla/content/html/document/src/nsHTMLDocument.h index b75171f8252..5046052191d 100644 --- a/mozilla/content/html/document/src/nsHTMLDocument.h +++ b/mozilla/content/html/document/src/nsHTMLDocument.h @@ -68,7 +68,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener); + nsIStreamListener **aDocListener, + PRBool aReset = PR_TRUE); NS_IMETHOD StopDocumentLoad(); diff --git a/mozilla/content/html/document/src/nsImageDocument.cpp b/mozilla/content/html/document/src/nsImageDocument.cpp index ae9a057f7be..0b097f96222 100644 --- a/mozilla/content/html/document/src/nsImageDocument.cpp +++ b/mozilla/content/html/document/src/nsImageDocument.cpp @@ -62,7 +62,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener); + nsIStreamListener **aDocListener, + PRBool aReset = PR_TRUE); nsresult CreateSyntheticDocument(); @@ -178,12 +179,13 @@ nsImageDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) + nsIStreamListener **aDocListener, + PRBool aReset) { nsresult rv = nsDocument::StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer, - aDocListener); + aDocListener, aReset); if (NS_FAILED(rv)) { return rv; } diff --git a/mozilla/content/xml/document/src/nsXMLContentSink.cpp b/mozilla/content/xml/document/src/nsXMLContentSink.cpp index 27b95619942..7c0e4e3b257 100644 --- a/mozilla/content/xml/document/src/nsXMLContentSink.cpp +++ b/mozilla/content/xml/document/src/nsXMLContentSink.cpp @@ -1132,7 +1132,7 @@ nsXMLContentSink::LoadXSLStyleSheet(nsIURI* aUrl, const nsString& aType) // Hook up the content sink to the parser's output and ask the parser // to start parsing the URL specified by aURL. parser->SetContentSink(sink); - nsAutoString utf8("UTF-8"); + nsAutoString utf8(NS_ConvertASCIItoUCS2("UTF-8")); mDocument->SetDocumentCharacterSet(utf8); parser->SetDocumentCharset(utf8, kCharsetFromDocTypeDefault); parser->Parse(aUrl); @@ -1281,7 +1281,7 @@ nsXMLContentSink::AddProcessingInstruction(const nsIParserNode& aNode) result = ProcessCSSStyleLink(node, href, alternate.EqualsWithConversion("yes"), title, type, media); #else - result = ProcessStyleLink(node, href, alternate.Equals("yes"), + result = ProcessStyleLink(node, href, alternate.EqualsWithConversion("yes"), title, type, media); #endif } diff --git a/mozilla/content/xml/document/src/nsXMLDocument.cpp b/mozilla/content/xml/document/src/nsXMLDocument.cpp index ae7903d8ab7..091d380d4fd 100644 --- a/mozilla/content/xml/document/src/nsXMLDocument.cpp +++ b/mozilla/content/xml/document/src/nsXMLDocument.cpp @@ -65,6 +65,7 @@ #include "nsCharsetDetectionAdaptorCID.h" #include "nsICharsetAlias.h" #include "nsIParserFilter.h" +#include "nsNetUtil.h" // XXX The XML world depends on the html atoms @@ -92,6 +93,7 @@ static PRBool gInitDetector = PR_FALSE; static PRBool gPlugDetector = PR_FALSE; static NS_DEFINE_IID(kIParserFilterIID, NS_IPARSERFILTER_IID); +static const char* kLoadAsData = "loadAsData"; // ================================================================== // = @@ -121,6 +123,20 @@ MyPrefChangedCallback(const char*aPrefName, void* instance_data) return 0; } +NS_LAYOUT nsresult +NS_NewDOMDocument(nsIDOMDocument** aInstancePtrResult, + const nsString& aNamespaceURI, + const nsString& aQualifiedName, + nsIDOMDocumentType* aDoctype, + nsIURI* aBaseURI) +{ + // XXX Ignoring the namespace, qualified name, and doctype parameters for now + nsXMLDocument* doc = new nsXMLDocument(aBaseURI); + if (doc == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + return doc->QueryInterface(kIDOMDocumentIID, (void**) aInstancePtrResult); +} + NS_LAYOUT nsresult NS_NewXMLDocument(nsIDocument** aInstancePtrResult) @@ -131,13 +147,15 @@ NS_NewXMLDocument(nsIDocument** aInstancePtrResult) return doc->QueryInterface(kIDocumentIID, (void**) aInstancePtrResult); } -nsXMLDocument::nsXMLDocument() +nsXMLDocument::nsXMLDocument(nsIURI* aBaseURI) { mParser = nsnull; mAttrStyleSheet = nsnull; mInlineStyleSheet = nsnull; mCSSLoader = nsnull; - + mDocumentURL = aBaseURI; + NS_IF_ADDREF(mDocumentURL); + #ifdef XSL mTransformMediator = nsnull; #endif @@ -234,17 +252,47 @@ nsXMLDocument::GetContentType(nsString& aContentType) const return NS_OK; } +NS_IMETHODIMP +nsXMLDocument::Load(const nsString& aUrl, const nsString& aMimeType) +{ + nsCOMPtr channel; + nsCOMPtr uri; + nsresult rv = NS_OK; + + // Create a new URI and channel + rv = NS_NewURI(getter_AddRefs(uri), aUrl, mDocumentURL); + if (NS_FAILED(rv)) return rv; + rv = NS_OpenURI(getter_AddRefs(channel), uri, nsnull); + if (NS_FAILED(rv)) return rv; + + // Prepare for loading the XML document "into oneself" + nsCOMPtr listener; + if (NS_FAILED(rv = StartDocumentLoad(kLoadAsData, channel, + nsnull, nsnull, + getter_AddRefs(listener), + PR_FALSE))) { + NS_ERROR("nsXMLDocument::Load: Failed to start the document load."); + return rv; + } + + // Start an asynchronous read of the XML document + rv = channel->AsyncRead(listener, nsnull); + + return rv; +} + NS_IMETHODIMP nsXMLDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) + nsIStreamListener **aDocListener, + PRBool aReset) { nsresult rv = nsDocument::StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer, - aDocListener); + aDocListener, aReset); if (NS_FAILED(rv)) { return rv; } @@ -525,8 +573,20 @@ nsXMLDocument::StartDocumentLoad(const char* aCommand, NS_IMETHODIMP nsXMLDocument::EndLoad() { + nsAutoString cmd; + mParser->GetCommand(cmd); NS_IF_RELEASE(mParser); - return nsDocument::EndLoad(); + if (cmd.EqualsWithConversion(kLoadAsData)) { + // Generate a document load event for the case when an XML document was loaded + // as pure data without any presentation attached to it. + nsCOMPtr scriptGlobal; + nsEventStatus status = nsEventStatus_eIgnore; + nsMouseEvent event; + event.eventStructType = NS_EVENT; + event.message = NS_PAGE_LOAD; + HandleDOMEvent(nsnull, &event, nsnull, NS_EVENT_FLAG_INIT, &status); + } + return nsDocument::EndLoad(); } NS_IMETHODIMP diff --git a/mozilla/content/xml/document/src/nsXMLDocument.h b/mozilla/content/xml/document/src/nsXMLDocument.h index cf7eed48e4b..714ead02267 100644 --- a/mozilla/content/xml/document/src/nsXMLDocument.h +++ b/mozilla/content/xml/document/src/nsXMLDocument.h @@ -40,7 +40,7 @@ class nsXMLDocument : public nsMarkupDocument, public nsIHTMLContentContainer { public: - nsXMLDocument(); + nsXMLDocument(nsIURI* aBaseURI = nsnull); virtual ~nsXMLDocument(); NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr); @@ -54,7 +54,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener); + nsIStreamListener **aDocListener, + PRBool aReset = PR_TRUE); NS_IMETHOD EndLoad(); @@ -82,7 +83,7 @@ public: NS_IMETHOD GetElementsByTagNameNS(const nsString& aNamespaceURI, const nsString& aLocalName, nsIDOMNodeList** aReturn); - + NS_IMETHOD Load(const nsString& aUrl, const nsString& aMimeType); // nsIXMLDocument interface NS_IMETHOD GetContentById(const nsString& aName, nsIContent** aContent); diff --git a/mozilla/content/xsl/document/src/nsTransformMediator.cpp b/mozilla/content/xsl/document/src/nsTransformMediator.cpp index 6dfc9871bfd..c974b7d98a3 100644 --- a/mozilla/content/xsl/document/src/nsTransformMediator.cpp +++ b/mozilla/content/xsl/document/src/nsTransformMediator.cpp @@ -71,7 +71,7 @@ nsTransformMediator::~nsTransformMediator() static nsresult ConstructProgID(nsString& aProgID, const nsString& aMimeType) { - aProgID = kTransformerProgIDPrefix; + aProgID.AssignWithConversion(kTransformerProgIDPrefix); aProgID.Append(aMimeType); return NS_OK; diff --git a/mozilla/content/xul/document/src/nsXULDocument.cpp b/mozilla/content/xul/document/src/nsXULDocument.cpp index 33e7f04f18c..638428a3240 100644 --- a/mozilla/content/xul/document/src/nsXULDocument.cpp +++ b/mozilla/content/xul/document/src/nsXULDocument.cpp @@ -693,7 +693,8 @@ nsXULDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) + nsIStreamListener **aDocListener, + PRBool aReset) { nsresult rv; mCommand.AssignWithConversion(aCommand); @@ -2686,6 +2687,13 @@ nsXULDocument::GetHeight(PRInt32* aHeight) return NS_ERROR_NOT_IMPLEMENTED; } +NS_IMETHODIMP +nsXULDocument::Load(const nsString& aUrl, const nsString& aMimeType) +{ + NS_NOTREACHED("nsXULDocument::Load"); + return NS_ERROR_NOT_IMPLEMENTED; +} + //---------------------------------------------------------------------- // // nsIDOMXULDocument interface diff --git a/mozilla/content/xul/document/src/nsXULDocument.h b/mozilla/content/xul/document/src/nsXULDocument.h index 7b146f24889..dcc88edd6da 100644 --- a/mozilla/content/xul/document/src/nsXULDocument.h +++ b/mozilla/content/xul/document/src/nsXULDocument.h @@ -116,7 +116,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener); + nsIStreamListener **aDocListener, + PRBool aReset); NS_IMETHOD StopDocumentLoad(); @@ -343,6 +344,7 @@ public: NS_IMETHOD CreateRange(nsIDOMRange** aRange); NS_IMETHOD GetWidth(PRInt32* aWidth); NS_IMETHOD GetHeight(PRInt32* aHeight); + NS_IMETHOD Load (const nsString& aUrl, const nsString& aMimeType); // nsIDOMXULDocument interface NS_DECL_IDOMXULDOCUMENT diff --git a/mozilla/docshell/base/nsDocShell.cpp b/mozilla/docshell/base/nsDocShell.cpp index a14e1d17fb6..21a127ba4c6 100644 --- a/mozilla/docshell/base/nsDocShell.cpp +++ b/mozilla/docshell/base/nsDocShell.cpp @@ -294,7 +294,7 @@ nsDocShell::SetDocument(nsIDOMDocument *aDOMDoc, nsIDOMElement *aRootNode) nsCOMPtr outStreamListener; NS_ENSURE_SUCCESS(doc->StartDocumentLoad("view", dummyChannel, nsnull, NS_STATIC_CAST(nsIContentViewerContainer*, this), - getter_AddRefs(outStreamListener)), NS_ERROR_FAILURE); + getter_AddRefs(outStreamListener), PR_TRUE), NS_ERROR_FAILURE); NS_ENSURE_SUCCESS(FireStartDocumentLoad(mDocLoader, uri, "load"), NS_ERROR_FAILURE); // (5) hook up the document and its content diff --git a/mozilla/docshell/base/nsWebShell.cpp b/mozilla/docshell/base/nsWebShell.cpp index 0d75c3e9fa9..1018c1bb3fe 100644 --- a/mozilla/docshell/base/nsWebShell.cpp +++ b/mozilla/docshell/base/nsWebShell.cpp @@ -1673,8 +1673,12 @@ NS_IMETHODIMP nsWebShell::SetDocument(nsIDOMDocument *aDOMDoc, nsCOMPtr outStreamListener; // a valid pointer is required for the returned stream listener // XXX: warning: magic cookie! should get string "view delayedContentLoad" // from somewhere, maybe nsIHTMLDocument? - NS_ENSURE_SUCCESS(doc->StartDocumentLoad("view delayedContentLoad", dummyChannel, nsnull, NS_STATIC_CAST(nsIContentViewerContainer*, (nsIWebShell*)this), - getter_AddRefs(outStreamListener)), + NS_ENSURE_SUCCESS(doc->StartDocumentLoad("view delayedContentLoad", + dummyChannel, + nsnull, + NS_STATIC_CAST(nsIContentViewerContainer*, (nsIWebShell*)this), + getter_AddRefs(outStreamListener), + PR_TRUE), NS_ERROR_FAILURE); NS_ENSURE_SUCCESS(OnStartDocumentLoad(mDocLoader, uri, "load"), NS_ERROR_FAILURE); diff --git a/mozilla/dom/public/coreDom/nsIDOMNSDocument.h b/mozilla/dom/public/coreDom/nsIDOMNSDocument.h index 9bada4ea910..3a3f9f9ccb5 100644 --- a/mozilla/dom/public/coreDom/nsIDOMNSDocument.h +++ b/mozilla/dom/public/coreDom/nsIDOMNSDocument.h @@ -48,6 +48,8 @@ public: NS_IMETHOD CreateElementWithNameSpace(const nsString& aTagName, const nsString& aNameSpace, nsIDOMElement** aReturn)=0; NS_IMETHOD CreateRange(nsIDOMRange** aReturn)=0; + + NS_IMETHOD Load(const nsString& aUrl, const nsString& aMimeType)=0; }; @@ -57,6 +59,7 @@ public: NS_IMETHOD GetCharacterSet(nsString& aCharacterSet); \ NS_IMETHOD CreateElementWithNameSpace(const nsString& aTagName, const nsString& aNameSpace, nsIDOMElement** aReturn); \ NS_IMETHOD CreateRange(nsIDOMRange** aReturn); \ + NS_IMETHOD Load(const nsString& aUrl, const nsString& aMimeType); \ @@ -66,6 +69,7 @@ public: NS_IMETHOD GetCharacterSet(nsString& aCharacterSet) { return _to GetCharacterSet(aCharacterSet); } \ NS_IMETHOD CreateElementWithNameSpace(const nsString& aTagName, const nsString& aNameSpace, nsIDOMElement** aReturn) { return _to CreateElementWithNameSpace(aTagName, aNameSpace, aReturn); } \ NS_IMETHOD CreateRange(nsIDOMRange** aReturn) { return _to CreateRange(aReturn); } \ + NS_IMETHOD Load(const nsString& aUrl, const nsString& aMimeType) { return _to Load(aUrl, aMimeType); } \ #endif // nsIDOMNSDocument_h__ diff --git a/mozilla/dom/public/idl/coreDom/Document.idl b/mozilla/dom/public/idl/coreDom/Document.idl index a6a8e8f3cef..813ab122f07 100644 --- a/mozilla/dom/public/idl/coreDom/Document.idl +++ b/mozilla/dom/public/idl/coreDom/Document.idl @@ -66,5 +66,7 @@ interface NSDocument { Element createElementWithNameSpace(in DOMString tagName, in DOMString nameSpace) raises(DOMException); - Range createRange(); -}; + Range createRange(); + void load(in DOMString url, + in DOMString mimeType); +}; \ No newline at end of file diff --git a/mozilla/dom/public/nsDOMPropEnums.h b/mozilla/dom/public/nsDOMPropEnums.h index d316140590c..7989cf87bee 100644 --- a/mozilla/dom/public/nsDOMPropEnums.h +++ b/mozilla/dom/public/nsDOMPropEnums.h @@ -717,6 +717,7 @@ enum nsDOMProp { NS_DOM_PROP_NSDOCUMENT_CREATEELEMENTWITHNAMESPACE, NS_DOM_PROP_NSDOCUMENT_CREATERANGE, NS_DOM_PROP_NSDOCUMENT_HEIGHT, + NS_DOM_PROP_NSDOCUMENT_LOAD, NS_DOM_PROP_NSDOCUMENT_WIDTH, NS_DOM_PROP_NSHTMLANCHORELEMENT_HASH, NS_DOM_PROP_NSHTMLANCHORELEMENT_HOST, diff --git a/mozilla/dom/public/nsDOMPropNames.h b/mozilla/dom/public/nsDOMPropNames.h index a248576013a..6be9e8fed02 100644 --- a/mozilla/dom/public/nsDOMPropNames.h +++ b/mozilla/dom/public/nsDOMPropNames.h @@ -716,6 +716,7 @@ "nsdocument.createelementwithnamespace", \ "nsdocument.createrange", \ "nsdocument.height", \ + "nsdocument.load", \ "nsdocument.width", \ "nshtmlanchorelement.hash", \ "nshtmlanchorelement.host", \ diff --git a/mozilla/dom/src/coreDOM/nsJSDocument.cpp b/mozilla/dom/src/coreDOM/nsJSDocument.cpp index c59c94c5304..fca8629830a 100644 --- a/mozilla/dom/src/coreDOM/nsJSDocument.cpp +++ b/mozilla/dom/src/coreDOM/nsJSDocument.cpp @@ -1016,6 +1016,54 @@ NSDocumentCreateRange(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsv } +// +// Native method Load +// +PR_STATIC_CALLBACK(JSBool) +NSDocumentLoad(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMDocument *privateThis = (nsIDOMDocument*)nsJSUtils::nsGetNativeThis(cx, obj); + nsCOMPtr nativeThis; + nsresult result = NS_OK; + if (NS_OK != privateThis->QueryInterface(kINSDocumentIID, getter_AddRefs(nativeThis))) { + return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_WRONG_TYPE_ERR); + } + + nsAutoString b0; + nsAutoString b1; + // If there's no private data, this must be the prototype, so ignore + if (!nativeThis) { + return JS_TRUE; + } + + { + *rval = JSVAL_NULL; + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + result = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_NSDOCUMENT_LOAD, PR_FALSE); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + if (argc < 2) { + return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR); + } + + nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]); + nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]); + + result = nativeThis->Load(b0, b1); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + *rval = JSVAL_VOID; + } + + return JS_TRUE; +} + + /***********************************************************************/ // // class for Document @@ -1074,6 +1122,7 @@ static JSFunctionSpec DocumentMethods[] = {"getElementById", DocumentGetElementById, 1}, {"createElementWithNameSpace", NSDocumentCreateElementWithNameSpace, 2}, {"createRange", NSDocumentCreateRange, 0}, + {"load", NSDocumentLoad, 2}, {0} }; diff --git a/mozilla/htmlparser/src/nsExpatTokenizer.cpp b/mozilla/htmlparser/src/nsExpatTokenizer.cpp index c4c651d6240..cd23fb53ce0 100644 --- a/mozilla/htmlparser/src/nsExpatTokenizer.cpp +++ b/mozilla/htmlparser/src/nsExpatTokenizer.cpp @@ -178,7 +178,7 @@ void nsExpatTokenizer::SetupExpatParser(void) { nsExpatTokenizer::nsExpatTokenizer(nsString* aURL) : nsHTMLTokenizer() { NS_INIT_REFCNT(); mBytesParsed = 0; - mState = new XMLParserState; + mState = new XMLParserState; mState->tokenRecycler = (CTokenRecycler*)GetTokenRecycler(); mState->cdataToken = nsnull; mState->parser = nsnull; diff --git a/mozilla/htmlparser/src/nsIParser.h b/mozilla/htmlparser/src/nsIParser.h index de0e75d1eab..363b800a2ba 100644 --- a/mozilla/htmlparser/src/nsIParser.h +++ b/mozilla/htmlparser/src/nsIParser.h @@ -149,6 +149,7 @@ class nsIParser : public nsISupports { * @param aCommand -- ptrs to string that contains command * @return nada */ + virtual void GetCommand(nsString& aCommand)=0; virtual void SetCommand(const char* aCommand)=0; virtual void SetCommand(eParserCommands aParserCommand)=0; diff --git a/mozilla/htmlparser/src/nsParser.cpp b/mozilla/htmlparser/src/nsParser.cpp index 429c95f93f6..7fad8041901 100644 --- a/mozilla/htmlparser/src/nsParser.cpp +++ b/mozilla/htmlparser/src/nsParser.cpp @@ -305,6 +305,11 @@ nsIParserFilter * nsParser::SetParserFilter(nsIParserFilter * aFilter) } +void nsParser::GetCommand(nsString& aCommand) +{ + aCommand = mCommandStr; +} + /** * Call this method once you've created a parser, and want to instruct it * about the command which caused the parser to be constructed. For example, @@ -319,6 +324,7 @@ void nsParser::SetCommand(const char* aCommand){ if(theCommand.Equals(kViewSourceCommand)) mCommand=eViewSource; else mCommand=eViewNormal; + mCommandStr.AssignWithConversion(aCommand); } /** diff --git a/mozilla/htmlparser/src/nsParser.h b/mozilla/htmlparser/src/nsParser.h index 174af7183b0..1f6b71a6e43 100644 --- a/mozilla/htmlparser/src/nsParser.h +++ b/mozilla/htmlparser/src/nsParser.h @@ -133,6 +133,7 @@ CLASS_EXPORT_HTMLPARS nsParser : public nsIParser, public nsIStreamListener { * @param aContentSink -- ptr to content sink that will receive output * @return ptr to previously set contentsink (usually null) */ + virtual void GetCommand(nsString& aCommand); virtual void SetCommand(const char* aCommand); virtual void SetCommand(eParserCommands aParserCommand); @@ -384,6 +385,7 @@ protected: nsresult mInternalState; CObserverService mObserverService; PRBool mObserversEnabled; + nsString mCommandStr; public: MOZ_TIMER_DECLARE(mParseTime) diff --git a/mozilla/layout/base/public/nsIDocument.h b/mozilla/layout/base/public/nsIDocument.h index b0720f16373..260c215d0ef 100644 --- a/mozilla/layout/base/public/nsIDocument.h +++ b/mozilla/layout/base/public/nsIDocument.h @@ -57,6 +57,8 @@ class nsIWordBreaker; class nsIDOMSelection; class nsIChannel; class nsIPrincipal; +class nsIDOMDocument; +class nsIDOMDocumentType; // IID for the nsIDocument interface #define NS_IDOCUMENT_IID \ @@ -102,7 +104,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) = 0; + nsIStreamListener **aDocListener, + PRBool aReset) = 0; NS_IMETHOD StopDocumentLoad() = 0; @@ -340,6 +343,12 @@ extern NS_LAYOUT nsresult extern NS_LAYOUT nsresult NS_NewDocumentFragment(nsIDOMDocumentFragment** aInstancePtrResult, nsIDocument* aOwnerDocument); +extern NS_LAYOUT nsresult + NS_NewDOMDocument(nsIDOMDocument** aInstancePtrResult, + const nsString& aNamespaceURI, + const nsString& aQualifiedName, + nsIDOMDocumentType* aDoctype, + nsIURI* aBaseURI); // Note: The buffer passed into NewPostData(...) becomes owned by the IPostData // instance and is freed when the instance is destroyed... diff --git a/mozilla/layout/base/src/nsDocument.cpp b/mozilla/layout/base/src/nsDocument.cpp index 36b7f96fc8a..6db30dc52f2 100644 --- a/mozilla/layout/base/src/nsDocument.cpp +++ b/mozilla/layout/base/src/nsDocument.cpp @@ -369,7 +369,7 @@ class nsDOMImplementation : public nsIDOMDOMImplementation, public nsIScriptObjectOwner { public: - nsDOMImplementation(); + nsDOMImplementation(nsIDocument* aDocument = nsnull); virtual ~nsDOMImplementation(); NS_DECL_ISUPPORTS @@ -392,12 +392,14 @@ public: protected: void *mScriptObject; + nsCOMPtr mDocument; }; -nsDOMImplementation::nsDOMImplementation() +nsDOMImplementation::nsDOMImplementation(nsIDocument* aDocument) { NS_INIT_REFCNT(); mScriptObject = nsnull; + mDocument = aDocument; } nsDOMImplementation::~nsDOMImplementation() @@ -477,12 +479,20 @@ nsDOMImplementation::CreateDocument(const nsString& aNamespaceURI, const nsString& aQualifiedName, nsIDOMDocumentType* aDoctype, nsIDOMDocument** aReturn) -{ - NS_ENSURE_ARG_POINTER(aReturn); - +{ + NS_ENSURE_ARG_POINTER(aReturn); + + nsresult rv = NS_OK; *aReturn = nsnull; - return NS_OK; + nsIURI* baseURI; + rv = mDocument->GetBaseURL(baseURI); + if (NS_FAILED(rv)) return rv; + + NS_NewDOMDocument(aReturn, aNamespaceURI, aQualifiedName, aDoctype, baseURI); + + NS_RELEASE(baseURI); + return rv; } NS_IMETHODIMP @@ -788,7 +798,7 @@ NS_IMPL_RELEASE(nsDocument) nsresult nsDocument::Init() { nsresult rv = NS_NewHeapArena(&mArena, nsnull); - + NS_NewNameSpaceManager(&mNameSpaceManager); return rv; } @@ -878,9 +888,13 @@ nsDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) + nsIStreamListener **aDocListener, + PRBool aReset) { - return Reset(aChannel, aLoadGroup); + nsresult rv = NS_OK; + if (aReset) + rv = Reset(aChannel, aLoadGroup); + return rv; } NS_IMETHODIMP @@ -1894,7 +1908,7 @@ nsDocument::GetImplementation(nsIDOMDOMImplementation** aImplementation) { // For now, create a new implementation every time. This shouldn't // be a high bandwidth operation - nsDOMImplementation* impl = new nsDOMImplementation(); + nsDOMImplementation* impl = new nsDOMImplementation(this); if (nsnull == impl) { return NS_ERROR_OUT_OF_MEMORY; } @@ -2188,6 +2202,12 @@ nsDocument::GetHeight(PRInt32* aHeight) return result; } +NS_IMETHODIMP +nsDocument::Load (const nsString& aUrl, const nsString& aMimeType) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + // // nsIDOMNode methods // diff --git a/mozilla/layout/base/src/nsDocument.h b/mozilla/layout/base/src/nsDocument.h index 5f9487d6e56..3f711b2ff8d 100644 --- a/mozilla/layout/base/src/nsDocument.h +++ b/mozilla/layout/base/src/nsDocument.h @@ -128,7 +128,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener); + nsIStreamListener **aDocListener, + PRBool aReset = PR_TRUE); NS_IMETHOD StopDocumentLoad(); @@ -357,6 +358,7 @@ public: NS_IMETHOD CreateRange(nsIDOMRange** aReturn); NS_IMETHOD GetWidth(PRInt32* aWidth); NS_IMETHOD GetHeight(PRInt32* aHeight); + NS_IMETHOD Load (const nsString& aUrl, const nsString& aMimeType); // nsIDOMNode interface NS_DECL_IDOMNODE diff --git a/mozilla/layout/build/nsLayoutDLF.cpp b/mozilla/layout/build/nsLayoutDLF.cpp index 69242bcb624..be928c86559 100644 --- a/mozilla/layout/build/nsLayoutDLF.cpp +++ b/mozilla/layout/build/nsLayoutDLF.cpp @@ -405,7 +405,7 @@ nsLayoutDLF::CreateDocument(const char* aCommand, // Initialize the document to begin loading the data. An // nsIStreamListener connected to the parser is returned in // aDocListener. - rv = doc->StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer, aDocListener); + rv = doc->StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer, aDocListener, PR_TRUE); if (NS_FAILED(rv)) break; @@ -496,7 +496,7 @@ nsLayoutDLF::CreateRDFDocument(const char* aCommand, * An nsIStreamListener connected to the parser is returned in * aDocListener. */ - rv = doc->StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer, aDocListener); + rv = doc->StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer, aDocListener, PR_TRUE); if (NS_SUCCEEDED(rv)) { /* * Bind the document to the Content Viewer... diff --git a/mozilla/layout/doc/layout.css b/mozilla/layout/doc/layout.css index c8db6fb72e2..3a385b05e4d 100644 --- a/mozilla/layout/doc/layout.css +++ b/mozilla/layout/doc/layout.css @@ -1,3 +1,5 @@ +@namespace xlink url("http://www.w3.org/1999/xlink"); + Documentation { display: block; font-family: Verdana, sans-serif; @@ -56,12 +58,12 @@ Components { } /* workaround for above rule not working */ -*[xlink:type] { +*[xlink|type] { cursor: pointer; } /* workaround for above rule not working */ -*[xlink:show="replace"] { +*[xlink|show="replace"] { cursor: pointer; } diff --git a/mozilla/layout/events/src/nsDOMEvent.cpp b/mozilla/layout/events/src/nsDOMEvent.cpp index 26967114d4f..d4fdf6f5a1d 100644 --- a/mozilla/layout/events/src/nsDOMEvent.cpp +++ b/mozilla/layout/events/src/nsDOMEvent.cpp @@ -46,7 +46,8 @@ static char* mEventNames[] = { nsDOMEvent::nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent) { mPresContext = aPresContext; - NS_ADDREF(mPresContext); + if (mPresContext) + NS_ADDREF(mPresContext); mEvent = aEvent; mTarget = nsnull; mText = nsnull; @@ -82,7 +83,7 @@ nsDOMEvent::nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent) { } nsDOMEvent::~nsDOMEvent() { - NS_RELEASE(mPresContext); + NS_IF_RELEASE(mPresContext); NS_IF_RELEASE(mTarget); NS_IF_RELEASE(mTextRange); @@ -127,7 +128,7 @@ NS_METHOD nsDOMEvent::GetTarget(nsIDOMNode** aTarget) } nsIEventStateManager *manager; - nsIContent *targetContent; + nsIContent *targetContent; if (NS_OK == mPresContext->GetEventStateManager(&manager)) { manager->GetEventTargetContent(mEvent, &targetContent); diff --git a/mozilla/layout/html/document/src/nsHTMLDocument.cpp b/mozilla/layout/html/document/src/nsHTMLDocument.cpp index d222b0b04cc..662aae28e41 100644 --- a/mozilla/layout/html/document/src/nsHTMLDocument.cpp +++ b/mozilla/layout/html/document/src/nsHTMLDocument.cpp @@ -392,7 +392,8 @@ nsHTMLDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) + nsIStreamListener **aDocListener, + PRBool aReset) { PRBool needsParser=PR_TRUE; if (aCommand) @@ -406,8 +407,8 @@ nsHTMLDocument::StartDocumentLoad(const char* aCommand, nsresult rv = nsDocument::StartDocumentLoad(aCommand, aChannel, aLoadGroup, - aContainer, - aDocListener); + aContainer, + aDocListener, aReset); if (NS_FAILED(rv)) { return rv; } nsAutoString charset; charset.AssignWithConversion("ISO-8859-1"); // fallback value in case webShell return error diff --git a/mozilla/layout/html/document/src/nsHTMLDocument.h b/mozilla/layout/html/document/src/nsHTMLDocument.h index b75171f8252..5046052191d 100644 --- a/mozilla/layout/html/document/src/nsHTMLDocument.h +++ b/mozilla/layout/html/document/src/nsHTMLDocument.h @@ -68,7 +68,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener); + nsIStreamListener **aDocListener, + PRBool aReset = PR_TRUE); NS_IMETHOD StopDocumentLoad(); diff --git a/mozilla/layout/html/document/src/nsImageDocument.cpp b/mozilla/layout/html/document/src/nsImageDocument.cpp index ae9a057f7be..0b097f96222 100644 --- a/mozilla/layout/html/document/src/nsImageDocument.cpp +++ b/mozilla/layout/html/document/src/nsImageDocument.cpp @@ -62,7 +62,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener); + nsIStreamListener **aDocListener, + PRBool aReset = PR_TRUE); nsresult CreateSyntheticDocument(); @@ -178,12 +179,13 @@ nsImageDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) + nsIStreamListener **aDocListener, + PRBool aReset) { nsresult rv = nsDocument::StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer, - aDocListener); + aDocListener, aReset); if (NS_FAILED(rv)) { return rv; } diff --git a/mozilla/layout/html/tests/makefile.win b/mozilla/layout/html/tests/makefile.win index 17d3c7e0084..a0db14e21f6 100644 --- a/mozilla/layout/html/tests/makefile.win +++ b/mozilla/layout/html/tests/makefile.win @@ -69,6 +69,9 @@ LLIBS= \ !ifdef MOZ_SVG $(DIST)\lib\raptorsvgbase_s.lib \ $(DIST)\lib\raptorsvgcontent_s.lib \ +!endif +!ifdef MOZ_XSL + $(DIST)\lib\raptorxsldoc_s.lib \ !endif $(DIST)\lib\img32$(VERSION_NUMBER).lib \ $(DIST)\lib\util.lib \ diff --git a/mozilla/layout/xml/document/src/nsXMLContentSink.cpp b/mozilla/layout/xml/document/src/nsXMLContentSink.cpp index 27b95619942..7c0e4e3b257 100644 --- a/mozilla/layout/xml/document/src/nsXMLContentSink.cpp +++ b/mozilla/layout/xml/document/src/nsXMLContentSink.cpp @@ -1132,7 +1132,7 @@ nsXMLContentSink::LoadXSLStyleSheet(nsIURI* aUrl, const nsString& aType) // Hook up the content sink to the parser's output and ask the parser // to start parsing the URL specified by aURL. parser->SetContentSink(sink); - nsAutoString utf8("UTF-8"); + nsAutoString utf8(NS_ConvertASCIItoUCS2("UTF-8")); mDocument->SetDocumentCharacterSet(utf8); parser->SetDocumentCharset(utf8, kCharsetFromDocTypeDefault); parser->Parse(aUrl); @@ -1281,7 +1281,7 @@ nsXMLContentSink::AddProcessingInstruction(const nsIParserNode& aNode) result = ProcessCSSStyleLink(node, href, alternate.EqualsWithConversion("yes"), title, type, media); #else - result = ProcessStyleLink(node, href, alternate.Equals("yes"), + result = ProcessStyleLink(node, href, alternate.EqualsWithConversion("yes"), title, type, media); #endif } diff --git a/mozilla/layout/xml/document/src/nsXMLDocument.cpp b/mozilla/layout/xml/document/src/nsXMLDocument.cpp index ae7903d8ab7..091d380d4fd 100644 --- a/mozilla/layout/xml/document/src/nsXMLDocument.cpp +++ b/mozilla/layout/xml/document/src/nsXMLDocument.cpp @@ -65,6 +65,7 @@ #include "nsCharsetDetectionAdaptorCID.h" #include "nsICharsetAlias.h" #include "nsIParserFilter.h" +#include "nsNetUtil.h" // XXX The XML world depends on the html atoms @@ -92,6 +93,7 @@ static PRBool gInitDetector = PR_FALSE; static PRBool gPlugDetector = PR_FALSE; static NS_DEFINE_IID(kIParserFilterIID, NS_IPARSERFILTER_IID); +static const char* kLoadAsData = "loadAsData"; // ================================================================== // = @@ -121,6 +123,20 @@ MyPrefChangedCallback(const char*aPrefName, void* instance_data) return 0; } +NS_LAYOUT nsresult +NS_NewDOMDocument(nsIDOMDocument** aInstancePtrResult, + const nsString& aNamespaceURI, + const nsString& aQualifiedName, + nsIDOMDocumentType* aDoctype, + nsIURI* aBaseURI) +{ + // XXX Ignoring the namespace, qualified name, and doctype parameters for now + nsXMLDocument* doc = new nsXMLDocument(aBaseURI); + if (doc == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + return doc->QueryInterface(kIDOMDocumentIID, (void**) aInstancePtrResult); +} + NS_LAYOUT nsresult NS_NewXMLDocument(nsIDocument** aInstancePtrResult) @@ -131,13 +147,15 @@ NS_NewXMLDocument(nsIDocument** aInstancePtrResult) return doc->QueryInterface(kIDocumentIID, (void**) aInstancePtrResult); } -nsXMLDocument::nsXMLDocument() +nsXMLDocument::nsXMLDocument(nsIURI* aBaseURI) { mParser = nsnull; mAttrStyleSheet = nsnull; mInlineStyleSheet = nsnull; mCSSLoader = nsnull; - + mDocumentURL = aBaseURI; + NS_IF_ADDREF(mDocumentURL); + #ifdef XSL mTransformMediator = nsnull; #endif @@ -234,17 +252,47 @@ nsXMLDocument::GetContentType(nsString& aContentType) const return NS_OK; } +NS_IMETHODIMP +nsXMLDocument::Load(const nsString& aUrl, const nsString& aMimeType) +{ + nsCOMPtr channel; + nsCOMPtr uri; + nsresult rv = NS_OK; + + // Create a new URI and channel + rv = NS_NewURI(getter_AddRefs(uri), aUrl, mDocumentURL); + if (NS_FAILED(rv)) return rv; + rv = NS_OpenURI(getter_AddRefs(channel), uri, nsnull); + if (NS_FAILED(rv)) return rv; + + // Prepare for loading the XML document "into oneself" + nsCOMPtr listener; + if (NS_FAILED(rv = StartDocumentLoad(kLoadAsData, channel, + nsnull, nsnull, + getter_AddRefs(listener), + PR_FALSE))) { + NS_ERROR("nsXMLDocument::Load: Failed to start the document load."); + return rv; + } + + // Start an asynchronous read of the XML document + rv = channel->AsyncRead(listener, nsnull); + + return rv; +} + NS_IMETHODIMP nsXMLDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) + nsIStreamListener **aDocListener, + PRBool aReset) { nsresult rv = nsDocument::StartDocumentLoad(aCommand, aChannel, aLoadGroup, aContainer, - aDocListener); + aDocListener, aReset); if (NS_FAILED(rv)) { return rv; } @@ -525,8 +573,20 @@ nsXMLDocument::StartDocumentLoad(const char* aCommand, NS_IMETHODIMP nsXMLDocument::EndLoad() { + nsAutoString cmd; + mParser->GetCommand(cmd); NS_IF_RELEASE(mParser); - return nsDocument::EndLoad(); + if (cmd.EqualsWithConversion(kLoadAsData)) { + // Generate a document load event for the case when an XML document was loaded + // as pure data without any presentation attached to it. + nsCOMPtr scriptGlobal; + nsEventStatus status = nsEventStatus_eIgnore; + nsMouseEvent event; + event.eventStructType = NS_EVENT; + event.message = NS_PAGE_LOAD; + HandleDOMEvent(nsnull, &event, nsnull, NS_EVENT_FLAG_INIT, &status); + } + return nsDocument::EndLoad(); } NS_IMETHODIMP diff --git a/mozilla/layout/xml/document/src/nsXMLDocument.h b/mozilla/layout/xml/document/src/nsXMLDocument.h index cf7eed48e4b..714ead02267 100644 --- a/mozilla/layout/xml/document/src/nsXMLDocument.h +++ b/mozilla/layout/xml/document/src/nsXMLDocument.h @@ -40,7 +40,7 @@ class nsXMLDocument : public nsMarkupDocument, public nsIHTMLContentContainer { public: - nsXMLDocument(); + nsXMLDocument(nsIURI* aBaseURI = nsnull); virtual ~nsXMLDocument(); NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr); @@ -54,7 +54,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener); + nsIStreamListener **aDocListener, + PRBool aReset = PR_TRUE); NS_IMETHOD EndLoad(); @@ -82,7 +83,7 @@ public: NS_IMETHOD GetElementsByTagNameNS(const nsString& aNamespaceURI, const nsString& aLocalName, nsIDOMNodeList** aReturn); - + NS_IMETHOD Load(const nsString& aUrl, const nsString& aMimeType); // nsIXMLDocument interface NS_IMETHOD GetContentById(const nsString& aName, nsIContent** aContent); diff --git a/mozilla/layout/xsl/document/src/nsTransformMediator.cpp b/mozilla/layout/xsl/document/src/nsTransformMediator.cpp index 6dfc9871bfd..c974b7d98a3 100644 --- a/mozilla/layout/xsl/document/src/nsTransformMediator.cpp +++ b/mozilla/layout/xsl/document/src/nsTransformMediator.cpp @@ -71,7 +71,7 @@ nsTransformMediator::~nsTransformMediator() static nsresult ConstructProgID(nsString& aProgID, const nsString& aMimeType) { - aProgID = kTransformerProgIDPrefix; + aProgID.AssignWithConversion(kTransformerProgIDPrefix); aProgID.Append(aMimeType); return NS_OK; diff --git a/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp b/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp index c4c651d6240..cd23fb53ce0 100644 --- a/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp +++ b/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp @@ -178,7 +178,7 @@ void nsExpatTokenizer::SetupExpatParser(void) { nsExpatTokenizer::nsExpatTokenizer(nsString* aURL) : nsHTMLTokenizer() { NS_INIT_REFCNT(); mBytesParsed = 0; - mState = new XMLParserState; + mState = new XMLParserState; mState->tokenRecycler = (CTokenRecycler*)GetTokenRecycler(); mState->cdataToken = nsnull; mState->parser = nsnull; diff --git a/mozilla/parser/htmlparser/src/nsIParser.h b/mozilla/parser/htmlparser/src/nsIParser.h index de0e75d1eab..363b800a2ba 100644 --- a/mozilla/parser/htmlparser/src/nsIParser.h +++ b/mozilla/parser/htmlparser/src/nsIParser.h @@ -149,6 +149,7 @@ class nsIParser : public nsISupports { * @param aCommand -- ptrs to string that contains command * @return nada */ + virtual void GetCommand(nsString& aCommand)=0; virtual void SetCommand(const char* aCommand)=0; virtual void SetCommand(eParserCommands aParserCommand)=0; diff --git a/mozilla/parser/htmlparser/src/nsParser.cpp b/mozilla/parser/htmlparser/src/nsParser.cpp index 429c95f93f6..7fad8041901 100644 --- a/mozilla/parser/htmlparser/src/nsParser.cpp +++ b/mozilla/parser/htmlparser/src/nsParser.cpp @@ -305,6 +305,11 @@ nsIParserFilter * nsParser::SetParserFilter(nsIParserFilter * aFilter) } +void nsParser::GetCommand(nsString& aCommand) +{ + aCommand = mCommandStr; +} + /** * Call this method once you've created a parser, and want to instruct it * about the command which caused the parser to be constructed. For example, @@ -319,6 +324,7 @@ void nsParser::SetCommand(const char* aCommand){ if(theCommand.Equals(kViewSourceCommand)) mCommand=eViewSource; else mCommand=eViewNormal; + mCommandStr.AssignWithConversion(aCommand); } /** diff --git a/mozilla/parser/htmlparser/src/nsParser.h b/mozilla/parser/htmlparser/src/nsParser.h index 174af7183b0..1f6b71a6e43 100644 --- a/mozilla/parser/htmlparser/src/nsParser.h +++ b/mozilla/parser/htmlparser/src/nsParser.h @@ -133,6 +133,7 @@ CLASS_EXPORT_HTMLPARS nsParser : public nsIParser, public nsIStreamListener { * @param aContentSink -- ptr to content sink that will receive output * @return ptr to previously set contentsink (usually null) */ + virtual void GetCommand(nsString& aCommand); virtual void SetCommand(const char* aCommand); virtual void SetCommand(eParserCommands aParserCommand); @@ -384,6 +385,7 @@ protected: nsresult mInternalState; CObserverService mObserverService; PRBool mObserversEnabled; + nsString mCommandStr; public: MOZ_TIMER_DECLARE(mParseTime) diff --git a/mozilla/rdf/content/src/nsXULDocument.cpp b/mozilla/rdf/content/src/nsXULDocument.cpp index 33e7f04f18c..638428a3240 100644 --- a/mozilla/rdf/content/src/nsXULDocument.cpp +++ b/mozilla/rdf/content/src/nsXULDocument.cpp @@ -693,7 +693,8 @@ nsXULDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener) + nsIStreamListener **aDocListener, + PRBool aReset) { nsresult rv; mCommand.AssignWithConversion(aCommand); @@ -2686,6 +2687,13 @@ nsXULDocument::GetHeight(PRInt32* aHeight) return NS_ERROR_NOT_IMPLEMENTED; } +NS_IMETHODIMP +nsXULDocument::Load(const nsString& aUrl, const nsString& aMimeType) +{ + NS_NOTREACHED("nsXULDocument::Load"); + return NS_ERROR_NOT_IMPLEMENTED; +} + //---------------------------------------------------------------------- // // nsIDOMXULDocument interface diff --git a/mozilla/rdf/content/src/nsXULDocument.h b/mozilla/rdf/content/src/nsXULDocument.h index 7b146f24889..dcc88edd6da 100644 --- a/mozilla/rdf/content/src/nsXULDocument.h +++ b/mozilla/rdf/content/src/nsXULDocument.h @@ -116,7 +116,8 @@ public: nsIChannel* aChannel, nsILoadGroup* aLoadGroup, nsISupports* aContainer, - nsIStreamListener **aDocListener); + nsIStreamListener **aDocListener, + PRBool aReset); NS_IMETHOD StopDocumentLoad(); @@ -343,6 +344,7 @@ public: NS_IMETHOD CreateRange(nsIDOMRange** aRange); NS_IMETHOD GetWidth(PRInt32* aWidth); NS_IMETHOD GetHeight(PRInt32* aHeight); + NS_IMETHOD Load (const nsString& aUrl, const nsString& aMimeType); // nsIDOMXULDocument interface NS_DECL_IDOMXULDOCUMENT diff --git a/mozilla/webshell/src/nsWebShell.cpp b/mozilla/webshell/src/nsWebShell.cpp index 0d75c3e9fa9..1018c1bb3fe 100644 --- a/mozilla/webshell/src/nsWebShell.cpp +++ b/mozilla/webshell/src/nsWebShell.cpp @@ -1673,8 +1673,12 @@ NS_IMETHODIMP nsWebShell::SetDocument(nsIDOMDocument *aDOMDoc, nsCOMPtr outStreamListener; // a valid pointer is required for the returned stream listener // XXX: warning: magic cookie! should get string "view delayedContentLoad" // from somewhere, maybe nsIHTMLDocument? - NS_ENSURE_SUCCESS(doc->StartDocumentLoad("view delayedContentLoad", dummyChannel, nsnull, NS_STATIC_CAST(nsIContentViewerContainer*, (nsIWebShell*)this), - getter_AddRefs(outStreamListener)), + NS_ENSURE_SUCCESS(doc->StartDocumentLoad("view delayedContentLoad", + dummyChannel, + nsnull, + NS_STATIC_CAST(nsIContentViewerContainer*, (nsIWebShell*)this), + getter_AddRefs(outStreamListener), + PR_TRUE), NS_ERROR_FAILURE); NS_ENSURE_SUCCESS(OnStartDocumentLoad(mDocLoader, uri, "load"), NS_ERROR_FAILURE);