Bug 606498 - Make sure the new nsIScriptError2 is used in all possible places- part 1; r=bzbarsky,dbaron,mrbkap sr=jst a=blocking2.0

This commit is contained in:
Mihai Sucan 2010-12-20 12:21:58 -04:00
parent 6980bbd4e0
commit 2478390f1c
13 changed files with 158 additions and 60 deletions

View File

@ -700,6 +700,15 @@ public:
return mRemovedFromDocShell ? GetInnerWindowInternal() : mWindow;
}
/**
* Return the outer window ID.
*/
PRUint64 OuterWindowID()
{
nsPIDOMWindow *window = GetWindow();
return window ? window->WindowID() : 0;
}
/**
* Get the script loader for this document
*/

View File

@ -398,18 +398,24 @@ nsXMLDocument::Load(const nsAString& aUrl, PRBool *aReturn)
nsAutoString error;
error.AssignLiteral("Cross site loading using document.load is no "
"longer supported. Use XMLHttpRequest instead.");
nsCOMPtr<nsIScriptError> errorObject =
nsCOMPtr<nsIScriptError2> errorObject =
do_CreateInstance(NS_SCRIPTERROR_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = errorObject->Init(error.get(), NS_ConvertUTF8toUTF16(spec).get(),
nsnull, 0, 0, nsIScriptError::warningFlag,
"DOM");
rv = errorObject->InitWithWindowID(error.get(), NS_ConvertUTF8toUTF16(spec).get(),
nsnull, 0, 0, nsIScriptError::warningFlag,
"DOM",
callingDoc ?
callingDoc->OuterWindowID() :
this->OuterWindowID());
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIConsoleService> consoleService =
do_GetService(NS_CONSOLESERVICE_CONTRACTID);
if (consoleService) {
consoleService->LogMessage(errorObject);
nsCOMPtr<nsIScriptError> logError = do_QueryInterface(errorObject);
if (consoleService && logError) {
consoleService->LogMessage(logError);
}
return NS_ERROR_DOM_SECURITY_ERR;

View File

@ -1681,12 +1681,12 @@ PrintWarningOnConsole(JSContext *cx, const char *stringBundleProperty)
}
nsCOMPtr<nsIConsoleService> consoleService
(do_GetService("@mozilla.org/consoleservice;1"));
(do_GetService(NS_CONSOLESERVICE_CONTRACTID));
if (!consoleService) {
return;
}
nsCOMPtr<nsIScriptError> scriptError =
nsCOMPtr<nsIScriptError2> scriptError =
do_CreateInstance(NS_SCRIPTERROR_CONTRACTID);
if (!scriptError) {
return;
@ -1709,15 +1709,19 @@ PrintWarningOnConsole(JSContext *cx, const char *stringBundleProperty)
}
}
}
nsresult rv = scriptError->Init(msg.get(),
sourcefile.get(),
EmptyString().get(),
lineno,
0, // column for error is not available
nsIScriptError::warningFlag,
"DOM:HTML");
nsresult rv = scriptError->InitWithWindowID(msg.get(),
sourcefile.get(),
EmptyString().get(),
lineno,
0, // column for error is not available
nsIScriptError::warningFlag,
"DOM:HTML",
nsJSUtils::GetCurrentlyRunningCodeWindowID(cx));
if (NS_SUCCEEDED(rv)){
consoleService->LogMessage(scriptError);
nsCOMPtr<nsIScriptError> logError = do_QueryInterface(scriptError);
consoleService->LogMessage(logError);
}
}

View File

@ -175,3 +175,26 @@ nsJSUtils::GetDynamicScriptContext(JSContext *aContext)
{
return GetScriptContextFromJSContext(aContext);
}
PRUint64
nsJSUtils::GetCurrentlyRunningCodeWindowID(JSContext *aContext)
{
if (!aContext)
return 0;
PRUint64 windowID = 0;
JSObject *jsGlobal = JS_GetGlobalForScopeChain(aContext);
if (jsGlobal) {
nsIScriptGlobalObject *scriptGlobal = GetStaticScriptGlobal(aContext,
jsGlobal);
if (scriptGlobal) {
nsCOMPtr<nsPIDOMWindow> win = do_QueryInterface(scriptGlobal);
if (win)
windowID = win->GetOuterWindow()->WindowID();
}
}
return windowID;
}

View File

@ -69,6 +69,16 @@ public:
static nsIScriptGlobalObject *GetDynamicScriptGlobal(JSContext *aContext);
static nsIScriptContext *GetDynamicScriptContext(JSContext *aContext);
/**
* Retrieve the outer window ID based on the given JSContext.
*
* @param JSContext aContext
* The JSContext from which you want to find the outer window ID.
*
* @returns PRUint64 the outer window ID.
*/
static PRUint64 GetCurrentlyRunningCodeWindowID(JSContext *aContext);
};

View File

