Bug 1215140 P1 Add an nsIConsoleReportCollector interface to support navigation channel logging. r=bz

This commit is contained in:
Ben Kelly 2015-10-29 19:53:25 -07:00
parent 8eb10da71a
commit 98d6940a9c
4 changed files with 240 additions and 0 deletions

View File

@ -0,0 +1,83 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/ConsoleReportCollector.h"
#include "nsNetUtil.h"
namespace mozilla {
NS_IMPL_ISUPPORTS(ConsoleReportCollector, nsIConsoleReportCollector)
ConsoleReportCollector::ConsoleReportCollector()
: mMutex("mozilla::ConsoleReportCollector")
{
}
void
ConsoleReportCollector::AddConsoleReport(uint32_t aErrorFlags,
const nsACString& aCategory,
nsContentUtils::PropertiesFile aPropertiesFile,
const nsACString& aSourceFileURI,
uint32_t aLineNumber,
uint32_t aColumnNumber,
const nsACString& aMessageName,
const nsTArray<nsString>& aStringParams)
{
// any thread
MutexAutoLock lock(mMutex);
mPendingReports.AppendElement(PendingReport(aErrorFlags, aCategory,
aPropertiesFile, aSourceFileURI,
aLineNumber, aColumnNumber,
aMessageName, aStringParams));
}
void
ConsoleReportCollector::FlushConsoleReports(nsIDocument* aDocument)
{
MOZ_ASSERT(NS_IsMainThread());
MutexAutoLock lock(mMutex);
for (uint32_t i = 0; i < mPendingReports.Length(); ++i) {
PendingReport& report = mPendingReports[i];
// It would be nice if we did not have to do this since ReportToConsole()
// just turns around and converts it back to a spec.
nsCOMPtr<nsIURI> uri;
nsresult rv = NS_NewURI(getter_AddRefs(uri), report.mSourceFileURI);
if (NS_FAILED(rv)) {
continue;
}
// Convert back from nsTArray<nsString> to the char16_t** format required
// by our l10n libraries and ReportToConsole. (bug 1219762)
UniquePtr<char16_t*> params;
uint32_t paramsLength = report.mStringParams.Length();
if (paramsLength > 0) {
params.reset(new char16_t*[paramsLength]);
for (uint32_t j = 0; j < paramsLength; ++j) {
params.get()[j] = const_cast<char16_t*>(report.mStringParams[j].get());
}
}
nsContentUtils::ReportToConsole(report.mErrorFlags, report.mCategory,
aDocument, report.mPropertiesFile,
report.mMessageName.get(),
const_cast<const char16_t**>(params.get()),
paramsLength, uri, EmptyString(),
report.mLineNumber, report.mColumnNumber);
}
mPendingReports.Clear();
}
ConsoleReportCollector::~ConsoleReportCollector()
{
}
} // namespace mozilla

View File

@ -0,0 +1,73 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_ConsoleReportCollector_h
#define mozilla_ConsoleReportCollector_h
#include "mozilla/Mutex.h"
#include "nsIConsoleReportCollector.h"
#include "nsTArray.h"
namespace mozilla {
class ConsoleReportCollector final : public nsIConsoleReportCollector
{
public:
ConsoleReportCollector();
void
AddConsoleReport(uint32_t aErrorFlags, const nsACString& aCategory,
nsContentUtils::PropertiesFile aPropertiesFile,
const nsACString& aSourceFileURI,
uint32_t aLineNumber, uint32_t aColumnNumber,
const nsACString& aMessageName,
const nsTArray<nsString>& aStringParams) override;
void
FlushConsoleReports(nsIDocument* aDocument) override;
private:
~ConsoleReportCollector();
struct PendingReport
{
PendingReport(uint32_t aErrorFlags, const nsACString& aCategory,
nsContentUtils::PropertiesFile aPropertiesFile,
const nsACString& aSourceFileURI, uint32_t aLineNumber,
uint32_t aColumnNumber, const nsACString& aMessageName,
const nsTArray<nsString>& aStringParams)
: mErrorFlags(aErrorFlags)
, mCategory(aCategory)
, mPropertiesFile(aPropertiesFile)
, mSourceFileURI(aSourceFileURI)
, mLineNumber(aLineNumber)
, mColumnNumber(aColumnNumber)
, mMessageName(aMessageName)
, mStringParams(aStringParams)
{ }
const uint32_t mErrorFlags;
const nsCString mCategory;
const nsContentUtils::PropertiesFile mPropertiesFile;
const nsCString mSourceFileURI;
const uint32_t mLineNumber;
const uint32_t mColumnNumber;
const nsCString mMessageName;
const nsTArray<nsString> mStringParams;
};
Mutex mMutex;
// protected by mMutex
nsTArray<PendingReport> mPendingReports;
public:
NS_DECL_THREADSAFE_ISUPPORTS
};
} // namespace mozilla
#endif // mozilla_ConsoleReportCollector_h

