Skip to content

Commit 09914a4

Browse files
committed
construct any debug console messages in the method itself (don't rely on javascript code to escape text as correct json message). works on par with web console.log....
1 parent 8133ffe commit 09914a4

4 files changed

Lines changed: 115 additions & 40 deletions

File tree

src/jni/JsDebugger.cpp

Lines changed: 15 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ void JsDebugger::Init(v8::Isolate *isolate, const string& packageName, jobject j
2828
s_EnqueueMessage = env.GetMethodID(s_JsDebuggerClass, "enqueueMessage", "(Ljava/lang/String;)V");
2929
assert(s_EnqueueMessage != nullptr);
3030

31+
s_EnqueueConsoleMessage = env.GetMethodID(s_JsDebuggerClass, "enqueueConsoleMessage", "(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;)V");
32+
assert(s_EnqueueConsoleMessage != nullptr);
33+
34+
3135
s_EnableAgent = env.GetMethodID(s_JsDebuggerClass, "enableAgent", "()V");
3236
assert(s_EnableAgent != nullptr);
3337
}
@@ -76,6 +80,11 @@ void JsDebugger::DebugBreak()
7680
v8::Debug::DebugBreak(isolate);
7781
}
7882

83+
bool JsDebugger::IsDebuggerActive()
84+
{
85+
return s_jsDebugger == nullptr && enabled;
86+
}
87+
7988
void JsDebugger::ProcessDebugMessages()
8089
{
8190
auto isolate = s_isolate;
@@ -164,8 +173,6 @@ void JsDebugger::ConsoleMessage(const v8::FunctionCallbackInfo<v8::Value>& args)
164173
if ((args.Length() > 0) && args[0]->IsString())
165174
{
166175
std::string message = ConvertToString(args[0]->ToString());
167-
//jboolean isError = (jboolean) = args[1]->ToBoolean()->BooleanValue();
168-
169176

170177
std:string level = "log";
171178
if (args.Length() > 1 && args[1]->IsString())
@@ -194,45 +201,12 @@ void JsDebugger::ConsoleMessage(const v8::FunctionCallbackInfo<v8::Value>& args)
194201
}
195202
}
196203

197-
198-
199-
200-
// var consoleEvent = {
201-
// "seq":0,
202-
// "type":"event",
203-
// "event":"messageAdded",
204-
// "success":true,
205-
// "body":
206-
// {
207-
// "message":
208-
// {
209-
// "source":"console-api",
210-
// "type": "log",
211-
// "level": 'error',
212-
// "line": 0,
213-
// "column": 0,
214-
// "url": "",
215-
// "groupLevel": 7,
216-
// "repeatCount": 1,
217-
// "text": "My message"
218-
// }
219-
// }
220-
// };
221-
222-
stringstream consoleEventSS;
223-
consoleEventSS << "{\"seq\":0, \"type\":\"event\", \"event\":\"messageAdded\", \"success\":true, \"body\": { \"message\": { \"source\":\"console-api\", "
224-
<< " \"type\": \"log\","
225-
<< " \"level\": \"" << level << "\", "
226-
<< " \"line\": " << lineNumber << ","
227-
<< " \"column\": " << columnNumber << ","
228-
<< " \"url\" : \"" << srcFileName << "\","
229-
<< " \"groupLevel\": 7, \"repeatCount\": 1, "
230-
<< " \"text\": \"" << message << "\" } } }";
231-
232-
233204
JEnv env;
234-
JniLocalRef s(env.NewStringUTF(consoleEventSS.str().c_str()));
235-
env.CallVoidMethod(s_jsDebugger, s_EnqueueMessage, (jstring) s);
205+
JniLocalRef jniText(env.NewStringUTF(message.c_str()));
206+
JniLocalRef jniLevel(env.NewStringUTF(level.c_str()));
207+
JniLocalRef jniSrcFileName(env.NewStringUTF(srcFileName.c_str()));
208+
209+
env.CallVoidMethod(s_jsDebugger, s_EnqueueConsoleMessage, (jstring) jniText, (jstring)jniLevel, lineNumber, columnNumber, (jstring)jniSrcFileName);
236210
}
237211
}
238212

@@ -268,5 +242,6 @@ jobject JsDebugger::s_jsDebugger = nullptr;
268242
string JsDebugger::s_packageName = "";
269243
jclass JsDebugger::s_JsDebuggerClass = nullptr;
270244
jmethodID JsDebugger::s_EnqueueMessage = nullptr;
245+
jmethodID JsDebugger::s_EnqueueConsoleMessage = nullptr;
271246
jmethodID JsDebugger::s_EnableAgent = nullptr;
272247

src/jni/JsDebugger.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ namespace tns
2121

2222
static void DebugBreak();
2323

24+
static bool IsDebuggerActive();
25+
2426
static std::string GetPackageName();
2527

2628
static void SendCommand(JNIEnv *_env, jobject obj, jbyteArray command, jint length);
@@ -43,6 +45,7 @@ namespace tns
4345
static jclass s_JsDebuggerClass;
4446
static jobject s_jsDebugger;
4547
static jmethodID s_EnqueueMessage;
48+
static jmethodID s_EnqueueConsoleMessage;
4649
static jmethodID s_EnableAgent;
4750
static v8::Isolate *s_isolate;
4851

