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);