| Index: src/inspector/injected-script.cc
|
| diff --git a/src/inspector/injected-script.cc b/src/inspector/injected-script.cc
|
| index e46fbc3872322dcac8552d83d3b768281fa69857..bf267075f04b545da12305b5850d3f65ff2699ae 100644
|
| --- a/src/inspector/injected-script.cc
|
| +++ b/src/inspector/injected-script.cc
|
| @@ -30,7 +30,6 @@
|
|
|
| #include "src/inspector/injected-script.h"
|
|
|
| -#include "src/inspector/injected-script-native.h"
|
| #include "src/inspector/injected-script-source.h"
|
| #include "src/inspector/inspected-context.h"
|
| #include "src/inspector/protocol/Protocol.h"
|
| @@ -48,6 +47,10 @@
|
|
|
| namespace v8_inspector {
|
|
|
| +namespace {
|
| +static const char privateKeyName[] = "v8-inspector#injectedScript";
|
| +}
|
| +
|
| using protocol::Array;
|
| using protocol::Runtime::PropertyDescriptor;
|
| using protocol::Runtime::InternalPropertyDescriptor;
|
| @@ -61,12 +64,6 @@ std::unique_ptr<InjectedScript> InjectedScript::create(
|
| v8::Local<v8::Context> context = inspectedContext->context();
|
| v8::Context::Scope scope(context);
|
|
|
| - std::unique_ptr<InjectedScriptNative> injectedScriptNative(
|
| - new InjectedScriptNative(isolate));
|
| - v8::Local<v8::Object> scriptHostWrapper =
|
| - V8InjectedScriptHost::create(context, inspectedContext->inspector());
|
| - injectedScriptNative->setOnInjectedScriptHost(scriptHostWrapper);
|
| -
|
| // Inject javascript into the context. The compiled script is supposed to
|
| // evaluate into
|
| // a single anonymous function(it's anonymous to avoid cluttering the global
|
| @@ -87,6 +84,8 @@ std::unique_ptr<InjectedScript> InjectedScript::create(
|
| .ToLocal(&value))
|
| return nullptr;
|
| DCHECK(value->IsFunction());
|
| + v8::Local<v8::Object> scriptHostWrapper =
|
| + V8InjectedScriptHost::create(context, inspectedContext->inspector());
|
| v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(value);
|
| v8::Local<v8::Object> windowGlobal = context->Global();
|
| v8::Local<v8::Value> info[] = {
|
| @@ -105,17 +104,21 @@ std::unique_ptr<InjectedScript> InjectedScript::create(
|
| if (inspector->getContext(contextGroupId, contextId) != inspectedContext)
|
| return nullptr;
|
| if (!injectedScriptValue->IsObject()) return nullptr;
|
| - return std::unique_ptr<InjectedScript>(
|
| - new InjectedScript(inspectedContext, injectedScriptValue.As<v8::Object>(),
|
| - std::move(injectedScriptNative)));
|
| +
|
| + std::unique_ptr<InjectedScript> injectedScript(new InjectedScript(
|
| + inspectedContext, injectedScriptValue.As<v8::Object>()));
|
| + v8::Local<v8::Private> privateKey = v8::Private::ForApi(
|
| + isolate, v8::String::NewFromUtf8(isolate, privateKeyName,
|
| + v8::NewStringType::kInternalized)
|
| + .ToLocalChecked());
|
| + scriptHostWrapper->SetPrivate(
|
| + context, privateKey, v8::External::New(isolate, injectedScript.get()));
|
| + return injectedScript;
|
| }
|
|
|
| -InjectedScript::InjectedScript(
|
| - InspectedContext* context, v8::Local<v8::Object> object,
|
| - std::unique_ptr<InjectedScriptNative> injectedScriptNative)
|
| - : m_context(context),
|
| - m_value(context->isolate(), object),
|
| - m_native(std::move(injectedScriptNative)) {}
|
| +InjectedScript::InjectedScript(InspectedContext* context,
|
| + v8::Local<v8::Object> object)
|
| + : m_context(context), m_value(context->isolate(), object) {}
|
|
|
| InjectedScript::~InjectedScript() {}
|
|
|
| @@ -165,7 +168,7 @@ void InjectedScript::releaseObject(const String16& objectId) {
|
| if (!object) return;
|
| int boundId = 0;
|
| if (!object->getInteger("id", &boundId)) return;
|
| - m_native->unbind(boundId);
|
| + unbindObject(boundId);
|
| }
|
|
|
| Response InjectedScript::wrapObject(
|
| @@ -266,19 +269,26 @@ std::unique_ptr<protocol::Runtime::RemoteObject> InjectedScript::wrapTable(
|
|
|
| Response InjectedScript::findObject(const RemoteObjectId& objectId,
|
| v8::Local<v8::Value>* outObject) const {
|
| - *outObject = m_native->objectForId(objectId.id());
|
| - if (outObject->IsEmpty())
|
| + auto it = m_idToWrappedObject.find(objectId.id());
|
| + if (it == m_idToWrappedObject.end())
|
| return Response::Error("Could not find object with given id");
|
| + *outObject = it->second.Get(m_context->isolate());
|
| return Response::OK();
|
| }
|
|
|
| String16 InjectedScript::objectGroupName(const RemoteObjectId& objectId) const {
|
| - return m_native->groupName(objectId.id());
|
| + if (objectId.id() <= 0) return String16();
|
| + auto it = m_idToObjectGroupName.find(objectId.id());
|
| + return it != m_idToObjectGroupName.end() ? it->second : String16();
|
| }
|
|
|
| void InjectedScript::releaseObjectGroup(const String16& objectGroup) {
|
| - m_native->releaseObjectGroup(objectGroup);
|
| if (objectGroup == "console") m_lastEvaluationResult.Reset();
|
| + if (objectGroup.isEmpty()) return;
|
| + auto it = m_nameToObjectGroup.find(objectGroup);
|
| + if (it == m_nameToObjectGroup.end()) return;
|
| + for (int id : it->second) unbindObject(id);
|
| + m_nameToObjectGroup.erase(it);
|
| }
|
|
|
| void InjectedScript::setCustomObjectFormatterEnabled(bool enabled) {
|
| @@ -536,4 +546,37 @@ Response InjectedScript::CallFrameScope::findInjectedScript(
|
| return session->findInjectedScript(remoteId.get(), m_injectedScript);
|
| }
|
|
|
| +InjectedScript* InjectedScript::fromInjectedScriptHost(
|
| + v8::Isolate* isolate, v8::Local<v8::Object> injectedScriptObject) {
|
| + v8::HandleScope handleScope(isolate);
|
| + v8::Local<v8::Context> context = isolate->GetCurrentContext();
|
| + v8::Local<v8::Private> privateKey = v8::Private::ForApi(
|
| + isolate, v8::String::NewFromUtf8(isolate, privateKeyName,
|
| + v8::NewStringType::kInternalized)
|
| + .ToLocalChecked());
|
| + v8::Local<v8::Value> value =
|
| + injectedScriptObject->GetPrivate(context, privateKey).ToLocalChecked();
|
| + DCHECK(value->IsExternal());
|
| + v8::Local<v8::External> external = value.As<v8::External>();
|
| + return static_cast<InjectedScript*>(external->Value());
|
| +}
|
| +
|
| +int InjectedScript::bindObject(v8::Local<v8::Value> value,
|
| + const String16& groupName) {
|
| + if (m_lastBoundObjectId <= 0) m_lastBoundObjectId = 1;
|
| + int id = m_lastBoundObjectId++;
|
| + m_idToWrappedObject[id].Reset(m_context->isolate(), value);
|
| +
|
| + if (!groupName.isEmpty() && id > 0) {
|
| + m_idToObjectGroupName[id] = groupName;
|
| + m_nameToObjectGroup[groupName].push_back(id);
|
| + }
|
| + return id;
|
| +}
|
| +
|
| +void InjectedScript::unbindObject(int id) {
|
| + m_idToWrappedObject.erase(id);
|
| + m_idToObjectGroupName.erase(id);
|
| +}
|
| +
|
| } // namespace v8_inspector
|
|
|