mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-07 00:08:39 +09:00
1283712 - Part 6: Add xpc::ErrorBase, xpc::ErrorNote, and xpc::ErrorReport.mNotes.
This commit is contained in:
parent
f8f673d986
commit
0982e6f95b
2 changed files with 142 additions and 42 deletions
|
|
@ -169,10 +169,32 @@ 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;
|
||||
|
|
@ -182,12 +204,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);
|
||||
|
||||
|
|
@ -197,10 +213,20 @@ 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
|
||||
|
|
@ -225,6 +251,59 @@ 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()
|
||||
{
|
||||
|
|
@ -233,25 +312,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,
|
||||
|
|
@ -285,6 +346,17 @@ 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,
|
||||
|
|
|
|||
|
|
@ -515,13 +515,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)
|
||||
{}
|
||||
|
|
@ -530,6 +567,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();
|
||||
|
|
@ -544,18 +582,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…
Add table
Add a link
Reference in a new issue