зеркало из https://github.com/mozilla/pjs.git
Add JS Error reporter to XBL Prototype compilation, and prevent crashes when the compilation fails r=hyatt sr=brendan
This commit is contained in:
Родитель
b6b97b56a8
Коммит
eb04181d23
|
@ -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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче