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) { |