Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(475)

Unified Diff: third_party/WebKit/Source/core/inspector/InspectorWorkerAgent.cpp

Issue 2951913002: [DevTools] Support multiple sessions in Target domain (Closed)
Patch Set: simplify Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/inspector/InspectorWorkerAgent.cpp
diff --git a/third_party/WebKit/Source/core/inspector/InspectorWorkerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorWorkerAgent.cpp
index fead9045b36c302993f7c81b7e17ea82a0d326af..2b6720066b5bbe42e8f68d9ca90e3ea2864d2fe9 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorWorkerAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorWorkerAgent.cpp
@@ -43,13 +43,10 @@ using protocol::Response;
namespace WorkerAgentState {
static const char kAutoAttach[] = "autoAttach";
static const char kWaitForDebuggerOnStart[] = "waitForDebuggerOnStart";
-static const char kAttachedWorkerIds[] = "attachedWorkerIds";
+static const char kAttachedProtocolIds[] = "attachedProtocolIds";
};
-namespace {
-// TODO(dgozman): support multiple sessions in protocol.
-static const int kSessionId = 1;
-} // namespace
+int InspectorWorkerAgent::last_session_id_ = 0;
InspectorWorkerAgent::InspectorWorkerAgent(InspectedFrames* inspected_frames)
: inspected_frames_(inspected_frames) {}
@@ -60,10 +57,10 @@ void InspectorWorkerAgent::Restore() {
if (!AutoAttachEnabled())
return;
instrumenting_agents_->addInspectorWorkerAgent(this);
- protocol::DictionaryValue* attached = AttachedWorkerIds();
+ protocol::DictionaryValue* attached = AttachedProtocolIds();
for (size_t i = 0; i < attached->size(); ++i)
GetFrontend()->detachedFromTarget(attached->at(i).first);
- state_->remove(WorkerAgentState::kAttachedWorkerIds);
+ state_->remove(WorkerAgentState::kAttachedProtocolIds);
ConnectToAllProxies();
}
@@ -74,7 +71,7 @@ Response InspectorWorkerAgent::disable() {
}
state_->setBoolean(WorkerAgentState::kAutoAttach, false);
state_->setBoolean(WorkerAgentState::kWaitForDebuggerOnStart, false);
- state_->remove(WorkerAgentState::kAttachedWorkerIds);
+ state_->remove(WorkerAgentState::kAttachedProtocolIds);
return Response::OK();
}
@@ -104,12 +101,14 @@ bool InspectorWorkerAgent::AutoAttachEnabled() {
return state_->booleanProperty(WorkerAgentState::kAutoAttach, false);
}
-Response InspectorWorkerAgent::sendMessageToTarget(const String& target_id,
+Response InspectorWorkerAgent::sendMessageToTarget(const String& session_id,
const String& message) {
- WorkerInspectorProxy* proxy = connected_proxies_.at(target_id);
- if (!proxy)
- return Response::Error("Not attached to a target with given id");
- proxy->SendMessageToInspector(kSessionId, message);
+ auto it = protocol_to_session_id_.find(session_id);
caseq 2017/06/27 18:29:30 This now looks confusing -- should we call the par
+ if (it == protocol_to_session_id_.end())
+ return Response::Error("No session with given id");
+ WorkerInspectorProxy* proxy = connected_proxies_.at(it->value);
+ DCHECK(proxy);
caseq 2017/06/27 18:29:30 No need for a DCHECK() in a case like this -- you'
+ proxy->SendMessageToInspector(it->value, message);
return Response::OK();
}
@@ -138,12 +137,20 @@ void InspectorWorkerAgent::DidStartWorker(WorkerInspectorProxy* proxy,
void InspectorWorkerAgent::WorkerTerminated(WorkerInspectorProxy* proxy) {
DCHECK(GetFrontend() && AutoAttachEnabled());
- if (connected_proxies_.find(proxy->InspectorId()) == connected_proxies_.end())
- return;
- AttachedWorkerIds()->remove(proxy->InspectorId());
- GetFrontend()->detachedFromTarget(proxy->InspectorId());
- proxy->DisconnectFromInspector(kSessionId, this);
- connected_proxies_.erase(proxy->InspectorId());
+ Vector<String> protocol_ids;
+ for (auto& it : protocol_to_session_id_) {
+ if (connected_proxies_.at(it.value) == proxy)
+ protocol_ids.push_back(it.key);
+ }
+ for (const String& protocol_id : protocol_ids) {
+ AttachedProtocolIds()->remove(protocol_id);
+ GetFrontend()->detachedFromTarget(protocol_id);
+ int session_id = protocol_to_session_id_.at(protocol_id);
+ proxy->DisconnectFromInspector(session_id, this);
+ connected_proxies_.erase(session_id);
+ protocol_to_session_id_.erase(protocol_id);
+ session_to_protocol_id_.erase(session_id);
+ }
}
void InspectorWorkerAgent::ConnectToAllProxies() {
@@ -152,19 +159,22 @@ void InspectorWorkerAgent::ConnectToAllProxies() {
DCHECK(proxy->GetExecutionContext()->IsDocument());
Document* document = ToDocument(proxy->GetExecutionContext());
if (document->GetFrame() &&
- inspected_frames_->Contains(document->GetFrame()))
+ inspected_frames_->Contains(document->GetFrame())) {
ConnectToProxy(proxy, false);
+ }
}
}
void InspectorWorkerAgent::DisconnectFromAllProxies(bool report_to_frontend) {
- for (auto& id_proxy : connected_proxies_) {
+ for (auto& it : protocol_to_session_id_) {
if (report_to_frontend) {
- AttachedWorkerIds()->remove(id_proxy.key);
- GetFrontend()->detachedFromTarget(id_proxy.key);
+ AttachedProtocolIds()->remove(it.key);
+ GetFrontend()->detachedFromTarget(it.key);
}
- id_proxy.value->DisconnectFromInspector(kSessionId, this);
+ connected_proxies_.at(it.value)->DisconnectFromInspector(it.value, this);
}
+ protocol_to_session_id_.clear();
+ session_to_protocol_id_.clear();
connected_proxies_.clear();
}
@@ -175,33 +185,36 @@ void InspectorWorkerAgent::DidCommitLoadForLocalFrame(LocalFrame* frame) {
// During navigation workers from old page may die after a while.
// Usually, it's fine to report them terminated later, but some tests
// expect strict set of workers, and we reuse renderer between tests.
- for (auto& id_proxy : connected_proxies_) {
- AttachedWorkerIds()->remove(id_proxy.key);
- GetFrontend()->detachedFromTarget(id_proxy.key);
- id_proxy.value->DisconnectFromInspector(kSessionId, this);
- }
- connected_proxies_.clear();
+ DisconnectFromAllProxies(true);
}
-protocol::DictionaryValue* InspectorWorkerAgent::AttachedWorkerIds() {
+protocol::DictionaryValue* InspectorWorkerAgent::AttachedProtocolIds() {
protocol::DictionaryValue* ids =
- state_->getObject(WorkerAgentState::kAttachedWorkerIds);
+ state_->getObject(WorkerAgentState::kAttachedProtocolIds);
if (!ids) {
std::unique_ptr<protocol::DictionaryValue> new_ids =
protocol::DictionaryValue::create();
ids = new_ids.get();
- state_->setObject(WorkerAgentState::kAttachedWorkerIds, std::move(new_ids));
+ state_->setObject(WorkerAgentState::kAttachedProtocolIds,
+ std::move(new_ids));
}
return ids;
}
void InspectorWorkerAgent::ConnectToProxy(WorkerInspectorProxy* proxy,
bool waiting_for_debugger) {
- connected_proxies_.Set(proxy->InspectorId(), proxy);
- proxy->ConnectToInspector(kSessionId, this);
+ int session_id = ++last_session_id_;
caseq 2017/06/27 18:29:30 This looks more line proxy_id to me -- the word se
+ connected_proxies_.Set(session_id, proxy);
+
+ String protocol_id = proxy->InspectorId() + "-" + String::Number(session_id);
+ protocol_to_session_id_.Set(protocol_id, session_id);
+ session_to_protocol_id_.Set(session_id, protocol_id);
+
+ proxy->ConnectToInspector(session_id, this);
DCHECK(GetFrontend());
- AttachedWorkerIds()->setBoolean(proxy->InspectorId(), true);
- GetFrontend()->attachedToTarget(protocol::Target::TargetInfo::create()
+ AttachedProtocolIds()->setBoolean(protocol_id, true);
+ GetFrontend()->attachedToTarget(protocol_id,
+ protocol::Target::TargetInfo::create()
.setTargetId(proxy->InspectorId())
.setType("worker")
.setTitle(proxy->Url())
@@ -214,8 +227,10 @@ void InspectorWorkerAgent::DispatchMessageFromWorker(
WorkerInspectorProxy* proxy,
int session_id,
const String& message) {
- DCHECK(session_id == kSessionId);
- GetFrontend()->receivedMessageFromTarget(proxy->InspectorId(), message);
+ auto it = session_to_protocol_id_.find(session_id);
+ if (it == session_to_protocol_id_.end())
+ return;
+ GetFrontend()->receivedMessageFromTarget(it->value, message);
}
DEFINE_TRACE(InspectorWorkerAgent) {

Powered by Google App Engine
This is Rietveld 408576698