mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-04 13:07:52 +00:00
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:
parent
6980bbd4e0
commit
2478390f1c
@ -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
|
||||
*/
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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!");
|
||||
|
@ -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__ */
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -167,6 +167,9 @@ private:
|
||||
|
||||
const nsCatalogData* mCatalogData; // weak
|
||||
nsString mURISpec;
|
||||
|
||||
// Used for error reporting.
|
||||
PRUint64 mWindowID;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user