Skip to content

Commit

Permalink
src: allow preventing InitializeInspector in env
Browse files Browse the repository at this point in the history
  • Loading branch information
codebytere committed Jan 1, 2021
1 parent c380ee6 commit 842efe0
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 7 deletions.
14 changes: 8 additions & 6 deletions src/api/environment.cc
Expand Up @@ -341,12 +341,14 @@ Environment* CreateEnvironment(
Environment* env = new Environment(
isolate_data, context, args, exec_args, nullptr, flags, thread_id);
#if HAVE_INSPECTOR
if (inspector_parent_handle) {
env->InitializeInspector(
std::move(static_cast<InspectorParentHandleImpl*>(
inspector_parent_handle.get())->impl));
} else {
env->InitializeInspector({});
if (env->should_create_inspector()) {
if (inspector_parent_handle) {
env->InitializeInspector(
std::move(static_cast<InspectorParentHandleImpl*>(
inspector_parent_handle.get())->impl));
} else {
env->InitializeInspector({});
}
}
#endif

Expand Down
4 changes: 4 additions & 0 deletions src/env-inl.h
Expand Up @@ -808,6 +808,10 @@ inline bool Environment::owns_inspector() const {
return flags_ & EnvironmentFlags::kOwnsInspector;
}

inline bool Environment::should_create_inspector() const {
return (flags_ & EnvironmentFlags::kNoCreateInspector) == 0;
}

inline bool Environment::tracks_unmanaged_fds() const {
return flags_ & EnvironmentFlags::kTrackUnmanagedFds;
}
Expand Down
1 change: 1 addition & 0 deletions src/env.h
Expand Up @@ -1166,6 +1166,7 @@ class Environment : public MemoryRetainer {

inline bool is_main_thread() const;
inline bool should_not_register_esm_loader() const;
inline bool should_create_inspector() const;
inline bool owns_process_state() const;
inline bool owns_inspector() const;
inline bool tracks_unmanaged_fds() const;
Expand Down
47 changes: 47 additions & 0 deletions src/inspector_agent.cc
Expand Up @@ -370,6 +370,16 @@ bool IsFilePath(const std::string& path) {
}
#endif // __POSIX__

void ThrowUninitializedInspectorError(Environment* env) {
HandleScope scope(env->isolate());

const char* msg = "This Environment was initialized without a V8::Inspector";
Local<Value> exception =
v8::String::NewFromUtf8(env->isolate(), msg).ToLocalChecked();

env->isolate()->ThrowException(exception);
}

} // namespace

class NodeInspectorClient : public V8InspectorClient {
Expand Down Expand Up @@ -730,6 +740,11 @@ bool Agent::StartIoThread() {
if (io_ != nullptr)
return true;

if (!parent_env_->should_create_inspector() && !client_) {
ThrowUninitializedInspectorError(parent_env_);
return false;
}

CHECK_NOT_NULL(client_);

io_ = InspectorIo::Start(client_->getThreadHandle(),
Expand All @@ -750,7 +765,13 @@ void Agent::Stop() {
std::unique_ptr<InspectorSession> Agent::Connect(
std::unique_ptr<InspectorSessionDelegate> delegate,
bool prevent_shutdown) {
if (!parent_env_->should_create_inspector() && !client_) {
ThrowUninitializedInspectorError(parent_env_);
return std::unique_ptr<InspectorSession>{};
}

CHECK_NOT_NULL(client_);

int session_id = client_->connectFrontend(std::move(delegate),
prevent_shutdown);
return std::unique_ptr<InspectorSession>(
Expand All @@ -760,6 +781,11 @@ std::unique_ptr<InspectorSession> Agent::Connect(
std::unique_ptr<InspectorSession> Agent::ConnectToMainThread(
std::unique_ptr<InspectorSessionDelegate> delegate,
bool prevent_shutdown) {
if (!parent_env_->should_create_inspector() && !client_) {
ThrowUninitializedInspectorError(parent_env_);
return std::unique_ptr<InspectorSession>{};
}

CHECK_NOT_NULL(parent_handle_);
CHECK_NOT_NULL(client_);
auto thread_safe_delegate =
Expand All @@ -769,6 +795,11 @@ std::unique_ptr<InspectorSession> Agent::ConnectToMainThread(
}

void Agent::WaitForDisconnect() {
if (!parent_env_->should_create_inspector() && !client_) {
ThrowUninitializedInspectorError(parent_env_);
return;
}

CHECK_NOT_NULL(client_);
bool is_worker = parent_handle_ != nullptr;
parent_handle_.reset();
Expand Down Expand Up @@ -918,6 +949,12 @@ void Agent::SetParentHandle(

std::unique_ptr<ParentInspectorHandle> Agent::GetParentHandle(
int thread_id, const std::string& url) {
if (!parent_env_->should_create_inspector() && !client_) {
ThrowUninitializedInspectorError(parent_env_);
return std::unique_ptr<ParentInspectorHandle>{};
}

CHECK_NOT_NULL(client_);
if (!parent_handle_) {
return client_->getWorkerManager()->NewParentHandle(thread_id, url);
} else {
Expand All @@ -926,11 +963,21 @@ std::unique_ptr<ParentInspectorHandle> Agent::GetParentHandle(
}

void Agent::WaitForConnect() {
if (!parent_env_->should_create_inspector() && !client_) {
ThrowUninitializedInspectorError(parent_env_);
return;
}

CHECK_NOT_NULL(client_);
client_->waitForFrontend();
}

std::shared_ptr<WorkerManager> Agent::GetWorkerManager() {
if (!parent_env_->should_create_inspector() && !client_) {
ThrowUninitializedInspectorError(parent_env_);
return std::unique_ptr<WorkerManager>{};
}

CHECK_NOT_NULL(client_);
return client_->getWorkerManager();
}
Expand Down
7 changes: 6 additions & 1 deletion src/node.h
Expand Up @@ -402,7 +402,12 @@ enum Flags : uint64_t {
kNoRegisterESMLoader = 1 << 3,
// Set this flag to make Node.js track "raw" file descriptors, i.e. managed
// by fs.open() and fs.close(), and close them during FreeEnvironment().
kTrackUnmanagedFds = 1 << 4
kTrackUnmanagedFds = 1 << 4,
// Controls whether or not the Environment should call V8Inspector::create().
// This control is needed by embedders who may not want to initialize the V8
// inspector in situations where one has already been created,
// e.g. Blink's in Chromium.
kNoCreateInspector = 1 << 5
};
} // namespace EnvironmentFlags

Expand Down

0 comments on commit 842efe0

Please sign in to comment.