src/jni/com_tns_JsDebugger.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,28 @@ extern "C" void Java_com_tns_JsDebugger_debugBreak(JNIEnv *env, jobject obj)
9797
}
9898
}
9999

100+
extern "C" jboolean Java_com_tns_JsDebugger_isDebugerActive(JNIEnv *env, jobject obj)
101+
{
102+
try
103+
{
104+
return (jboolean)JsDebugger::IsDebuggerActive();
105+
}
106+
catch (NativeScriptException& e)
107+
{
108+
e.ReThrowToJava();
109+
}
110+
catch (std::exception e) {
111+
stringstream ss;
112+
ss << "Error: c++ exception: " << e.what() << endl;
113+
NativeScriptException nsEx(ss.str());
114+
nsEx.ReThrowToJava();
115+
}
116+
catch (...) {
117+
NativeScriptException nsEx(std::string("Error: c++ exception!"));
118+
nsEx.ReThrowToJava();
119+
}
120+
}
121+
100122
extern "C" void Java_com_tns_JsDebugger_sendCommand(JNIEnv *_env, jobject obj, jbyteArray command, jint length)
101123
{
102124
try

src/src/com/tns/JsDebugger.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import java.util.Scanner;
1313
import java.util.concurrent.LinkedBlockingQueue;
1414

15+
import org.json.JSONException;
16+
import org.json.JSONObject;
17+
1518
import android.content.BroadcastReceiver;
1619
import android.content.Context;
1720
import android.content.Intent;
@@ -39,6 +42,8 @@ public class JsDebugger
3942
private static native void debugBreak();
4043

4144
private static native void sendCommand(byte[] command, int length);
45+
46+
private static native boolean isDebugerActive();
4247

4348
private ThreadScheduler threadScheduler;
4449

@@ -75,6 +80,7 @@ private class DebugLocalServerSocketThread extends Thread
7580
private LocalServerSocket serverSocket;
7681
private ResponseHandler responseHandler;
7782

83+
7884
public DebugLocalServerSocketThread(String name)
7985
{
8086
this.name = name;
@@ -118,6 +124,7 @@ public void close() throws IOException
118124
try
119125
{
120126
LocalSocket socket = serverSocket.accept();
127+
121128
logger.write("NativeScript Debugger new connection on: " + socket.getFileDescriptor().toString());
122129

123130
//out (send messages to node inspector)
@@ -129,6 +136,7 @@ public void close() throws IOException
129136
requestHandler = new RequestHandler(socket, responseHandlerCloseable);
130137
Thread requestThread = new Thread(requestHandler);
131138
requestThread.start();
139+
132140
requestThread.join();
133141

134142
this.responseHandler.stop();
@@ -416,6 +424,68 @@ private void enqueueMessage(String message)
416424
compileMessages.add(message);
417425
}
418426
}
427+
428+
@RuntimeCallable
429+
private void enqueueConsoleMessage(String text, String level, int lineNumber, int columnNumber, String srcFileName)
430+
{
431+
// var consoleEvent = {
432+
// "seq":0,
433+
// "type":"event",
434+
// "event":"messageAdded",
435+
// "success":true,
436+
// "body":
437+
// {
438+
// "message":
439+
// {
440+
// "source":"console-api",
441+
// "type": "log",
442+
// "level": 'error',
443+
// "line": 0,
444+
// "column": 0,
445+
// "url": "",
446+
// "groupLevel": 7,
447+
// "repeatCount": 1,
448+
// "text": "My message"
449+
// }
450+
// }
451+
// };
452+
453+
try
454+
{
455+
JSONObject consoleMessage = new JSONObject();
456+
consoleMessage.put("seq", 0);
457+
consoleMessage.put("type", "event");
458+
consoleMessage.put("event", "messageAdded");
459+
consoleMessage.put("success", true);
460+
461+
462+
JSONObject message = new JSONObject();
463+
message.put("source", "console-api");
464+
message.put("type", "log");
465+
message.put("level", level);
466+
message.put("line", lineNumber);
467+
message.put("column", columnNumber);
468+
message.put("url", srcFileName);
469+
message.put("groupLevel", 7);
470+
message.put("repeatCount", 1);
471+
message.put("text", text);
472+
473+
JSONObject body = new JSONObject();
474+
body.put("message", message);
475+
476+
consoleMessage.put("body", body);
477+
478+
String sendingText = consoleMessage.toString();
479+
480+
Log.d("TNS.JAVA.JsDebugger", "Sending console message to inspector:" + sendingText);
481+
482+
dbgMessages.add(sendingText);
483+
}
484+
catch (JSONException e)
485+
{
486+
e.printStackTrace();
487+
}
488+
}
419489

420490
@RuntimeCallable
421491
private void enableAgent()
@@ -541,4 +611,9 @@ public static boolean isDebuggableApp(Context context)
541611
boolean isDebuggableApp = ((flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0);
542612
return isDebuggableApp;
543613
}
614+
615+
public static boolean isJsDebugerActive()
616+
{
617+
return isDebugerActive();
618+
}
544619
}

0 commit comments

Comments
 (0)