Line data Source code
1 : // Copyright 2015 the V8 project authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file.
4 :
5 : #include "src/inspector/injected-script-native.h"
6 :
7 : namespace v8_inspector {
8 :
9 4109 : InjectedScriptNative::InjectedScriptNative(v8::Isolate* isolate)
10 16436 : : m_lastBoundObjectId(1), m_isolate(isolate) {}
11 :
12 : static const char privateKeyName[] = "v8-inspector#injectedScript";
13 :
14 8218 : InjectedScriptNative::~InjectedScriptNative() {}
15 :
16 4109 : void InjectedScriptNative::setOnInjectedScriptHost(
17 : v8::Local<v8::Object> injectedScriptHost) {
18 4109 : v8::HandleScope handleScope(m_isolate);
19 4109 : v8::Local<v8::External> external = v8::External::New(m_isolate, this);
20 : v8::Local<v8::Private> privateKey = v8::Private::ForApi(
21 : m_isolate, v8::String::NewFromUtf8(m_isolate, privateKeyName,
22 4109 : v8::NewStringType::kInternalized)
23 8218 : .ToLocalChecked());
24 : injectedScriptHost->SetPrivate(m_isolate->GetCurrentContext(), privateKey,
25 8218 : external);
26 4109 : }
27 :
28 3780575 : InjectedScriptNative* InjectedScriptNative::fromInjectedScriptHost(
29 : v8::Isolate* isolate, v8::Local<v8::Object> injectedScriptObject) {
30 3780575 : v8::HandleScope handleScope(isolate);
31 3780575 : v8::Local<v8::Context> context = isolate->GetCurrentContext();
32 : v8::Local<v8::Private> privateKey = v8::Private::ForApi(
33 : isolate, v8::String::NewFromUtf8(isolate, privateKeyName,
34 : v8::NewStringType::kInternalized)
35 7561150 : .ToLocalChecked());
36 : v8::Local<v8::Value> value =
37 3780575 : injectedScriptObject->GetPrivate(context, privateKey).ToLocalChecked();
38 : DCHECK(value->IsExternal());
39 : v8::Local<v8::External> external = value.As<v8::External>();
40 3780575 : return static_cast<InjectedScriptNative*>(external->Value());
41 : }
42 :
43 3780575 : int InjectedScriptNative::bind(v8::Local<v8::Value> value,
44 : const String16& groupName) {
45 3780575 : if (m_lastBoundObjectId <= 0) m_lastBoundObjectId = 1;
46 3780575 : int id = m_lastBoundObjectId++;
47 : m_idToWrappedObject.insert(
48 7561150 : std::make_pair(id, v8::Global<v8::Value>(m_isolate, value)));
49 3780575 : addObjectToGroup(id, groupName);
50 3780575 : return id;
51 : }
52 :
53 6 : void InjectedScriptNative::unbind(int id) {
54 : m_idToWrappedObject.erase(id);
55 : m_idToObjectGroupName.erase(id);
56 6 : }
57 :
58 107328 : v8::Local<v8::Value> InjectedScriptNative::objectForId(int id) {
59 : auto iter = m_idToWrappedObject.find(id);
60 107328 : return iter != m_idToWrappedObject.end() ? iter->second.Get(m_isolate)
61 321984 : : v8::Local<v8::Value>();
62 : }
63 :
64 3780575 : void InjectedScriptNative::addObjectToGroup(int objectId,
65 : const String16& groupName) {
66 3780575 : if (groupName.isEmpty()) return;
67 3769822 : if (objectId <= 0) return;
68 : m_idToObjectGroupName[objectId] = groupName;
69 : m_nameToObjectGroup[groupName].push_back(
70 3769822 : objectId); // Creates an empty vector if key is not there
71 : }
72 :
73 64524 : void InjectedScriptNative::releaseObjectGroup(const String16& groupName) {
74 64524 : if (groupName.isEmpty()) return;
75 : NameToObjectGroup::iterator groupIt = m_nameToObjectGroup.find(groupName);
76 64524 : if (groupIt == m_nameToObjectGroup.end()) return;
77 3000335 : for (int id : groupIt->second) unbind(id);
78 : m_nameToObjectGroup.erase(groupIt);
79 : }
80 :
81 107298 : String16 InjectedScriptNative::groupName(int objectId) const {
82 107298 : if (objectId <= 0) return String16();
83 : IdToObjectGroupName::const_iterator iterator =
84 : m_idToObjectGroupName.find(objectId);
85 : return iterator != m_idToObjectGroupName.end() ? iterator->second
86 107298 : : String16();
87 : }
88 :
89 : } // namespace v8_inspector
|