Bug 1117851 - Make GetCallingLocation take an nsA{,C}String. r=smaug
--- a/dom/base/EventSource.cpp
+++ b/dom/base/EventSource.cpp
@@ -196,21 +196,17 @@ EventSource::Init(nsISupports* aOwner,
nsCOMPtr<nsIPrincipal> principal = scriptPrincipal->GetPrincipal();
NS_ENSURE_STATE(principal);
mPrincipal = principal;
mWithCredentials = aWithCredentials;
// The conditional here is historical and not necessarily sane.
if (JSContext *cx = nsContentUtils::GetCurrentJSContext()) {
- const char *filename;
- if (nsJSUtils::GetCallingLocation(cx, &filename, &mScriptLine)) {
- mScriptFile.AssignASCII(filename);
- }
-
+ nsJSUtils::GetCallingLocation(cx, mScriptFile, &mScriptLine);
mInnerWindowID = nsJSUtils::GetCurrentlyRunningCodeInnerWindowID(cx);
}
// Get the load group for the page. When requesting we'll add ourselves to it.
// This way any pending requests will be automatically aborted if the user
// leaves the page.
nsresult rv;
nsIScriptContext* sc = GetContextForEventHandlers(&rv);
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -3359,22 +3359,17 @@ nsContentUtils::ReportToConsoleNonLocali
rv = CallGetService(NS_CONSOLESERVICE_CONTRACTID, &sConsoleService);
NS_ENSURE_SUCCESS(rv, rv);
}
nsAutoCString spec;
if (!aLineNumber) {
JSContext *cx = GetCurrentJSContext();
if (cx) {
- const char* filename;
- uint32_t lineno;
- if (nsJSUtils::GetCallingLocation(cx, &filename, &lineno)) {
- spec = filename;
- aLineNumber = lineno;
- }
+ nsJSUtils::GetCallingLocation(cx, spec, &aLineNumber);
}
}
if (spec.IsEmpty() && aURI)
aURI->GetSpec(spec);
nsCOMPtr<nsIScriptError> errorObject =
do_CreateInstance(NS_SCRIPTERROR_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
--- a/dom/base/nsJSTimeoutHandler.cpp
+++ b/dom/base/nsJSTimeoutHandler.cpp
@@ -168,21 +168,18 @@ CheckCSPForEval(JSContext* aCx, nsGlobal
if (reportViolation) {
// TODO : need actual script sample in violation report.
NS_NAMED_LITERAL_STRING(scriptSample,
"call to eval() or related function blocked by CSP");
// Get the calling location.
uint32_t lineNum = 0;
- const char *fileName;
nsAutoString fileNameString;
- if (nsJSUtils::GetCallingLocation(aCx, &fileName, &lineNum)) {
- AppendUTF8toUTF16(fileName, fileNameString);
- } else {
+ if (!nsJSUtils::GetCallingLocation(aCx, fileNameString, &lineNum)) {
fileNameString.AssignLiteral("unknown");
}
csp->LogViolationDetails(nsIContentSecurityPolicy::VIOLATION_TYPE_EVAL,
fileNameString, scriptSample, lineNum,
EmptyString(), EmptyString());
}
@@ -228,20 +225,17 @@ nsJSScriptTimeoutHandler::nsJSScriptTime
}
*aAllowEval = CheckCSPForEval(aCx, aWindow, aError);
if (aError.Failed() || !*aAllowEval) {
return;
}
// Get the calling location.
- const char *filename;
- if (nsJSUtils::GetCallingLocation(aCx, &filename, &mLineNo)) {
- mFileName.Assign(filename);
- }
+ nsJSUtils::GetCallingLocation(aCx, mFileName, &mLineNo);
}
nsJSScriptTimeoutHandler::~nsJSScriptTimeoutHandler()
{
ReleaseJSObjects();
}
void
@@ -348,20 +342,17 @@ nsJSScriptTimeoutHandler::Init(nsGlobalW
if (error.Failed() || !*aAllowEval) {
return error.ErrorCode();
}
MOZ_ASSERT(mExpr.IsEmpty());
AssignJSFlatString(mExpr, expr);
// Get the calling location.
- const char *filename;
- if (nsJSUtils::GetCallingLocation(cx, &filename, &mLineNo)) {
- mFileName.Assign(filename);
- }
+ nsJSUtils::GetCallingLocation(cx, mFileName, &mLineNo);
} else if (funobj) {
*aAllowEval = true;
mozilla::HoldJSObjects(this);
mFunction = new Function(funobj, GetIncumbentGlobal());
// Create our arg array. argc is the number of arguments passed
--- a/dom/base/nsJSUtils.cpp
+++ b/dom/base/nsJSUtils.cpp
@@ -29,29 +29,38 @@
#include "mozilla/dom/BindingUtils.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/ScriptSettings.h"
using namespace mozilla::dom;
bool
-nsJSUtils::GetCallingLocation(JSContext* aContext, const char* *aFilename,
+nsJSUtils::GetCallingLocation(JSContext* aContext, nsACString& aFilename,
uint32_t* aLineno)
{
JS::AutoFilename filename;
- unsigned lineno = 0;
-
- if (!JS::DescribeScriptedCaller(aContext, &filename, &lineno)) {
+ if (!JS::DescribeScriptedCaller(aContext, &filename, aLineno)) {
return false;
}
- *aFilename = filename.get();
- *aLineno = lineno;
+ aFilename.Assign(filename.get());
+ return true;
+}
+bool
+nsJSUtils::GetCallingLocation(JSContext* aContext, nsAString& aFilename,
+ uint32_t* aLineno)
+{
+ JS::AutoFilename filename;
+ if (!JS::DescribeScriptedCaller(aContext, &filename, aLineno)) {
+ return false;
+ }
+
+ aFilename.Assign(NS_ConvertUTF8toUTF16(filename.get()));
return true;
}
nsIScriptGlobalObject *
nsJSUtils::GetStaticScriptGlobal(JSObject* aObj)
{
if (!aObj)
return nullptr;
--- a/dom/base/nsJSUtils.h
+++ b/dom/base/nsJSUtils.h
@@ -27,17 +27,19 @@ namespace dom {
class AutoJSAPI;
class Element;
}
}
class nsJSUtils
{
public:
- static bool GetCallingLocation(JSContext* aContext, const char* *aFilename,
+ static bool GetCallingLocation(JSContext* aContext, nsACString& aFilename,
+ uint32_t* aLineno);
+ static bool GetCallingLocation(JSContext* aContext, nsAString& aFilename,
uint32_t* aLineno);
static nsIScriptGlobalObject *GetStaticScriptGlobal(JSObject* aObj);
static nsIScriptContext *GetStaticScriptContext(JSObject* aObj);
/**
* Retrieve the inner window ID based on the given JSContext.
--- a/dom/indexedDB/IDBRequest.cpp
+++ b/dom/indexedDB/IDBRequest.cpp
@@ -163,26 +163,17 @@ IDBRequest::SetLoggingSerialNumber(uint6
void
IDBRequest::CaptureCaller(nsAString& aFilename, uint32_t* aLineNo)
{
MOZ_ASSERT(aFilename.IsEmpty());
MOZ_ASSERT(aLineNo);
ThreadsafeAutoJSContext cx;
-
- const char* filename = nullptr;
- uint32_t lineNo = 0;
- if (!nsJSUtils::GetCallingLocation(cx, &filename, &lineNo)) {
- *aLineNo = 0;
- return;
- }
-
- aFilename.Assign(NS_ConvertUTF8toUTF16(filename));
- *aLineNo = lineNo;
+ nsJSUtils::GetCallingLocation(cx, aFilename, aLineNo);
}
void
IDBRequest::GetSource(
Nullable<OwningIDBObjectStoreOrIDBIndexOrIDBCursor>& aSource) const
{
AssertIsOnOwningThread();
--- a/dom/workers/WorkerPrivate.cpp
+++ b/dom/workers/WorkerPrivate.cpp
@@ -5697,23 +5697,17 @@ WorkerPrivate::SetTimeout(JSContext* aCx
extraArgVals.AppendElement(aArguments[index]);
}
newInfo->mExtraArgVals.SwapElements(extraArgVals);
}
newInfo->mTargetTime = TimeStamp::Now() + newInfo->mInterval;
if (!newInfo->mTimeoutString.IsEmpty()) {
- const char* filenameChars;
- uint32_t lineNumber;
- if (nsJSUtils::GetCallingLocation(aCx, &filenameChars, &lineNumber)) {
- newInfo->mFilename = filenameChars;
- newInfo->mLineNumber = lineNumber;
- }
- else {
+ if (!nsJSUtils::GetCallingLocation(aCx, newInfo->mFilename, &newInfo->mLineNumber)) {
NS_WARNING("Failed to get calling location!");
}
}
nsAutoPtr<TimeoutInfo>* insertedInfo =
mTimeouts.InsertElementSorted(newInfo.forget(), GetAutoPtrComparator(mTimeouts));
// If the timeout we just made is set to fire next then we need to update the