mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
Bug 1283712 - Part 6: Add xpc::ErrorBase, xpc::ErrorNote, and xpc::ErrorReport.mNotes. r=bholley
This commit is contained in:
parent
4fe038b2c5
commit
b025ee6d4e
@ -171,10 +171,31 @@ nsXPConnect::IsISupportsDescendant(nsIInterfaceInfo* info)
|
||||
return found;
|
||||
}
|
||||
|
||||
void
|
||||
xpc::ErrorBase::Init(JSErrorBase* aReport)
|
||||
{
|
||||
if (!aReport->filename)
|
||||
mFileName.SetIsVoid(true);
|
||||
else
|
||||
mFileName.AssignWithConversion(aReport->filename);
|
||||
|
||||
mLineNumber = aReport->lineno;
|
||||
mColumn = aReport->column;
|
||||
}
|
||||
|
||||
void
|
||||
xpc::ErrorNote::Init(JSErrorNotes::Note* aNote)
|
||||
{
|
||||
xpc::ErrorBase::Init(aNote);
|
||||
|
||||
ErrorNoteToMessageString(aNote, mErrorMsg);
|
||||
}
|
||||
|
||||
void
|
||||
xpc::ErrorReport::Init(JSErrorReport* aReport, const char* aToStringResult,
|
||||
bool aIsChrome, uint64_t aWindowID)
|
||||
{
|
||||
xpc::ErrorBase::Init(aReport);
|
||||
mCategory = aIsChrome ? NS_LITERAL_CSTRING("chrome javascript")
|
||||
: NS_LITERAL_CSTRING("content javascript");
|
||||
mWindowID = aWindowID;
|
||||
@ -184,12 +205,6 @@ xpc::ErrorReport::Init(JSErrorReport* aReport, const char* aToStringResult,
|
||||
AppendUTF8toUTF16(aToStringResult, mErrorMsg);
|
||||
}
|
||||
|
||||
if (!aReport->filename) {
|
||||
mFileName.SetIsVoid(true);
|
||||
} else {
|
||||
mFileName.AssignWithConversion(aReport->filename);
|
||||
}
|
||||
|
||||
mSourceLine.Assign(aReport->linebuf(), aReport->linebufLength());
|
||||
const JSErrorFormatString* efs = js::GetErrorMessage(nullptr, aReport->errorNumber);
|
||||
|
||||
@ -199,10 +214,19 @@ xpc::ErrorReport::Init(JSErrorReport* aReport, const char* aToStringResult,
|
||||
mErrorMsgName.AssignASCII(efs->name);
|
||||
}
|
||||
|
||||
mLineNumber = aReport->lineno;
|
||||
mColumn = aReport->column;
|
||||
mFlags = aReport->flags;
|
||||
mIsMuted = aReport->isMuted;
|
||||
|
||||
if (aReport->notes) {
|
||||
if (!mNotes.SetLength(aReport->notes->length(), fallible))
|
||||
return;
|
||||
|
||||
size_t i = 0;
|
||||
for (auto&& note : *aReport->notes) {
|
||||
mNotes.ElementAt(i).Init(note.get());
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -227,6 +251,55 @@ xpc::ErrorReport::Init(JSContext* aCx, mozilla::dom::Exception* aException,
|
||||
|
||||
static LazyLogModule gJSDiagnostics("JSDiagnostics");
|
||||
|
||||
void
|
||||
xpc::ErrorBase::AppendErrorDetailsTo(nsCString& error)
|
||||
{
|
||||
error.Append(NS_LossyConvertUTF16toASCII(mFileName));
|
||||
error.AppendLiteral(", line ");
|
||||
error.AppendInt(mLineNumber, 10);
|
||||
error.AppendLiteral(": ");
|
||||
error.Append(NS_LossyConvertUTF16toASCII(mErrorMsg));
|
||||
}
|
||||
|
||||
void
|
||||
xpc::ErrorNote::LogToStderr()
|
||||
{
|
||||
if (!nsContentUtils::DOMWindowDumpEnabled())
|
||||
return;
|
||||
|
||||
nsAutoCString error;
|
||||
error.AssignLiteral("JavaScript note: ");
|
||||
AppendErrorDetailsTo(error);
|
||||
|
||||
fprintf(stderr, "%s\n", error.get());
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
void
|
||||
xpc::ErrorReport::LogToStderr()
|
||||
{
|
||||
if (!nsContentUtils::DOMWindowDumpEnabled())
|
||||
return;
|
||||
|
||||
nsAutoCString error;
|
||||
error.AssignLiteral("JavaScript ");
|
||||
if (JSREPORT_IS_STRICT(mFlags))
|
||||
error.AppendLiteral("strict ");
|
||||
if (JSREPORT_IS_WARNING(mFlags))
|
||||
error.AppendLiteral("warning: ");
|
||||
else
|
||||
error.AppendLiteral("error: ");
|
||||
AppendErrorDetailsTo(error);
|
||||
|
||||
fprintf(stderr, "%s\n", error.get());
|
||||
fflush(stderr);
|
||||
|
||||
for (size_t i = 0, len = mNotes.Length(); i < len; i++) {
|
||||
ErrorNote& note = mNotes[i];
|
||||
note.LogToStderr();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
xpc::ErrorReport::LogToConsole()
|
||||
{
|
||||
@ -235,25 +308,7 @@ xpc::ErrorReport::LogToConsole()
|
||||
void
|
||||
xpc::ErrorReport::LogToConsoleWithStack(JS::HandleObject aStack)
|
||||
{
|
||||
// Log to stdout.
|
||||
if (nsContentUtils::DOMWindowDumpEnabled()) {
|
||||
nsAutoCString error;
|
||||
error.AssignLiteral("JavaScript ");
|
||||
if (JSREPORT_IS_STRICT(mFlags))
|
||||
error.AppendLiteral("strict ");
|
||||
if (JSREPORT_IS_WARNING(mFlags))
|
||||
error.AppendLiteral("warning: ");
|
||||
else
|
||||
error.AppendLiteral("error: ");
|
||||
error.Append(NS_LossyConvertUTF16toASCII(mFileName));
|
||||
error.AppendLiteral(", line ");
|
||||
error.AppendInt(mLineNumber, 10);
|
||||
error.AppendLiteral(": ");
|
||||
error.Append(NS_LossyConvertUTF16toASCII(mErrorMsg));
|
||||
|
||||
fprintf(stderr, "%s\n", error.get());
|
||||
fflush(stderr);
|
||||
}
|
||||
LogToStderr();
|
||||
|
||||
MOZ_LOG(gJSDiagnostics,
|
||||
JSREPORT_IS_WARNING(mFlags) ? LogLevel::Warning : LogLevel::Error,
|
||||
@ -287,6 +342,16 @@ xpc::ErrorReport::LogToConsoleWithStack(JS::HandleObject aStack)
|
||||
|
||||
}
|
||||
|
||||
/* static */
|
||||
void
|
||||
xpc::ErrorNote::ErrorNoteToMessageString(JSErrorNotes::Note* aNote,
|
||||
nsAString& aString)
|
||||
{
|
||||
aString.Truncate();
|
||||
if (aNote->message())
|
||||
aString.Append(NS_ConvertUTF8toUTF16(aNote->message().c_str()));
|
||||
}
|
||||
|
||||
/* static */
|
||||
void
|
||||
xpc::ErrorReport::ErrorReportToMessageString(JSErrorReport* aReport,
|
||||
|
@ -532,13 +532,50 @@ AllowCPOWsInAddon(const nsACString& addonId, bool allow);
|
||||
bool
|
||||
ExtraWarningsForSystemJS();
|
||||
|
||||
class ErrorReport {
|
||||
class ErrorBase {
|
||||
public:
|
||||
nsString mErrorMsg;
|
||||
nsString mFileName;
|
||||
uint32_t mLineNumber;
|
||||
uint32_t mColumn;
|
||||
|
||||
ErrorBase() : mLineNumber(0)
|
||||
, mColumn(0)
|
||||
{}
|
||||
|
||||
void Init(JSErrorBase* aReport);
|
||||
|
||||
void AppendErrorDetailsTo(nsCString& error);
|
||||
};
|
||||
|
||||
class ErrorNote : public ErrorBase {
|
||||
public:
|
||||
void Init(JSErrorNotes::Note* aNote);
|
||||
|
||||
// Produce an error event message string from the given JSErrorNotes::Note.
|
||||
// This may produce an empty string if aNote doesn't have a message
|
||||
// attached.
|
||||
static void ErrorNoteToMessageString(JSErrorNotes::Note* aNote,
|
||||
nsAString& aString);
|
||||
|
||||
// Log the error note to the stderr.
|
||||
void LogToStderr();
|
||||
};
|
||||
|
||||
class ErrorReport : public ErrorBase {
|
||||
public:
|
||||
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ErrorReport);
|
||||
|
||||
nsTArray<ErrorNote> mNotes;
|
||||
|
||||
nsCString mCategory;
|
||||
nsString mSourceLine;
|
||||
nsString mErrorMsgName;
|
||||
uint64_t mWindowID;
|
||||
uint32_t mFlags;
|
||||
bool mIsMuted;
|
||||
|
||||
ErrorReport() : mWindowID(0)
|
||||
, mLineNumber(0)
|
||||
, mColumn(0)
|
||||
, mFlags(0)
|
||||
, mIsMuted(false)
|
||||
{}
|
||||
@ -547,6 +584,7 @@ class ErrorReport {
|
||||
bool aIsChrome, uint64_t aWindowID);
|
||||
void Init(JSContext* aCx, mozilla::dom::Exception* aException,
|
||||
bool aIsChrome, uint64_t aWindowID);
|
||||
|
||||
// Log the error report to the console. Which console will depend on the
|
||||
// window id it was initialized with.
|
||||
void LogToConsole();
|
||||
@ -561,18 +599,8 @@ class ErrorReport {
|
||||
static void ErrorReportToMessageString(JSErrorReport* aReport,
|
||||
nsAString& aString);
|
||||
|
||||
public:
|
||||
|
||||
nsCString mCategory;
|
||||
nsString mErrorMsgName;
|
||||
nsString mErrorMsg;
|
||||
nsString mFileName;
|
||||
nsString mSourceLine;
|
||||
uint64_t mWindowID;
|
||||
uint32_t mLineNumber;
|
||||
uint32_t mColumn;
|
||||
uint32_t mFlags;
|
||||
bool mIsMuted;
|
||||
// Log the error report to the stderr.
|
||||
void LogToStderr();
|
||||
|
||||
private:
|
||||
~ErrorReport() {}
|
||||
|
Loading…
Reference in New Issue
Block a user