@ -597,6 +597,8 @@ DOMWorkerErrorReporter(JSContext* aCx,
return;
}
nsCOMPtr<nsIScriptError2> scriptError2(do_QueryInterface(scriptError));
nsAutoString message, filename, line;
PRUint32 lineNumber, columnNumber, flags, errorNumber;
@ -620,8 +622,11 @@ DOMWorkerErrorReporter(JSContext* aCx,
message.AssignWithConversion(aMessage);
}
rv = scriptError->Init(message.get(), filename.get(), line.get(), lineNumber,
columnNumber, flags, "DOM Worker javascript");
rv = scriptError2->InitWithWindowID(message.get(), filename.get(), line.get(),
lineNumber, columnNumber, flags,
"DOM Worker javascript",
worker->Pool()->WindowID());
if (NS_FAILED(rv)) {
return;
}

View File

@ -68,7 +68,8 @@ nsDOMWorkerPool::nsDOMWorkerPool(nsIScriptGlobalObject* aGlobalObject,
mParentDocument(aDocument),
mMonitor(nsnull),
mCanceled(PR_FALSE),
mSuspended(PR_FALSE)
mSuspended(PR_FALSE),
mWindowID(aDocument ? aDocument->OuterWindowID() : 0)
{
NS_ASSERTION(aGlobalObject, "Must have a global object!");
NS_ASSERTION(aDocument, "Must have a document!");

View File

@ -83,6 +83,10 @@ public:
return mMonitor;
}
const PRUint64 WindowID() const {
return mWindowID;
}
private:
virtual ~nsDOMWorkerPool();
@ -105,6 +109,8 @@ private:
PRPackedBool mCanceled;
PRPackedBool mSuspended;
const PRUint64 mWindowID;
};
#endif /* __NSDOMWORKERPOOL_H__ */

View File

@ -53,6 +53,7 @@
#include "WrapperFactory.h"
#include "XrayWrapper.h"
#include "nsNullPrincipal.h"
#include "nsJSUtils.h"
#ifdef MOZ_JSLOADER
#include "mozJSComponentLoader.h"
@ -2864,7 +2865,8 @@ nsXPCComponents_Utils::ReportError()
nsCOMPtr<nsIConsoleService> console(
do_GetService(NS_CONSOLESERVICE_CONTRACTID));
nsCOMPtr<nsIScriptError> scripterr(new nsScriptError());
nsCOMPtr<nsIScriptError2> scripterr(
do_CreateInstance(NS_SCRIPTERROR_CONTRACTID));
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID()));
if(!scripterr || !console || !xpc)
@ -2913,6 +2915,8 @@ nsXPCComponents_Utils::ReportError()
if(NS_FAILED(rv) || !argv)
return NS_OK;
const PRUint64 windowID = nsJSUtils::GetCurrentlyRunningCodeWindowID(cx);
JSErrorReport* err = JS_ErrorFromException(cx, argv[0]);
if(err)
{
@ -2922,19 +2926,20 @@ nsXPCComponents_Utils::ReportError()
PRUint32 column = err->uctokenptr - err->uclinebuf;
rv = scripterr->Init(reinterpret_cast<const PRUnichar*>
(err->ucmessage),
fileUni.get(),
reinterpret_cast<const PRUnichar*>
(err->uclinebuf),
err->lineno,
column,
err->flags,
"XPConnect JavaScript");
rv = scripterr->InitWithWindowID(reinterpret_cast<const PRUnichar*>
(err->ucmessage),
fileUni.get(),
reinterpret_cast<const PRUnichar*>
(err->uclinebuf),
err->lineno,
column,
err->flags,
"XPConnect JavaScript", windowID);
if(NS_FAILED(rv))
return NS_OK;
console->LogMessage(scripterr);
nsCOMPtr<nsIScriptError> logError = do_QueryInterface(scripterr);
console->LogMessage(logError);
return NS_OK;
}
@ -2958,14 +2963,17 @@ nsXPCComponents_Utils::ReportError()
frame->GetLineNumber(&lineNo);
}
rv = scripterr->Init(reinterpret_cast<const PRUnichar*>
(JS_GetStringChars(msgstr)),
NS_ConvertUTF8toUTF16(fileName).get(),
nsnull,
lineNo, 0,
0, "XPConnect JavaScript");
rv = scripterr->InitWithWindowID(reinterpret_cast<const PRUnichar*>
(JS_GetStringChars(msgstr)),
NS_ConvertUTF8toUTF16(fileName).get(),
nsnull,
lineNo, 0,
0, "XPConnect JavaScript", windowID);
if(NS_SUCCEEDED(rv))
console->LogMessage(scripterr);
{
nsCOMPtr<nsIScriptError> logError = do_QueryInterface(scripterr);
console->LogMessage(logError);
}
}
return NS_OK;

View File

