// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_TEST_INSPECTOR_PROTOCOL_ISOLATE_DATA_H_ #define V8_TEST_INSPECTOR_PROTOCOL_ISOLATE_DATA_H_ #include #include "include/v8-inspector.h" #include "include/v8-platform.h" #include "include/v8.h" #include "src/vector.h" #include "test/inspector/inspector-impl.h" class TaskRunner; class IsolateData { public: class SetupGlobalTask { public: virtual ~SetupGlobalTask() = default; virtual void Run(v8::Isolate* isolate, v8::Local global) = 0; }; using SetupGlobalTasks = std::vector>; IsolateData(TaskRunner* task_runner, SetupGlobalTasks setup_global_tasks, v8::StartupData* startup_data, InspectorClientImpl::FrontendChannel* channel); static IsolateData* FromContext(v8::Local context); v8::Isolate* isolate() const { return isolate_; } InspectorClientImpl* inspector() const { return inspector_.get(); } TaskRunner* task_runner() const { return task_runner_; } int CreateContextGroup(); v8::Local GetContext(int context_group_id); int GetContextGroupId(v8::Local context); void RegisterModule(v8::Local context, v8::internal::Vector name, v8::ScriptCompiler::Source* source); private: struct VectorCompare { bool operator()(const v8::internal::Vector& lhs, const v8::internal::Vector& rhs) const { for (int i = 0; i < lhs.length() && i < rhs.length(); ++i) { if (lhs[i] != rhs[i]) return lhs[i] < rhs[i]; } return false; } }; static v8::MaybeLocal ModuleResolveCallback( v8::Local context, v8::Local specifier, v8::Local referrer); TaskRunner* task_runner_; SetupGlobalTasks setup_global_tasks_; v8::Isolate* isolate_; std::unique_ptr inspector_; int last_context_group_id_ = 0; std::map> contexts_; std::map, v8::Global, VectorCompare> modules_; }; #endif // V8_TEST_INSPECTOR_PROTOCOL_ISOLATE_DATA_H_