/* * * private method that takes debug message as json from v8 * after it gets the message the message handler passes it to enqueueMessage method in java */ void JsDebugger::MyMessageHandler(const v8::Debug::Message& message) { if (s_jsDebugger == nullptr) { return; } auto json = message.GetJSON(); auto str = ConvertToString(json); JEnv env; JniLocalRef s(env.NewStringUTF(str.c_str())); env.CallVoidMethod(s_jsDebugger, s_EnqueueMessage, (jstring) s); }
void NativePlatform::AppInitCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { try { auto isolate = Isolate::GetCurrent(); if (args.Length() != 1) { throw NativeScriptException(string("Application should be initialized with single parameter")); } if (!args[0]->IsObject()) { throw NativeScriptException(string("Application should be initialized with single object parameter containing overridden methods")); } // TODO: find another way to get "com/tns/NativeScriptApplication" metadata (move it to more appropriate place) auto node = MetadataNode::GetOrCreate("com/tns/NativeScriptApplication"); auto appInstance = node->CreateJSWrapper(isolate); DEBUG_WRITE("Application object created id: %d", appInstance->GetIdentityHash()); auto implementationObject = args[0]->ToObject(); implementationObject->SetHiddenValue(V8StringConstants::GetClassImplementationObject(), External::New(isolate, node)); DEBUG_WRITE("Application object implementation object is with id: %d", implementationObject->GetIdentityHash()); implementationObject->SetPrototype(appInstance->GetPrototype()); bool appSuccess = appInstance->SetPrototype(implementationObject); if (!appSuccess) { throw NativeScriptException(string("Application could not be initialized correctly")); } jweak applicationObject = g_objectManager->GetJavaObjectByID(AppJavaObjectID); JEnv env; jclass appClass = env.FindClass("com/tns/NativeScriptApplication"); g_objectManager->Link(appInstance, AppJavaObjectID, appClass); JniLocalRef applicationClass(env.GetObjectClass(applicationObject)); jmethodID setNativeScriptOverridesMethodId = env.GetMethodID((jclass)applicationClass, "setNativeScriptOverrides", "([Ljava/lang/String;)V"); jobjectArray methodOverrides = NativeScriptRuntime::GetMethodOverrides(env, implementationObject); env.CallVoidMethod(applicationObject, setNativeScriptOverridesMethodId, methodOverrides); } catch (NativeScriptException& e) { e.ReThrowToV8(); } catch (exception e) { DEBUG_WRITE("Error: c++ exception: %s", e.what()); } catch (...) { DEBUG_WRITE("Error: c++ exception!"); } }
void JsDebugger::ConsoleMessage(const v8::FunctionCallbackInfo<v8::Value>& args) { if ((args.Length() > 0) && args[0]->IsString()) { std::string message = ConvertToString(args[0]->ToString()); //jboolean isError = (jboolean) = args[1]->ToBoolean()->BooleanValue(); std:string level = "log"; if (args.Length() > 1 && args[1]->IsString()) { level = ConvertToString(args[1]->ToString()); } string srcFileName = ""; int lineNumber = 0; int columnNumber = 0; auto stackTrace = StackTrace::CurrentStackTrace(Isolate::GetCurrent(), 2, StackTrace::kOverview); if (!stackTrace.IsEmpty()) { auto frame = stackTrace->GetFrame(1); if (!frame.IsEmpty()) { auto scriptName = frame->GetScriptName(); if (!scriptName.IsEmpty()) { srcFileName = ConvertToString(scriptName); } lineNumber = frame->GetLineNumber(); columnNumber = frame->GetColumn(); } } // var consoleEvent = { // "seq":0, // "type":"event", // "event":"messageAdded", // "success":true, // "body": // { // "message": // { // "source":"console-api", // "type": "log", // "level": 'error', // "line": 0, // "column": 0, // "url": "", // "groupLevel": 7, // "repeatCount": 1, // "text": "My message" // } // } // }; stringstream consoleEventSS; consoleEventSS << "{\"seq\":0, \"type\":\"event\", \"event\":\"messageAdded\", \"success\":true, \"body\": { \"message\": { \"source\":\"console-api\", " << " \"type\": \"log\"," << " \"level\": \"" << level << "\", " << " \"line\": " << lineNumber << "," << " \"column\": " << columnNumber << "," << " \"url\" : \"" << srcFileName << "\"," << " \"groupLevel\": 7, \"repeatCount\": 1, " << " \"text\": \"" << message << "\" } } }"; JEnv env; JniLocalRef s(env.NewStringUTF(consoleEventSS.str().c_str())); env.CallVoidMethod(s_jsDebugger, s_EnqueueMessage, (jstring) s); } }