From 38317738695e2ff6030e576b1bf995a8c908b417 Mon Sep 17 00:00:00 2001 From: "doronr%us.ibm.com" Date: Fri, 18 Feb 2005 21:20:27 +0000 Subject: [PATCH] Bug 279057 - Implement hasFeature for XForms. Patch by smaug, r=bryner/sr=jst git-svn-id: svn://10.0.0.236/trunk@169427 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/content/base/src/nsScriptLoader.cpp | 113 ++++++++++++++++++ .../html/content/src/nsHTMLScriptElement.cpp | 1 - .../html/document/src/nsMediaDocument.h | 2 +- mozilla/content/xml/document/src/Makefile.in | 1 + mozilla/content/xtf/Makefile.in | 2 +- .../xul/document/public/nsIXULDocument.h | 2 + .../xul/document/src/nsXULDocument.cpp | 22 ++++ .../content/xul/document/src/nsXULDocument.h | 2 + 8 files changed, 142 insertions(+), 3 deletions(-) diff --git a/mozilla/content/base/src/nsScriptLoader.cpp b/mozilla/content/base/src/nsScriptLoader.cpp index dd5f482ac5e..bc40c52dbbf 100644 --- a/mozilla/content/base/src/nsScriptLoader.cpp +++ b/mozilla/content/base/src/nsScriptLoader.cpp @@ -61,6 +61,9 @@ #include "nsContentUtils.h" #include "nsUnicharUtils.h" #include "nsAutoPtr.h" +#include "nsIConsoleService.h" +#include "nsIScriptError.h" +#include "nsIStringBundle.h" static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID); @@ -519,6 +522,8 @@ nsScriptLoader::ProcessScriptElement(nsIScriptElement *aElement, request->mWasPending = PR_TRUE; request->mLoading = PR_TRUE; + request->mLineNo = aElement->GetScriptLineNumber(); + // Add the request to our pending requests list mPendingRequests.AppendObject(request); @@ -782,6 +787,98 @@ DetectByteOrderMark(const unsigned char* aBytes, PRInt32 aLen, nsCString& oChars return !oCharset.IsEmpty(); } +/** + * Report an error to the error console. + * @param aErrorName The name of a string in css.properties. + * @param aParams The parameters for that string in css.properties. + * @param aParamsLength The length of aParams. + * @param aErrorFlags Error/warning flag to pass to nsIScriptError::Init. + * + */ +static nsresult +ReportToConsole2(const PRUnichar* aMessageName, const PRUnichar **aParams, + PRUint32 aParamsLength, PRUint32 aErrorFlags, PRInt32* aLineNum, + const PRUnichar* aSrcFileName) +{ + nsresult rv; + nsCOMPtr consoleService = + do_GetService(NS_CONSOLESERVICE_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr errorObject = + do_CreateInstance(NS_SCRIPTERROR_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr stringBundleService = + do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr bundle; + rv = stringBundleService->CreateBundle( + "chrome://global/locale/layout/MediaDocument.properties", getter_AddRefs(bundle)); + NS_ENSURE_SUCCESS(rv, rv); + + nsXPIDLString errorText; + rv = bundle->FormatStringFromName(aMessageName, aParams, aParamsLength, + getter_Copies(errorText)); + NS_ENSURE_SUCCESS(rv, rv); + rv = errorObject->Init(errorText.get(), + aSrcFileName, /* file name */ + EmptyString().get(), /* source line */ + *aLineNum, /* line number */ + 0, /* column number */ + aErrorFlags, + "CSS Loader"); + NS_ENSURE_SUCCESS(rv, rv); + consoleService->LogMessage(errorObject); + + return NS_OK; +} + +static nsresult +ReportToConsole(nsIURI* aScriptURI, nsIURI* aDocumentURI, PRInt32* aLineNum) +{ + nsresult rv; + nsCOMPtr consoleService = + do_GetService(NS_CONSOLESERVICE_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr errorObject = + do_CreateInstance(NS_SCRIPTERROR_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr stringBundleService = + do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr bundle; + rv = stringBundleService->CreateBundle( + "chrome://global/locale/content/content.properties", getter_AddRefs(bundle)); + NS_ENSURE_SUCCESS(rv, rv); + + nsXPIDLString errorText; + + nsCAutoString url; + rv = aScriptURI->GetSpec(url); + NS_ConvertUTF8toUTF16 ucsString(url); + + const PRUnichar *strings[] = { ucsString.get() }; + + rv = bundle->FormatStringFromName(NS_LITERAL_STRING("InvalidScriptSrc").get(), + strings, 1, + getter_Copies(errorText)); + NS_ENSURE_SUCCESS(rv, rv); + + nsCAutoString documentUrl; + aDocumentURI->GetSpec(documentUrl); + NS_ConvertUTF8toUTF16 srcDocumentUrl(documentUrl); + + rv = errorObject->Init(errorText.get(), + srcDocumentUrl.get(), /* file name */ + EmptyString().get(), /* source line */ + *aLineNum, /* line number */ + 0, /* column number */ + nsIScriptError::warningFlag, + "Script Loader"); + NS_ENSURE_SUCCESS(rv, rv); + consoleService->LogMessage(errorObject); + + return NS_OK; +} NS_IMETHODIMP nsScriptLoader::OnStreamComplete(nsIStreamLoader* aLoader, @@ -798,6 +895,14 @@ nsScriptLoader::OnStreamComplete(nsIStreamLoader* aLoader, } if (NS_FAILED(aStatus)) { + + if (mDocument){ + // since aStatus shows we failed, a script file failed to load. + // Report this to the JavaScript console. + + ReportToConsole(request->mURI, mDocument->GetDocumentURI(), &request->mLineNo); + } + mPendingRequests.RemoveObject(request); FireScriptAvailable(aStatus, request, EmptyString()); ProcessPendingReqests(); @@ -824,6 +929,14 @@ nsScriptLoader::OnStreamComplete(nsIStreamLoader* aLoader, PRBool requestSucceeded; rv = httpChannel->GetRequestSucceeded(&requestSucceeded); if (NS_SUCCEEDED(rv) && !requestSucceeded) { + + if (mDocument){ + // since requestSucceeded is false, it means that the file couldn't be loaded. + // report this to the JavaScript console. + + ReportToConsole(request->mURI, mDocument->GetDocumentURI(), &request->mLineNo); + } + mPendingRequests.RemoveObject(request); FireScriptAvailable(NS_ERROR_NOT_AVAILABLE, request, EmptyString()); diff --git a/mozilla/content/html/content/src/nsHTMLScriptElement.cpp b/mozilla/content/html/content/src/nsHTMLScriptElement.cpp index e0c14662b16..71cc0bf55d9 100644 --- a/mozilla/content/html/content/src/nsHTMLScriptElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLScriptElement.cpp @@ -652,7 +652,6 @@ nsHTMLScriptElement::MaybeProcessScript() rv = loader->ProcessScriptElement(this, this); mEvaluating = PR_FALSE; } - if (rv == NS_CONTENT_SCRIPT_IS_EVENTHANDLER) { // If the script has NOT been executed yet then create a script diff --git a/mozilla/content/html/document/src/nsMediaDocument.h b/mozilla/content/html/document/src/nsMediaDocument.h index 00e4b3faf01..1194aeec369 100644 --- a/mozilla/content/html/document/src/nsMediaDocument.h +++ b/mozilla/content/html/document/src/nsMediaDocument.h @@ -43,7 +43,7 @@ #include "nsAutoPtr.h" #include "nsIStringBundle.h" -#define NSMEDIADOCUMENT_PROPERTIES_URI "chrome://communicator/locale/layout/MediaDocument.properties" +#define NSMEDIADOCUMENT_PROPERTIES_URI "chrome://global/locale/layout/MediaDocument.properties" class nsMediaDocument : public nsHTMLDocument { diff --git a/mozilla/content/xml/document/src/Makefile.in b/mozilla/content/xml/document/src/Makefile.in index 2886c77fd4b..e651b70642a 100644 --- a/mozilla/content/xml/document/src/Makefile.in +++ b/mozilla/content/xml/document/src/Makefile.in @@ -70,6 +70,7 @@ REQUIRES = xpcom \ unicharutil \ windowwatcher \ locale \ + xuldoc \ $(NULL) CPPSRCS = \ diff --git a/mozilla/content/xtf/Makefile.in b/mozilla/content/xtf/Makefile.in index 96f5d6194d6..5eb713ac7eb 100644 --- a/mozilla/content/xtf/Makefile.in +++ b/mozilla/content/xtf/Makefile.in @@ -42,6 +42,6 @@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk -DIRS = public src +DIRS = public src tests include $(topsrcdir)/config/rules.mk diff --git a/mozilla/content/xul/document/public/nsIXULDocument.h b/mozilla/content/xul/document/public/nsIXULDocument.h index b1a3a665711..8a640ed9d0b 100644 --- a/mozilla/content/xul/document/public/nsIXULDocument.h +++ b/mozilla/content/xul/document/public/nsIXULDocument.h @@ -50,6 +50,7 @@ #include "nsISupports.h" #include "nsString.h" +#include "nsIDocument.h" class nsForwardReference; class nsIAtom; @@ -160,5 +161,6 @@ public: // factory functions nsresult NS_NewXULDocument(nsIXULDocument** result); +nsresult NS_NewXULDocument(nsIDocument** result); #endif // nsIXULDocument_h___ diff --git a/mozilla/content/xul/document/src/nsXULDocument.cpp b/mozilla/content/xul/document/src/nsXULDocument.cpp index 7dcccc52031..f2d8892f380 100644 --- a/mozilla/content/xul/document/src/nsXULDocument.cpp +++ b/mozilla/content/xul/document/src/nsXULDocument.cpp @@ -467,6 +467,28 @@ NS_NewXULDocument(nsIXULDocument** result) } +nsresult +NS_NewXULDocument(nsIDocument** result) +{ + NS_PRECONDITION(result != nsnull, "null ptr"); + if (! result) + return NS_ERROR_NULL_POINTER; + + nsXULDocument* doc = new nsXULDocument(); + if (! doc) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(doc); + + nsresult rv; + if (NS_FAILED(rv = doc->Init())) { + NS_RELEASE(doc); + return rv; + } + + *result = doc; + return NS_OK; +} //---------------------------------------------------------------------- // // nsISupports interface diff --git a/mozilla/content/xul/document/src/nsXULDocument.h b/mozilla/content/xul/document/src/nsXULDocument.h index 31fe3ca3d61..b92064ad137 100644 --- a/mozilla/content/xul/document/src/nsXULDocument.h +++ b/mozilla/content/xul/document/src/nsXULDocument.h @@ -55,6 +55,7 @@ #include "nsIXULPrototypeDocument.h" #include "nsScriptLoader.h" #include "nsIStreamListener.h" +#include "nsIDocument.h" class nsIRDFResource; class nsIRDFService; @@ -173,6 +174,7 @@ protected: // Implementation methods friend nsresult NS_NewXULDocument(nsIXULDocument** aResult); + friend nsresult NS_NewXULDocument(nsIDocument** aResult); nsresult Init(void); nsresult StartLayout(void);