@ -1,4 +1,5 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set ts=8 sw=4 et tw=78:
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
@ -50,6 +51,7 @@
#include "nsWrapperCache.h"
#include "WrapperFactory.h"
#include "AccessCheck.h"
#include "nsJSUtils.h"
//#define STRICT_CHECK_OF_UNICODE
#ifdef STRICT_CHECK_OF_UNICODE
@ -1801,7 +1803,7 @@ XPCConvert::JSErrorToXPCException(XPCCallContext& ccx,
nsIException** exceptn)
{
nsresult rv = NS_ERROR_FAILURE;
nsScriptError* data;
nsRefPtr<nsScriptError> data;
if(report)
{
nsAutoString bestMessage;
@ -1822,15 +1824,14 @@ XPCConvert::JSErrorToXPCException(XPCCallContext& ccx,
if(!data)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(data);
data->Init(bestMessage.get(),
NS_ConvertASCIItoUTF16(report->filename).get(),
(const PRUnichar *)report->uclinebuf, report->lineno,
report->uctokenptr - report->uclinebuf, report->flags,
"XPConnect JavaScript");
data->InitWithWindowID(bestMessage.get(),
NS_ConvertASCIItoUTF16(report->filename).get(),
(const PRUnichar *)report->uclinebuf, report->lineno,
report->uctokenptr - report->uclinebuf, report->flags,
"XPConnect JavaScript",
nsJSUtils::GetCurrentlyRunningCodeWindowID(ccx.GetJSContext()));
}
else
data = nsnull;
if(data)
{
@ -1839,10 +1840,8 @@ XPCConvert::JSErrorToXPCException(XPCCallContext& ccx,
rv = ConstructException(NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS,
formattedMsg.get(), ifaceName, methodName,
static_cast<nsIScriptError*>(data),
static_cast<nsIScriptError*>(data.get()),
exceptn, nsnull, nsnull);
NS_RELEASE(data);
}
else
{

View File

@ -1,4 +1,5 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set ts=8 sw=4 et tw=78:
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
@ -46,6 +47,7 @@
#include "nsWrapperCache.h"
#include "XPCWrapper.h"
#include "AccessCheck.h"
#include "nsJSUtils.h"
NS_IMPL_THREADSAFE_ISUPPORTS1(nsXPCWrappedJSClass, nsIXPCWrappedJSClass)
@ -1212,11 +1214,14 @@ nsXPCWrappedJSClass::CheckForException(XPCCallContext & ccx,
rv = location->GetFilename(getter_Copies(sourceName));
}
rv = scriptError->Init(newMessage.get(),
NS_ConvertASCIItoUTF16(sourceName).get(),
nsnull,
lineNumber, 0, 0,
"XPConnect JavaScript");
nsCOMPtr<nsIScriptError2> scriptError2 =
do_QueryInterface(scriptError);
rv = scriptError2->InitWithWindowID(newMessage.get(),
NS_ConvertASCIItoUTF16(sourceName).get(),
nsnull,
lineNumber, 0, 0,
"XPConnect JavaScript",
nsJSUtils::GetCurrentlyRunningCodeWindowID(cx));
if(NS_FAILED(rv))
scriptError = nsnull;
}

View File

@ -375,7 +375,8 @@ nsExpatDriver::nsExpatDriver()
mIsFinalChunk(PR_FALSE),
mInternalState(NS_OK),
mExpatBuffered(0),
mCatalogData(nsnull)
mCatalogData(nsnull),
mWindowID(0)
{
}
@ -943,11 +944,13 @@ nsExpatDriver::HandleError()
nsCOMPtr<nsIScriptError> serr(do_CreateInstance(NS_SCRIPTERROR_CONTRACTID));
nsresult rv = NS_ERROR_FAILURE;
if (serr) {
rv = serr->Init(description.get(),
mURISpec.get(),
mLastLine.get(),
lineNumber, colNumber,
nsIScriptError::errorFlag, "malformed-xml");
nsCOMPtr<nsIScriptError2> serr2(do_QueryInterface(serr));
rv = serr2->InitWithWindowID(description.get(),
mURISpec.get(),
mLastLine.get(),
lineNumber, colNumber,
nsIScriptError::errorFlag, "malformed-xml",
mWindowID);
}
// If it didn't initialize, we can't do any logging.
@ -1233,6 +1236,22 @@ nsExpatDriver::WillBuildModel(const CParserContext& aParserContext,
XML_SetBase(mExpatParser, mURISpec.get());
nsCOMPtr<nsIDocument> doc = do_QueryInterface(mOriginalSink->GetTarget());
if (doc) {
nsCOMPtr<nsPIDOMWindow> win = doc->GetWindow();
if (!win) {
PRBool aHasHadScriptHandlingObject;
nsIScriptGlobalObject *global =
doc->GetScriptHandlingObject(aHasHadScriptHandlingObject);
if (global) {
win = do_QueryInterface(global);
}
}
if (win) {
mWindowID = win->GetOuterWindow()->WindowID();
}
}
// Set up the callbacks
XML_SetXmlDeclHandler(mExpatParser, Driver_HandleXMLDeclaration);
XML_SetElementHandler(mExpatParser, Driver_HandleStartElement,

View File

@ -167,6 +167,9 @@ private:
const nsCatalogData* mCatalogData; // weak
nsString mURISpec;
// Used for error reporting.
PRUint64 mWindowID;
};
#endif