aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/inspector
diff options
context:
space:
mode:
authorMichaƫl Zasso <targos@protonmail.com>2017-08-16 15:56:03 +0200
committerAnna Henningsen <anna@addaleax.net>2017-09-13 16:16:22 +0200
commite202d85d34a76e9f7c8a90d9eb03d66633fc0676 (patch)
treefb513178e643b18664344820a630ab5d3f1374dd /deps/v8/src/inspector
parent694ef89bcfb8e186f2e2663d64369308b49a5f95 (diff)
downloadandroid-node-v8-e202d85d34a76e9f7c8a90d9eb03d66633fc0676.tar.gz
android-node-v8-e202d85d34a76e9f7c8a90d9eb03d66633fc0676.tar.bz2
android-node-v8-e202d85d34a76e9f7c8a90d9eb03d66633fc0676.zip
deps: cherry-pick f19b889 from upstream V8
Original commit message: [inspector] support for cases when embedder doesn't call contextDestroyed Node.js doesn't have good place to call contextDestroyed. We need to cleanup everything on our side to allow clients to not call contextDestroyed method. R=dgozman@chromium.org,eostroukhov@chromium.com Bug: none Change-Id: Ibe3f01fd18afbfa579e5db66ab6f174d5fad7c82 Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.linux:linux_chromium_rel_ng Reviewed-on: https://chromium-review.googlesource.com/575519 Reviewed-by: Dmitry Gozman <dgozman@chromium.org> Commit-Queue: Aleksey Kozyatinskiy <kozyatinskiy@chromium.org> Cr-Original-Commit-Position: refs/heads/master@{#46849} Reviewed-on: https://chromium-review.googlesource.com/596549 Cr-Commit-Position: refs/heads/master@{#47060} PR-URL: https://github.com/nodejs/node/pull/14730 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'deps/v8/src/inspector')
-rw-r--r--deps/v8/src/inspector/inspected-context.cc41
-rw-r--r--deps/v8/src/inspector/inspected-context.h3
-rw-r--r--deps/v8/src/inspector/v8-inspector-impl.cc4
-rw-r--r--deps/v8/src/inspector/v8-inspector-impl.h1
4 files changed, 49 insertions, 0 deletions
diff --git a/deps/v8/src/inspector/inspected-context.cc b/deps/v8/src/inspector/inspected-context.cc
index d7a2f810db..5b6b97185c 100644
--- a/deps/v8/src/inspector/inspected-context.cc
+++ b/deps/v8/src/inspector/inspected-context.cc
@@ -15,6 +15,39 @@
namespace v8_inspector {
+class InspectedContext::WeakCallbackData {
+ public:
+ WeakCallbackData(InspectedContext* context, V8InspectorImpl* inspector,
+ int groupId, int contextId)
+ : m_context(context),
+ m_inspector(inspector),
+ m_groupId(groupId),
+ m_contextId(contextId) {}
+
+ static void resetContext(const v8::WeakCallbackInfo<WeakCallbackData>& data) {
+ // InspectedContext is alive here because weak handler is still alive.
+ data.GetParameter()->m_context->m_weakCallbackData = nullptr;
+ data.GetParameter()->m_context->m_context.Reset();
+ data.SetSecondPassCallback(&callContextCollected);
+ }
+
+ static void callContextCollected(
+ const v8::WeakCallbackInfo<WeakCallbackData>& data) {
+ // InspectedContext can be dead here since anything can happen between first
+ // and second pass callback.
+ WeakCallbackData* callbackData = data.GetParameter();
+ callbackData->m_inspector->contextCollected(callbackData->m_groupId,
+ callbackData->m_contextId);
+ delete callbackData;
+ }
+
+ private:
+ InspectedContext* m_context;
+ V8InspectorImpl* m_inspector;
+ int m_groupId;
+ int m_contextId;
+};
+
InspectedContext::InspectedContext(V8InspectorImpl* inspector,
const V8ContextInfo& info, int contextId)
: m_inspector(inspector),
@@ -25,6 +58,11 @@ InspectedContext::InspectedContext(V8InspectorImpl* inspector,
m_humanReadableName(toString16(info.humanReadableName)),
m_auxData(toString16(info.auxData)) {
v8::debug::SetContextId(info.context, contextId);
+ m_weakCallbackData =
+ new WeakCallbackData(this, m_inspector, m_contextGroupId, m_contextId);
+ m_context.SetWeak(m_weakCallbackData,
+ &InspectedContext::WeakCallbackData::resetContext,
+ v8::WeakCallbackType::kParameter);
if (!info.hasMemoryOnConsole) return;
v8::Context::Scope contextScope(info.context);
v8::Local<v8::Object> global = info.context->Global();
@@ -38,6 +76,9 @@ InspectedContext::InspectedContext(V8InspectorImpl* inspector,
}
InspectedContext::~InspectedContext() {
+ // If we destory InspectedContext before weak callback is invoked then we need
+ // to delete data here.
+ if (!m_context.IsEmpty()) delete m_weakCallbackData;
}
// static
diff --git a/deps/v8/src/inspector/inspected-context.h b/deps/v8/src/inspector/inspected-context.h
index b32263bc2e..ac33071f62 100644
--- a/deps/v8/src/inspector/inspected-context.h
+++ b/deps/v8/src/inspector/inspected-context.h
@@ -47,6 +47,8 @@ class InspectedContext {
friend class V8InspectorImpl;
InspectedContext(V8InspectorImpl*, const V8ContextInfo&, int contextId);
+ class WeakCallbackData;
+
V8InspectorImpl* m_inspector;
v8::Global<v8::Context> m_context;
int m_contextId;
@@ -56,6 +58,7 @@ class InspectedContext {
const String16 m_auxData;
std::unordered_set<int> m_reportedSessionIds;
std::unordered_map<int, std::unique_ptr<InjectedScript>> m_injectedScripts;
+ WeakCallbackData* m_weakCallbackData;
DISALLOW_COPY_AND_ASSIGN(InspectedContext);
};
diff --git a/deps/v8/src/inspector/v8-inspector-impl.cc b/deps/v8/src/inspector/v8-inspector-impl.cc
index 6b8e7324f5..0a7b19a36a 100644
--- a/deps/v8/src/inspector/v8-inspector-impl.cc
+++ b/deps/v8/src/inspector/v8-inspector-impl.cc
@@ -203,6 +203,10 @@ void V8InspectorImpl::contextCreated(const V8ContextInfo& info) {
void V8InspectorImpl::contextDestroyed(v8::Local<v8::Context> context) {
int contextId = InspectedContext::contextId(context);
int groupId = contextGroupId(context);
+ contextCollected(groupId, contextId);
+}
+
+void V8InspectorImpl::contextCollected(int groupId, int contextId) {
m_contextIdToGroupIdMap.erase(contextId);
ConsoleStorageMap::iterator storageIt = m_consoleStorageMap.find(groupId);
diff --git a/deps/v8/src/inspector/v8-inspector-impl.h b/deps/v8/src/inspector/v8-inspector-impl.h
index 3effb39f7c..a7666dfd42 100644
--- a/deps/v8/src/inspector/v8-inspector-impl.h
+++ b/deps/v8/src/inspector/v8-inspector-impl.h
@@ -74,6 +74,7 @@ class V8InspectorImpl : public V8Inspector {
const StringView& state) override;
void contextCreated(const V8ContextInfo&) override;
void contextDestroyed(v8::Local<v8::Context>) override;
+ void contextCollected(int contextGroupId, int contextId);
void resetContextGroup(int contextGroupId) override;
void idleStarted() override;
void idleFinished() override;