// Minimalistic logging function for internal JS static Handle<Value> krollLog(const Arguments& args) { HandleScope scope; uint32_t len = args.Length(); if (len < 2) { return JSException::Error("log: missing required tag and message arguments"); } Handle<String> tag = args[0]->ToString(); Handle<String> message = args[1]->ToString(); for (uint32_t i = 2; i < len; ++i) { message = String::Concat(String::Concat(message, String::New(" ")), args[i]->ToString()); } String::Utf8Value tagValue(tag); String::Utf8Value messageValue(message); __android_log_print(ANDROID_LOG_DEBUG, *tagValue, *messageValue); return Undefined(); }
// Minimalistic logging function for internal JS static void krollLog(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); HandleScope scope(isolate); uint32_t len = args.Length(); if (len < 2) { JSException::Error(isolate, "log: missing required tag and message arguments"); return; } Local<String> tag = args[0].As<String>(); Local<String> message = args[1].As<String>(); Local<String> space = STRING_NEW(isolate, " "); for (uint32_t i = 2; i < len; ++i) { message = String::Concat(String::Concat(message, space), args[i].As<String>()); } v8::String::Utf8Value tagValue(tag); v8::String::Utf8Value messageValue(message); __android_log_print(ANDROID_LOG_DEBUG, *tagValue, *messageValue); }
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); }