View File

@ -84,6 +84,7 @@ EXPORTS += [
'nsHostObjectURI.h',
'nsIAnimationObserver.h',
'nsIAttribute.h',
'nsIConsoleReportCollector.h',
'nsIContent.h',
'nsIContentInlines.h',
'nsIContentIterator.h',
@ -142,6 +143,7 @@ if CONFIG['MOZ_WEBRTC']:
]
EXPORTS.mozilla += [
'ConsoleReportCollector.h',
'CORSMode.h',
'FeedWriterEnabled.h',
'TextInputProcessor.h',
@ -222,6 +224,7 @@ UNIFIED_SOURCES += [
'ChromeUtils.cpp',
'Comment.cpp',
'Console.cpp',
'ConsoleReportCollector.cpp',
'Crypto.cpp',
'DirectionalityUtils.cpp',
'DocumentFragment.cpp',

View File

@ -0,0 +1,81 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef nsIConsoleReportCollector_h
#define nsIConsoleReportCollector_h
#include "nsContentUtils.h"
#include "nsISupports.h"
#include "nsTArrayForwardDeclare.h"
class nsACString;
class nsIDocument;
class nsString;
#define NS_NSICONSOLEREPORTCOLLECTOR_IID \
{0xdd98a481, 0xd2c4, 0x4203, {0x8d, 0xfa, 0x85, 0xbf, 0xd7, 0xdc, 0xd7, 0x05}}
// An interface for saving reports until we can flush them to the correct
// window at a later time.
class NS_NO_VTABLE nsIConsoleReportCollector : public nsISupports
{
public:
NS_DECLARE_STATIC_IID_ACCESSOR(NS_NSICONSOLEREPORTCOLLECTOR_IID)
// Add a pending report to be later displayed on the console. This may be
// called from any thread.
//
// aErrorFlags A nsIScriptError flags value.
// aCategory Name of module reporting error.
// aPropertiesFile Properties file containing localized message.
// aSourceFileURI The URI of the script generating the error. Must be a URI
// spec.
// aLineNumber The line number where the error was generated. May be 0 if
// the line number is not known.
// aColumnNumber The column number where the error was generated. May be 0
// if the line number is not known.
// aMessageName The name of the localized message contained in the
// properties file.
// aStringParams An array of nsString parameters to use when localizing the
// message.
virtual void
AddConsoleReport(uint32_t aErrorFlags, const nsACString& aCategory,
nsContentUtils::PropertiesFile aPropertiesFile,
const nsACString& aSourceFileURI, uint32_t aLineNumber,
uint32_t aColumnNumber, const nsACString& aMessageName,
const nsTArray<nsString>& aStringParams) = 0;
// A version of AddConsoleReport() that accepts the message parameters
// as variable nsString arguments. Note, the parameters must be exactly
// nsString and not another string class. All other args the same as
// AddConsoleReport().
template<typename... Params>
void
AddConsoleReport(uint32_t aErrorFlags, const nsACString& aCategory,
nsContentUtils::PropertiesFile aPropertiesFile,
const nsACString& aSourceFileURI, uint32_t aLineNumber,
uint32_t aColumnNumber, const nsACString& aMessageName,
Params... aParams)
{
nsTArray<nsString> params;
mozilla::dom::StringArrayAppender::Append(params, sizeof...(Params), aParams...);
AddConsoleReport(aErrorFlags, aCategory, aPropertiesFile, aSourceFileURI,
aLineNumber, aColumnNumber, aMessageName, params);
}
// Flush all pending reports to the console.
//
// aDocument An optional document representing where to flush the
// reports. If provided, then the corresponding window's
// web console will get the reports. Otherwise the reports
// go to the browser console.
virtual void
FlushConsoleReports(nsIDocument* aDocument) = 0;
};
NS_DEFINE_STATIC_IID_ACCESSOR(nsIConsoleReportCollector, NS_NSICONSOLEREPORTCOLLECTOR_IID)
#endif // nsIConsoleReportCollector_h