Skip to content

Commit

Permalink
src: create env->inspector_console_api_object earlier
Browse files Browse the repository at this point in the history
Previously we create env->inspector_console_api_object() when
`process.binding('inspector')` is called, which may be too late
if the inspector console is used before the first call to
`process.binding('inspector')` - that is possible when
using `--inspect-brk-node`. Setting a breakpoint and using the
inspector console before that would crash the process.

This patch moves the initialization of the console API object to
the point when Environment is initialized so that
`installAdditionalCommandLineAPI()` can be essentially a noop
if we use the inspector console before the inspector binding
is initialized instead of crashing on an empty object.

PR-URL: #24906
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
joyeecheung authored and BethGriggs committed Dec 17, 2018
1 parent e61bbda commit 5a1289d
Showing 3 changed files with 8 additions and 6 deletions.
7 changes: 7 additions & 0 deletions src/env.cc
Original file line number Diff line number Diff line change
@@ -341,6 +341,13 @@ void Environment::Start(const std::vector<std::string>& args,
static uv_once_t init_once = UV_ONCE_INIT;
uv_once(&init_once, InitThreadLocalOnce);
uv_key_set(&thread_local_env, this);

#if HAVE_INSPECTOR
// This needs to be set before we start the inspector
Local<Object> obj = Object::New(isolate());
CHECK(obj->SetPrototype(context(), Null(isolate())).FromJust());
set_inspector_console_api_object(obj);
#endif // HAVE_INSPECTOR
}

void Environment::RegisterHandleCleanups() {
1 change: 1 addition & 0 deletions src/inspector_agent.cc
Original file line number Diff line number Diff line change
@@ -506,6 +506,7 @@ class NodeInspectorClient : public V8InspectorClient {
void installAdditionalCommandLineAPI(Local<Context> context,
Local<Object> target) override {
Local<Object> console_api = env_->inspector_console_api_object();
CHECK(!console_api.IsEmpty());

Local<Array> properties =
console_api->GetOwnPropertyNames(context).ToLocalChecked();
6 changes: 0 additions & 6 deletions src/inspector_js_api.cc
Original file line number Diff line number Diff line change
@@ -277,12 +277,6 @@ void Url(const FunctionCallbackInfo<Value>& args) {
void Initialize(Local<Object> target, Local<Value> unused,
Local<Context> context, void* priv) {
Environment* env = Environment::GetCurrent(context);
{
auto obj = Object::New(env->isolate());
auto null = Null(env->isolate());
CHECK(obj->SetPrototype(context, null).FromJust());
env->set_inspector_console_api_object(obj);
}

Agent* agent = env->inspector_agent();
env->SetMethod(target, "consoleCall", InspectorConsoleCall);

0 comments on commit 5a1289d

Please sign in to comment.