NS_IMETHODIMP nsScriptErrorBase::InitWithWindowID(const nsAString& message, const nsAString& sourceName, const nsAString& sourceLine, uint32_t lineNumber, uint32_t columnNumber, uint32_t flags, const nsACString& category, uint64_t aInnerWindowID) { mMessage.Assign(message); AssignSourceNameHelper(mSourceName, sourceName); mLineNumber = lineNumber; mSourceLine.Assign(sourceLine); mColumnNumber = columnNumber; mFlags = flags; mCategory = category; mTimeStamp = JS_Now() / 1000; mInnerWindowID = aInnerWindowID; if (aInnerWindowID && NS_IsMainThread()) InitializeOnMainThread(); return NS_OK; }
nsresult DOMFileImplFile::GetLastModifiedDate(JSContext* aCx, JS::MutableHandle<JS::Value> aLastModifiedDate) { NS_ASSERTION(mIsFile, "Should only be called on files"); PRTime msecs; if (IsDateUnknown()) { nsresult rv = mFile->GetLastModifiedTime(&msecs); NS_ENSURE_SUCCESS(rv, rv); mLastModificationDate = msecs; } else { msecs = mLastModificationDate; } JSObject* date = JS_NewDateObjectMsec(aCx, msecs); if (date) { aLastModifiedDate.setObject(*date); } else { date = JS_NewDateObjectMsec(aCx, JS_Now() / PR_USEC_PER_MSEC); aLastModifiedDate.setObject(*date); } return NS_OK; }
NS_IMETHODIMP nsScriptError::InitWithWindowID(const PRUnichar *message, const PRUnichar *sourceName, const PRUnichar *sourceLine, uint32_t lineNumber, uint32_t columnNumber, uint32_t flags, const char *category, uint64_t aInnerWindowID) { mMessage.Assign(message); mSourceName.Assign(sourceName); mLineNumber = lineNumber; mSourceLine.Assign(sourceLine); mColumnNumber = columnNumber; mFlags = flags; mCategory.Assign(category); mTimeStamp = JS_Now() / 1000; mInnerWindowID = aInnerWindowID; if (aInnerWindowID) { nsGlobalWindow* window = nsGlobalWindow::GetInnerWindowWithId(aInnerWindowID); if (window) { nsPIDOMWindow* outer = window->GetOuterWindow(); if (outer) mOuterWindowID = outer->WindowID(); } } return NS_OK; }
virtual void StartTimer() { mLastFireEpoch = JS_Now(); mLastFireTime = TimeStamp::Now(); mTargetTime = mLastFireTime + mRateDuration; uint32_t delay = static_cast<uint32_t>(mRateMilliseconds); mTimer->InitWithFuncCallback(TimerTickOne, this, delay, nsITimer::TYPE_ONE_SHOT); }
virtual void StartTimer() { // pretend we just fired, and we schedule the next tick normally mLastFireEpoch = JS_Now(); mLastFireTime = TimeStamp::Now(); mTargetTime = mLastFireTime + mRateDuration; uint32_t delay = static_cast<uint32_t>(mRateMilliseconds); mTimer->InitWithFuncCallback(TimerTick, this, delay, nsITimer::TYPE_ONE_SHOT); }
nsresult DOMFileImplBase::GetLastModifiedDate(JSContext* aCx, JS::MutableHandle<JS::Value> aDate) { JS::Rooted<JSObject*> date(aCx, JS_NewDateObjectMsec(aCx, JS_Now() / PR_USEC_PER_MSEC)); if (!date) { return NS_ERROR_OUT_OF_MEMORY; } aDate.setObject(*date); return NS_OK; }
NS_IMETHODIMP nsScriptErrorBase::InitWithWindowID(const nsAString& message, const nsAString& sourceName, const nsAString& sourceLine, uint32_t lineNumber, uint32_t columnNumber, uint32_t flags, const nsACString& category, uint64_t aInnerWindowID) { mMessage.Assign(message); if (!sourceName.IsEmpty()) { mSourceName.Assign(sourceName); nsCOMPtr<nsIURI> uri; nsAutoCString pass; if (NS_SUCCEEDED(NS_NewURI(getter_AddRefs(uri), sourceName)) && NS_SUCCEEDED(uri->GetPassword(pass)) && !pass.IsEmpty()) { nsCOMPtr<nsISensitiveInfoHiddenURI> safeUri = do_QueryInterface(uri); nsAutoCString loc; if (safeUri && NS_SUCCEEDED(safeUri->GetSensitiveInfoHiddenSpec(loc))) { mSourceName.Assign(NS_ConvertUTF8toUTF16(loc)); } } } mLineNumber = lineNumber; mSourceLine.Assign(sourceLine); mColumnNumber = columnNumber; mFlags = flags; mCategory = category; mTimeStamp = JS_Now() / 1000; mInnerWindowID = aInnerWindowID; if (aInnerWindowID && NS_IsMainThread()) { InitializeOnMainThread(); } return NS_OK; }
void nsScriptErrorBase::InitializationHelper(const nsAString& message, const nsAString& sourceLine, uint32_t lineNumber, uint32_t columnNumber, uint32_t flags, const nsACString& category, uint64_t aInnerWindowID) { mMessage.Assign(message); mLineNumber = lineNumber; mSourceLine.Assign(sourceLine); mColumnNumber = columnNumber; mFlags = flags; mCategory = category; mTimeStamp = JS_Now() / 1000; mInnerWindowID = aInnerWindowID; }
NS_IMETHODIMP nsScriptError::InitWithWindowID(const nsAString& message, const nsAString& sourceName, const nsAString& sourceLine, uint32_t lineNumber, uint32_t columnNumber, uint32_t flags, const nsACString& category, uint64_t aInnerWindowID) { mMessage.Assign(message); mSourceName.Assign(sourceName); mLineNumber = lineNumber; mSourceLine.Assign(sourceLine); mColumnNumber = columnNumber; mFlags = flags; mCategory = category; mTimeStamp = JS_Now() / 1000; mInnerWindowID = aInnerWindowID; if (aInnerWindowID) { nsGlobalWindow* window = nsGlobalWindow::GetInnerWindowWithId(aInnerWindowID); if (window) { nsPIDOMWindow* outer = window->GetOuterWindow(); if (outer) mOuterWindowID = outer->WindowID(); nsIDocShell* docShell = window->GetDocShell(); nsCOMPtr<nsILoadContext> loadContext = do_QueryInterface(docShell); if (loadContext) { // Never mark exceptions from chrome windows as having come from // private windows, since we always want them to be reported. nsIPrincipal* winPrincipal = window->GetPrincipal(); mIsFromPrivateWindow = loadContext->UsePrivateBrowsing() && !nsContentUtils::IsSystemPrincipal(winPrincipal); } } } return NS_OK; }
/* Runs just one driver's tick. */ void TickOne() { int64_t jsnow = JS_Now(); TimeStamp now = TimeStamp::Now(); ScheduleNextTick(now); mLastFireEpoch = jsnow; mLastFireTime = now; nsTArray<nsRefPtr<nsRefreshDriver> > drivers(mRefreshDrivers); if (mNextDriverIndex < drivers.Length() && !drivers[mNextDriverIndex]->IsTestControllingRefreshesEnabled()) { TickDriver(drivers[mNextDriverIndex], jsnow, now); } mNextDriverIndex++; }
NS_IMETHODIMP nsScriptError::InitWithWindowID(const nsAString& message, const nsAString& sourceName, const nsAString& sourceLine, uint32_t lineNumber, uint32_t columnNumber, uint32_t flags, const char *category, uint64_t aInnerWindowID) { mMessage.Assign(message); mSourceName.Assign(sourceName); mLineNumber = lineNumber; mSourceLine.Assign(sourceLine); mColumnNumber = columnNumber; mFlags = flags; mCategory.Assign(category); mTimeStamp = JS_Now() / 1000; mInnerWindowID = aInnerWindowID; if (aInnerWindowID) { nsGlobalWindow* window = nsGlobalWindow::GetInnerWindowWithId(aInnerWindowID); if (window) { nsPIDOMWindow* outer = window->GetOuterWindow(); if (outer) mOuterWindowID = outer->WindowID(); nsIDocShell* docShell = window->GetDocShell(); nsCOMPtr<nsILoadContext> loadContext = do_QueryInterface(docShell); if (loadContext) { // Never suppress errors originated from chrome code mIsFromPrivateWindow = !nsContentUtils::IsCallerChrome() && loadContext->UsePrivateBrowsing(); } } } return NS_OK; }
/* * Actually runs a tick, poking all the attached RefreshDrivers. * Grabs the "now" time via JS_Now and TimeStamp::Now(). */ void Tick() { int64_t jsnow = JS_Now(); TimeStamp now = TimeStamp::Now(); ScheduleNextTick(now); mLastFireEpoch = jsnow; mLastFireTime = now; LOG("[%p] ticking drivers...", this); nsTArray<nsRefPtr<nsRefreshDriver> > drivers(mRefreshDrivers); for (size_t i = 0; i < drivers.Length(); ++i) { // don't poke this driver if it's in test mode if (drivers[i]->IsTestControllingRefreshesEnabled()) { continue; } TickDriver(drivers[i], jsnow, now); } LOG("[%p] done.", this); }
nsConsoleMessage::nsConsoleMessage(const char16_t *message) { mTimeStamp = JS_Now() / 1000; mMessage.Assign(message); }
JSBool _callHook(JSDContext *jsdc, JSContext *cx, JSAbstractFramePtr frame, bool isConstructing, JSBool before, unsigned type, JSD_CallHookProc hook, void *hookData) { JSDScript* jsdscript; JSScript* jsscript; JSBool hookresult = JS_TRUE; if (!jsdc || !jsdc->inited) return JS_FALSE; if (!hook && !(jsdc->flags & JSD_COLLECT_PROFILE_DATA)) { /* no hook to call, no profile data needs to be collected, * so there is nothing to do here. */ return hookresult; } if (before && isConstructing) { js::RootedValue newObj(cx); if (!frame.getThisValue(cx, &newObj)) return JS_FALSE; jsd_Constructing(jsdc, cx, JSVAL_TO_OBJECT(newObj), frame); } jsscript = frame.script(); if (jsscript) { JSD_LOCK_SCRIPTS(jsdc); jsdscript = jsd_FindOrCreateJSDScript(jsdc, cx, jsscript, frame); JSD_UNLOCK_SCRIPTS(jsdc); if (jsdscript) { if (JSD_IS_PROFILE_ENABLED(jsdc, jsdscript)) { JSDProfileData *pdata; pdata = jsd_GetScriptProfileData (jsdc, jsdscript); if (pdata) { if (before) { if (!pdata->lastCallStart) { int64_t now; JSDProfileData *callerpdata; /* Get the time just the once, for consistency. */ now = JS_Now(); /* This contains a pointer to the profile data for * the caller of this function. */ callerpdata = jsdc->callingFunctionPData; if (callerpdata) { int64_t ll_delta; pdata->caller = callerpdata; /* We need to 'stop' the timer for the caller. * Use time since last return if appropriate. */ ll_delta = jsdc->lastReturnTime ? now - jsdc->lastReturnTime : now - callerpdata->lastCallStart; callerpdata->runningTime += ll_delta; } /* We're the new current function, and no return * has happened yet. */ jsdc->callingFunctionPData = pdata; jsdc->lastReturnTime = 0; /* This function has no running time (just been * called!), and we'll need the call start time. */ pdata->runningTime = 0; pdata->lastCallStart = now; } else { if (++pdata->recurseDepth > pdata->maxRecurseDepth) pdata->maxRecurseDepth = pdata->recurseDepth; } /* make sure we're called for the return too. */ hookresult = JS_TRUE; } else if (!pdata->recurseDepth && pdata->lastCallStart) { int64_t now, ll_delta; double delta; now = JS_Now(); ll_delta = now - pdata->lastCallStart; delta = ll_delta; delta /= 1000.0; pdata->totalExecutionTime += delta; /* minExecutionTime starts as 0, so we need to overwrite * it on the first call always. */ if ((0 == pdata->callCount) || delta < pdata->minExecutionTime) { pdata->minExecutionTime = delta; } if (delta > pdata->maxExecutionTime) pdata->maxExecutionTime = delta; /* If we last returned from a function (as opposed to * having last entered this function), we need to inc. * the running total by the time delta since the last * return, and use the running total instead of the * delta calculated above. */ if (jsdc->lastReturnTime) { /* Add last chunk to running time, and use total * running time as 'delta'. */ ll_delta = now - jsdc->lastReturnTime; pdata->runningTime += ll_delta; delta = pdata->runningTime; delta /= 1000.0; } pdata->totalOwnExecutionTime += delta; /* See minExecutionTime comment above. */ if ((0 == pdata->callCount) || delta < pdata->minOwnExecutionTime) { pdata->minOwnExecutionTime = delta; } if (delta > pdata->maxOwnExecutionTime) pdata->maxOwnExecutionTime = delta; /* Current function is now our caller. */ jsdc->callingFunctionPData = pdata->caller; /* No hanging pointers, please. */ pdata->caller = NULL; /* Mark the time we returned, and indicate this * function is no longer running. */ jsdc->lastReturnTime = now; pdata->lastCallStart = 0; ++pdata->callCount; } else if (pdata->recurseDepth) { --pdata->recurseDepth; ++pdata->callCount; } } if (hook) jsd_CallCallHook (jsdc, cx, type, hook, hookData); } else { if (hook) hookresult = jsd_CallCallHook (jsdc, cx, type, hook, hookData); else hookresult = JS_TRUE; } } } #ifdef JSD_TRACE _interpreterTrace(jsdc, cx, frame, isConstructing, before); return JS_TRUE; #else return hookresult; #endif }
JSBool _callHook(JSDContext *jsdc, JSContext *cx, JSStackFrame *fp, JSBool before, uintN type, JSD_CallHookProc hook, void *hookData) { JSDScript* jsdscript; JSScript* jsscript; JSBool hookresult = JS_TRUE; if (!jsdc || !jsdc->inited) return JS_FALSE; if (!hook && !(jsdc->flags & JSD_COLLECT_PROFILE_DATA) && jsdc->flags & JSD_DISABLE_OBJECT_TRACE) { /* no hook to call, no profile data needs to be collected, and * the client has object tracing disabled, so there is nothing * to do here. */ return hookresult; } if (before && JS_IsConstructorFrame(cx, fp)) jsd_Constructing(jsdc, cx, JS_GetFrameThis(cx, fp), fp); jsscript = JS_GetFrameScript(cx, fp); if (jsscript) { JSD_LOCK_SCRIPTS(jsdc); jsdscript = jsd_FindJSDScript(jsdc, jsscript); JSD_UNLOCK_SCRIPTS(jsdc); if (jsdscript) { if (JSD_IS_PROFILE_ENABLED(jsdc, jsdscript)) { JSDProfileData *pdata; pdata = jsd_GetScriptProfileData (jsdc, jsdscript); if (pdata) { if (before) { if (JSLL_IS_ZERO(pdata->lastCallStart)) { int64 now; JSDProfileData *callerpdata; /* Get the time just the once, for consistency. */ now = JS_Now(); /* This contains a pointer to the profile data for * the caller of this function. */ callerpdata = jsdc->callingFunctionPData; if (callerpdata) { int64 ll_delta; pdata->caller = callerpdata; /* We need to 'stop' the timer for the caller. * Use time since last return if appropriate. */ if (JSLL_IS_ZERO(jsdc->lastReturnTime)) { JSLL_SUB(ll_delta, now, callerpdata->lastCallStart); } else { JSLL_SUB(ll_delta, now, jsdc->lastReturnTime); } JSLL_ADD(callerpdata->runningTime, callerpdata->runningTime, ll_delta); } /* We're the new current function, and no return * has happened yet. */ jsdc->callingFunctionPData = pdata; jsdc->lastReturnTime = JSLL_ZERO; /* This function has no running time (just been * called!), and we'll need the call start time. */ pdata->runningTime = JSLL_ZERO; pdata->lastCallStart = now; } else { if (++pdata->recurseDepth > pdata->maxRecurseDepth) pdata->maxRecurseDepth = pdata->recurseDepth; } /* make sure we're called for the return too. */ hookresult = JS_TRUE; } else if (!pdata->recurseDepth && !JSLL_IS_ZERO(pdata->lastCallStart)) { int64 now, ll_delta; jsdouble delta; now = JS_Now(); JSLL_SUB(ll_delta, now, pdata->lastCallStart); JSLL_L2D(delta, ll_delta); delta /= 1000.0; pdata->totalExecutionTime += delta; /* minExecutionTime starts as 0, so we need to overwrite * it on the first call always. */ if ((0 == pdata->callCount) || delta < pdata->minExecutionTime) { pdata->minExecutionTime = delta; } if (delta > pdata->maxExecutionTime) pdata->maxExecutionTime = delta; /* If we last returned from a function (as opposed to * having last entered this function), we need to inc. * the running total by the time delta since the last * return, and use the running total instead of the * delta calculated above. */ if (!JSLL_IS_ZERO(jsdc->lastReturnTime)) { /* Add last chunk to running time, and use total * running time as 'delta'. */ JSLL_SUB(ll_delta, now, jsdc->lastReturnTime); JSLL_ADD(pdata->runningTime, pdata->runningTime, ll_delta); JSLL_L2D(delta, pdata->runningTime); delta /= 1000.0; } pdata->totalOwnExecutionTime += delta; /* See minExecutionTime comment above. */ if ((0 == pdata->callCount) || delta < pdata->minOwnExecutionTime) { pdata->minOwnExecutionTime = delta; } if (delta > pdata->maxOwnExecutionTime) pdata->maxOwnExecutionTime = delta; /* Current function is now our caller. */ jsdc->callingFunctionPData = pdata->caller; /* No hanging pointers, please. */ pdata->caller = NULL; /* Mark the time we returned, and indicate this * function is no longer running. */ jsdc->lastReturnTime = now; pdata->lastCallStart = JSLL_ZERO; ++pdata->callCount; } else if (pdata->recurseDepth) { --pdata->recurseDepth; ++pdata->callCount; } } if (hook) jsd_CallCallHook (jsdc, cx, type, hook, hookData); } else { if (hook) hookresult = jsd_CallCallHook (jsdc, cx, type, hook, hookData); else hookresult = JS_TRUE; } } } #ifdef JSD_TRACE _interpreterTrace(jsdc, cx, fp, before); return JS_TRUE; #else return hookresult; #endif }
void ConsoleUtils::ReportForServiceWorkerScopeInternal( const nsAString& aScope, const nsAString& aMessage, const nsAString& aFilename, uint32_t aLineNumber, uint32_t aColumnNumber, Level aLevel) { MOZ_ASSERT(NS_IsMainThread()); AutoJSAPI jsapi; jsapi.Init(); JSContext* cx = jsapi.cx(); ConsoleCommon::ClearException ce(cx); JS::Rooted<JSObject*> global(cx, GetOrCreateSandbox(cx)); if (NS_WARN_IF(!global)) { return; } // The GetOrCreateSandbox call returns a proxy to the actual sandbox object. // We don't need a proxy here. global = js::UncheckedUnwrap(global); JSAutoRealm ar(cx, global); RootedDictionary<ConsoleEvent> event(cx); event.mID.Construct(); event.mID.Value().SetAsString() = aScope; event.mInnerID.Construct(); event.mInnerID.Value().SetAsString() = NS_LITERAL_STRING("ServiceWorker"); switch (aLevel) { case eLog: event.mLevel = NS_LITERAL_STRING("log"); break; case eWarning: event.mLevel = NS_LITERAL_STRING("warn"); break; case eError: event.mLevel = NS_LITERAL_STRING("error"); break; } event.mFilename = aFilename; event.mLineNumber = aLineNumber; event.mColumnNumber = aColumnNumber; event.mTimeStamp = JS_Now() / PR_USEC_PER_MSEC; JS::Rooted<JS::Value> messageValue(cx); if (!dom::ToJSValue(cx, aMessage, &messageValue)) { return; } event.mArguments.Construct(); if (!event.mArguments.Value().AppendElement(messageValue, fallible)) { return; } nsCOMPtr<nsIConsoleAPIStorage> storage = do_GetService("@mozilla.org/consoleAPI-storage;1"); if (NS_WARN_IF(!storage)) { return; } JS::Rooted<JS::Value> eventValue(cx); if (!ToJSValue(cx, event, &eventValue)) { return; } // This is a legacy property. JS::Rooted<JSObject*> eventObj(cx, &eventValue.toObject()); if (NS_WARN_IF(!JS_DefineProperty(cx, eventObj, "wrappedJSObject", eventObj, JSPROP_ENUMERATE))) { return; } storage->RecordEvent(NS_LITERAL_STRING("ServiceWorker"), aScope, eventValue); }