Skip to content

Commit b753387

Browse files
authored
Merge pull request #725 from NativeScript/pete/network-agent
DevTools Network Agent implementation
2 parents 170fa84 + d2c5eb4 commit b753387

21 files changed

Lines changed: 3267 additions & 44 deletions

build-artifacts/project-template-gradle/src/main/java/com/tns/RuntimeHelper.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,18 @@ public static Runtime initRuntime(Application app) {
124124
e.printStackTrace();
125125
}
126126

127+
boolean isDebuggable = Util.isDebuggableApp(app);
127128
StaticConfiguration config = new StaticConfiguration(logger, appName, nativeLibDir, rootDir,
128-
appDir, classLoader, dexDir, dexThumb, appConfig);
129+
appDir, classLoader, dexDir, dexThumb, appConfig, isDebuggable);
129130

130131
runtime = Runtime.initializeRuntimeWithConfiguration(config);
131-
if (Util.isDebuggableApp(app)) {
132+
if (isDebuggable) {
132133
try {
133134
v8Inspector = new AndroidJsV8Inspector(app, logger);
134135
v8Inspector.start();
136+
137+
// the following snippet is used as means to notify the VSCode extension
138+
// debugger that the debugger agent has started
135139
File debugBreakFile = new File("/data/local/tmp", app.getPackageName() + "-debugger-started");
136140
if (debugBreakFile.exists() && !debugBreakFile.isDirectory() && debugBreakFile.length() == 0) {
137141
java.io.FileWriter fileWriter = new java.io.FileWriter(debugBreakFile);

runtime/src/main/java/com/tns/Runtime.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import com.tns.bindings.ProxyGenerator;
3232

3333
public class Runtime {
34-
private native void initNativeScript(int runtimeId, String filesPath, String nativeLibDir, boolean verboseLoggingEnabled, String packageName, Object[] v8Options, String callingDir);
34+
private native void initNativeScript(int runtimeId, String filesPath, String nativeLibDir, boolean verboseLoggingEnabled, boolean isDebuggable, String packageName, Object[] v8Options, String callingDir);
3535

3636
private native void runModule(int runtimeId, String filePath) throws NativeScriptException;
3737

@@ -441,10 +441,10 @@ private boolean isInitializedImpl() {
441441
}
442442

443443
public void init() {
444-
init(config.logger, config.appName, config.nativeLibDir, config.rootDir, config.appDir, config.classLoader, config.dexDir, config.dexThumb, config.appConfig, dynamicConfig.callingJsDir);
444+
init(config.logger, config.appName, config.nativeLibDir, config.rootDir, config.appDir, config.classLoader, config.dexDir, config.dexThumb, config.appConfig, dynamicConfig.callingJsDir, config.isDebuggable);
445445
}
446446

447-
private void init(Logger logger, String appName, String nativeLibDir, File rootDir, File appDir, ClassLoader classLoader, File dexDir, String dexThumb, AppConfig appConfig, String callingJsDir) throws RuntimeException {
447+
private void init(Logger logger, String appName, String nativeLibDir, File rootDir, File appDir, ClassLoader classLoader, File dexDir, String dexThumb, AppConfig appConfig, String callingJsDir, boolean isDebuggable) throws RuntimeException {
448448
if (initialized) {
449449
throw new RuntimeException("NativeScriptApplication already initialized");
450450
}
@@ -463,7 +463,7 @@ private void init(Logger logger, String appName, String nativeLibDir, File rootD
463463
throw new RuntimeException("Fail to initialize Require class", ex);
464464
}
465465

466-
initNativeScript(getRuntimeId(), Module.getApplicationFilesPath(), nativeLibDir, logger.isEnabled(), appName, appConfig.getAsArray(), callingJsDir);
466+
initNativeScript(getRuntimeId(), Module.getApplicationFilesPath(), nativeLibDir, logger.isEnabled(), isDebuggable, appName, appConfig.getAsArray(), callingJsDir);
467467

468468
clearStartupData(getRuntimeId()); // It's safe to delete the data after the V8 debugger is initialized
469469

runtime/src/main/java/com/tns/StaticConfiguration.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ public class StaticConfiguration {
1212
public final File dexDir;
1313
public final String dexThumb;
1414
public final AppConfig appConfig;
15+
public final boolean isDebuggable;
1516

1617
public StaticConfiguration(Logger logger,
1718
String appName, String nativeLibDir, File rootDir, File appDir, ClassLoader classLoader,
18-
File dexDir, String dexThumb, AppConfig appConfig) {
19+
File dexDir, String dexThumb, AppConfig appConfig, boolean isDebuggable) {
1920
this.logger = logger;
2021
this.appName = appName;
2122
this.nativeLibDir = nativeLibDir;
@@ -25,5 +26,6 @@ public StaticConfiguration(Logger logger,
2526
this.dexDir = dexDir;
2627
this.dexThumb = dexThumb;
2728
this.appConfig = appConfig;
29+
this.isDebuggable = isDebuggable;
2830
}
2931
}

runtime/src/main/jni/JsV8InspectorClient.cpp

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "NativeScriptException.h"
77

88
#include "ArgConverter.h"
9+
#include "NetworkDomainCallbackHandlers.h"
910

1011
using namespace std;
1112
using namespace tns;
@@ -19,7 +20,8 @@ JsV8InspectorClient::JsV8InspectorClient(v8::Isolate* isolate)
1920
session_(nullptr),
2021
connection(nullptr),
2122
context_(),
22-
running_nested_loop_(false) {
23+
running_nested_loop_(false),
24+
isConnected(false) {
2325
JEnv env;
2426

2527
inspectorClass = env.FindClass("com/tns/AndroidJsV8Inspector");
@@ -38,6 +40,7 @@ JsV8InspectorClient::JsV8InspectorClient(v8::Isolate* isolate)
3840
void JsV8InspectorClient::connect(jobject connection) {
3941
JEnv env;
4042
this->connection = env.NewGlobalRef(connection);
43+
this->isConnected = true;
4144
}
4245

4346
void JsV8InspectorClient::createInspectorSession(v8::Isolate* isolate, const v8::Local<v8::Context>& context) {
@@ -58,6 +61,7 @@ void JsV8InspectorClient::disconnect() {
5861
JEnv env;
5962
env.DeleteGlobalRef(this->connection);
6063
this->connection = nullptr;
64+
this->isConnected = false;
6165

6266
this->createInspectorSession(isolate_, JsV8InspectorClient::PersistentToLocal(isolate_, context_));
6367
}
@@ -133,7 +137,6 @@ void JsV8InspectorClient::sendProtocolNotification(const v8_inspector::StringVie
133137
v8_inspector::String16 msg = ToString16(message);
134138

135139
JEnv env;
136-
const char* msss = msg.utf8().c_str();
137140
JniLocalRef str(env.NewStringUTF(msg.utf8().c_str()));
138141
env.CallStaticVoidMethod(inspectorClass, sendMethod, this->connection, (jstring) str);
139142
}
@@ -257,11 +260,27 @@ void MessageHandler(v8::Local<v8::Message> message, v8::Local<v8::Value> excepti
257260
// inspector->createStackTrace(stack), script_id);
258261
}
259262

263+
void JsV8InspectorClient::attachInspectorCallbacks(Isolate* isolate,
264+
Local<ObjectTemplate>& globalObjectTemplate) {
265+
v8::HandleScope scope(isolate);
266+
267+
auto inspectorJSObject = ObjectTemplate::New(isolate);
268+
269+
inspectorJSObject->Set(ArgConverter::ConvertToV8String(isolate, "responseReceived"), FunctionTemplate::New(isolate, NetworkDomainCallbackHandlers::ResponseReceivedCallback));
270+
inspectorJSObject->Set(ArgConverter::ConvertToV8String(isolate, "requestWillBeSent"), FunctionTemplate::New(isolate, NetworkDomainCallbackHandlers::RequestWillBeSentCallback));
271+
inspectorJSObject->Set(ArgConverter::ConvertToV8String(isolate, "dataForRequestId"), FunctionTemplate::New(isolate, NetworkDomainCallbackHandlers::DataForRequestIdCallback));
272+
inspectorJSObject->Set(ArgConverter::ConvertToV8String(isolate, "loadingFinished"), FunctionTemplate::New(isolate, NetworkDomainCallbackHandlers::LoadingFinishedCallback));
273+
inspectorJSObject->SetAccessor(ArgConverter::ConvertToV8String(isolate, "isConnected"), JsV8InspectorClient::InspectorIsConnectedGetterCallback);
274+
275+
globalObjectTemplate->Set(ArgConverter::ConvertToV8String(isolate, "__inspector"), inspectorJSObject);
276+
}
277+
278+
void JsV8InspectorClient::InspectorIsConnectedGetterCallback(v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
279+
info.GetReturnValue().Set(JsV8InspectorClient::GetInstance()->isConnected);
280+
}
281+
260282
JsV8InspectorClient* JsV8InspectorClient::instance = nullptr;
261283
jclass JsV8InspectorClient::inspectorClass = nullptr;
262284
jmethodID JsV8InspectorClient::sendMethod = nullptr;
263285
jmethodID JsV8InspectorClient::sendToDevToolsConsoleMethod = nullptr;
264286
jmethodID JsV8InspectorClient::getInspectorMessageMethod = nullptr;
265-
266-
267-

runtime/src/main/jni/JsV8InspectorClient.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#include "src/inspector/protocol/Forward.h"
1212
#include "src/inspector/string-16.h"
1313

14-
1514
using namespace v8_inspector;
1615

1716
namespace tns {
@@ -39,6 +38,13 @@ class JsV8InspectorClient : V8InspectorClient, v8_inspector::V8Inspector::Channe
3938
void quitMessageLoopOnPause() override;
4039
v8::Local<v8::Context> ensureDefaultContextInGroup(int contextGroupId) override;
4140

41+
static void attachInspectorCallbacks(v8::Isolate* isolate, v8::Local<v8::ObjectTemplate>& globalObjectTemplate);
42+
static void InspectorIsConnectedGetterCallback(v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Value>& info);
43+
44+
std::unique_ptr<V8Inspector> inspector_;
45+
v8::Isolate* isolate_;
46+
bool isConnected;
47+
4248
private:
4349
JsV8InspectorClient(v8::Isolate* isolate);
4450

@@ -48,9 +54,7 @@ class JsV8InspectorClient : V8InspectorClient, v8_inspector::V8Inspector::Channe
4854
static jmethodID getInspectorMessageMethod;
4955
static jmethodID sendToDevToolsConsoleMethod;
5056

51-
v8::Isolate* isolate_;
5257
v8::Persistent<v8::Context> context_;
53-
std::unique_ptr<V8Inspector> inspector_;
5458
std::unique_ptr<V8InspectorSession> session_;
5559
jobject connection;
5660
bool running_nested_loop_;

0 commit comments

Comments
 (0)