Add JS Error reporter to XBL Prototype compilation, and prevent crashes when the compilation fails r=hyatt sr=brendan

This commit is contained in:
timeless%mac.com 2002-01-15 15:40:57 +00:00
Родитель 993c1ff2fa
Коммит 1a821ac847
2 изменённых файлов: 62 добавлений и 22 удалений

Просмотреть файл

@ -104,6 +104,31 @@ nsXBLDocGlobalObject::~nsXBLDocGlobalObject()
NS_IMPL_ISUPPORTS2(nsXBLDocGlobalObject, nsIScriptGlobalObject, nsIScriptObjectPrincipal)
void JS_DLL_CALLBACK
XBL_ProtoErrorReporter(JSContext *cx,
const char *message,
JSErrorReport *report)
{
// Make an nsIScriptError and populate it with information from
// this error.
nsCOMPtr<nsIScriptError>
errorObject(do_CreateInstance("@mozilla.org/scripterror;1"));
nsCOMPtr<nsIConsoleService>
consoleService(do_GetService("@mozilla.org/consoleservice;1"));
if (errorObject && consoleService) {
PRUint32 column = report->uctokenptr - report->uclinebuf;
errorObject->Init
(report->ucmessage, NS_ConvertUTF8toUCS2(report->filename).get(),
NS_REINTERPRET_CAST(const PRUnichar*, report->uclinebuf),
report->lineno, column, report->flags,
"xbl javascript"
);
consoleService->LogMessage(errorObject);
}
}
//----------------------------------------------------------------------
//
// nsIScriptGlobalObject methods
@ -113,6 +138,10 @@ NS_IMETHODIMP
nsXBLDocGlobalObject::SetContext(nsIScriptContext *aContext)
{
mScriptContext = aContext;
if (mScriptContext) {
JSContext* cx = (JSContext *)mScriptContext->GetNativeContext();
JS_SetErrorReporter(cx, XBL_ProtoErrorReporter);
}
return NS_OK;
}
@ -132,6 +161,7 @@ nsXBLDocGlobalObject::GetContext(nsIScriptContext **aContext)
JSContext *cx = (JSContext *)mScriptContext->GetNativeContext();
JS_SetErrorReporter(cx, XBL_ProtoErrorReporter);
mJSObject = ::JS_NewObject(cx, &gSharedGlobalClass, nsnull, nsnull);
if (!mJSObject)
return NS_ERROR_OUT_OF_MEMORY;
@ -413,3 +443,4 @@ nsresult NS_NewXBLDocumentInfo(nsIDocument* aDocument, nsIXBLDocumentInfo** aRes
NS_IF_ADDREF(*aResult);
return NS_OK;
}

Просмотреть файл

@ -218,12 +218,12 @@ nsXBLProtoImplProperty::CompileMember(nsIScriptContext* aContext, const nsCStrin
nsAutoString getter(mGetterText);
nsMemory::Free(mGetterText);
mGetterText = nsnull;
nsCAutoString functionUri;
if (!getter.IsEmpty() && aClassObject) {
nsCAutoString functionUri;
functionUri.Assign(aClassStr);
functionUri += ".";
functionUri.AppendWithConversion(mName);
functionUri += " (getter)";
functionUri = aClassStr;
functionUri += NS_LITERAL_CSTRING(".");
functionUri += NS_ConvertUCS2toUTF8(mName);
functionUri += NS_LITERAL_CSTRING(" (getter)");
rv = aContext->CompileFunction(aClassObject,
nsCAutoString("onget"),
0,
@ -233,27 +233,32 @@ nsXBLProtoImplProperty::CompileMember(nsIScriptContext* aContext, const nsCStrin
0,
PR_FALSE,
(void **) &mJSGetterObject);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
mJSAttributes |= JSPROP_GETTER | JSPROP_SHARED;
if (mJSGetterObject) {
if (mJSGetterObject && NS_SUCCEEDED(rv)) {
mJSAttributes |= JSPROP_GETTER | JSPROP_SHARED;
// Root the compiled prototype script object.
JSContext* cx = NS_REINTERPRET_CAST(JSContext*,
aContext->GetNativeContext());
if (!cx) return NS_ERROR_UNEXPECTED;
rv = AddJSGCRoot(&mJSGetterObject, "nsXBLProtoImplProperty::mJSGetterObject");
if (NS_FAILED(rv)) return rv;
rv = (cx)
? AddJSGCRoot(&mJSGetterObject, "nsXBLProtoImplProperty::mJSGetterObject")
: NS_ERROR_UNEXPECTED;
}
if (NS_FAILED(rv)) {
mJSGetterObject = nsnull;
mJSAttributes &= ~JSPROP_GETTER;
/*chaining to return failure*/
}
} // if getter is not empty
nsresult rvG=rv;
// Do we have a setter?
nsAutoString setter(mSetterText);
nsMemory::Free(mSetterText);
mSetterText = nsnull;
if (!setter.IsEmpty() && aClassObject) {
nsCAutoString functionUri (aClassStr);
functionUri += ".";
functionUri.AppendWithConversion(mName);
functionUri += " (setter)";
functionUri = aClassStr;
functionUri += NS_LITERAL_CSTRING(".");
functionUri += NS_ConvertUCS2toUTF8(mName);
functionUri += NS_LITERAL_CSTRING(" (setter)");
rv = aContext->CompileFunction(aClassObject,
nsCAutoString("onset"),
1,
@ -263,17 +268,21 @@ nsXBLProtoImplProperty::CompileMember(nsIScriptContext* aContext, const nsCStrin
0,
PR_FALSE,
(void **) &mJSSetterObject);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
mJSAttributes |= JSPROP_SETTER | JSPROP_SHARED;
if (mJSSetterObject) {
if (mJSSetterObject && NS_SUCCEEDED(rv)) {
mJSAttributes |= JSPROP_SETTER | JSPROP_SHARED;
// Root the compiled prototype script object.
JSContext* cx = NS_REINTERPRET_CAST(JSContext*,
aContext->GetNativeContext());
if (!cx) return NS_ERROR_UNEXPECTED;
rv = AddJSGCRoot(&mJSSetterObject, "nsXBLProtoImplProperty::mJSSetterObject");
if (NS_FAILED(rv)) return rv;
rv = (cx)
? AddJSGCRoot(&mJSSetterObject, "nsXBLProtoImplProperty::mJSSetterObject")
: NS_ERROR_UNEXPECTED;
}
if (NS_FAILED(rv)) {
mJSSetterObject = nsnull;
mJSAttributes &= ~JSPROP_SETTER;
/*chaining to return failure*/
}
} // if setter wasn't empty....
return rv;
return NS_SUCCEEDED(rv) ? rvG : rv;
}