[DevTools] Simplify managing state in ServiceWorkerDevToolsAgentHost
Bug: 776009
Change-Id: I43af9e59b836e97524f057e4b60559b239f254bc
Reviewed-on: https://chromium-review.googlesource.com/862989
Commit-Queue: Dmitry Gozman <dgozman@chromium.org>
Reviewed-by: Pavel Feldman <pfeldman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#529176}
diff --git a/content/browser/devtools/protocol/target_auto_attacher.cc b/content/browser/devtools/protocol/target_auto_attacher.cc
index f979ec9..a5532f3 100644
--- a/content/browser/devtools/protocol/target_auto_attacher.cc
+++ b/content/browser/devtools/protocol/target_auto_attacher.cc
@@ -180,10 +180,8 @@
auto matching = GetMatchingServiceWorkers(browser_context, frame_urls_);
Hosts new_hosts;
- for (const auto& pair : matching) {
- if (pair.second->IsReadyForInspection())
- new_hosts.insert(pair.second);
- }
+ for (const auto& pair : matching)
+ new_hosts.insert(pair.second);
ReattachTargetsOfType(new_hosts, DevToolsAgentHost::kTypeServiceWorker,
waiting_for_debugger);
}
@@ -239,29 +237,22 @@
// -------- ServiceWorkerDevToolsManager::Observer ----------
-void TargetAutoAttacher::WorkerCreated(ServiceWorkerDevToolsAgentHost* host) {
+void TargetAutoAttacher::WorkerCreated(ServiceWorkerDevToolsAgentHost* host,
+ bool* should_pause_on_start) {
BrowserContext* browser_context = nullptr;
if (render_frame_host_)
browser_context = render_frame_host_->GetProcess()->GetBrowserContext();
auto hosts = GetMatchingServiceWorkers(browser_context, frame_urls_);
- if (hosts.find(host->GetId()) != hosts.end() && !host->IsAttached() &&
- !host->IsPausedForDebugOnStart() && wait_for_debugger_on_start_) {
- host->PauseForDebugOnStart();
+ if (hosts.find(host->GetId()) != hosts.end()) {
+ *should_pause_on_start = wait_for_debugger_on_start_;
+ Hosts new_hosts;
+ for (const auto& pair : hosts)
+ new_hosts.insert(pair.second);
+ ReattachTargetsOfType(new_hosts, DevToolsAgentHost::kTypeServiceWorker,
+ wait_for_debugger_on_start_);
}
}
-void TargetAutoAttacher::WorkerReadyForInspection(
- ServiceWorkerDevToolsAgentHost* host) {
- DCHECK(host->IsReadyForInspection());
- if (ServiceWorkerDevToolsManager::GetInstance()
- ->debug_service_worker_on_start()) {
- // When debug_service_worker_on_start is true, a new DevTools window will
- // be opened in ServiceWorkerDevToolsManager::WorkerReadyForInspection.
- return;
- }
- ReattachServiceWorkers(host->IsPausedForDebugOnStart());
-}
-
void TargetAutoAttacher::WorkerVersionInstalled(
ServiceWorkerDevToolsAgentHost* host) {
ReattachServiceWorkers(false);
diff --git a/content/browser/devtools/protocol/target_auto_attacher.h b/content/browser/devtools/protocol/target_auto_attacher.h
index c0b00481..5af8986 100644
--- a/content/browser/devtools/protocol/target_auto_attacher.h
+++ b/content/browser/devtools/protocol/target_auto_attacher.h
@@ -46,8 +46,8 @@
bool waiting_for_debugger);
// ServiceWorkerDevToolsManager::Observer implementation.
- void WorkerCreated(ServiceWorkerDevToolsAgentHost* host) override;
- void WorkerReadyForInspection(ServiceWorkerDevToolsAgentHost* host) override;
+ void WorkerCreated(ServiceWorkerDevToolsAgentHost* host,
+ bool* should_pause_on_start) override;
void WorkerVersionInstalled(ServiceWorkerDevToolsAgentHost* host) override;
void WorkerVersionDoomed(ServiceWorkerDevToolsAgentHost* host) override;
void WorkerDestroyed(ServiceWorkerDevToolsAgentHost* host) override;
diff --git a/content/browser/devtools/service_worker_devtools_agent_host.cc b/content/browser/devtools/service_worker_devtools_agent_host.cc
index 3cde8b9b..400eb0e 100644
--- a/content/browser/devtools/service_worker_devtools_agent_host.cc
+++ b/content/browser/devtools/service_worker_devtools_agent_host.cc
@@ -52,7 +52,7 @@
bool is_installed_version,
const base::UnguessableToken& devtools_worker_token)
: DevToolsAgentHostImpl(devtools_worker_token.ToString()),
- state_(WORKER_UNINSPECTED),
+ state_(WORKER_NOT_READY),
devtools_worker_token_(devtools_worker_token),
worker_process_id_(worker_process_id),
worker_route_id_(worker_route_id),
@@ -116,44 +116,43 @@
}
void ServiceWorkerDevToolsAgentHost::AttachSession(DevToolsSession* session) {
- if (state_ != WORKER_INSPECTED) {
- state_ = WORKER_INSPECTED;
- AttachToWorker();
- }
- if (RenderProcessHost* host = RenderProcessHost::FromID(worker_process_id_)) {
- session->SetRenderer(host, nullptr);
- host->Send(
- new DevToolsAgentMsg_Attach(worker_route_id_, session->session_id()));
+ if (state_ == WORKER_READY) {
+ if (sessions().size() == 1) {
+ AttachToWorker();
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::BindOnce(&SetDevToolsAttachedOnIO,
+ context_weak_, version_id_, true));
+ }
+ if (RenderProcessHost* host =
+ RenderProcessHost::FromID(worker_process_id_)) {
+ session->SetRenderer(host, nullptr);
+ host->Send(
+ new DevToolsAgentMsg_Attach(worker_route_id_, session->session_id()));
+ }
}
session->SetFallThroughForNotFound(true);
session->AddHandler(base::WrapUnique(new protocol::InspectorHandler()));
session->AddHandler(base::WrapUnique(new protocol::NetworkHandler(GetId())));
session->AddHandler(base::WrapUnique(new protocol::SchemaHandler()));
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
- base::BindOnce(&SetDevToolsAttachedOnIO,
- context_weak_, version_id_, true));
}
void ServiceWorkerDevToolsAgentHost::DetachSession(int session_id) {
- if (RenderProcessHost* host = RenderProcessHost::FromID(worker_process_id_))
- host->Send(new DevToolsAgentMsg_Detach(worker_route_id_, session_id));
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
- base::BindOnce(&SetDevToolsAttachedOnIO,
- context_weak_, version_id_, false));
- if (state_ == WORKER_INSPECTED) {
- state_ = WORKER_UNINSPECTED;
- DetachFromWorker();
- } else if (state_ == WORKER_PAUSED_FOR_REATTACH) {
- state_ = WORKER_UNINSPECTED;
+ if (state_ == WORKER_READY) {
+ if (RenderProcessHost* host = RenderProcessHost::FromID(worker_process_id_))
+ host->Send(new DevToolsAgentMsg_Detach(worker_route_id_, session_id));
+ if (sessions().empty()) {
+ DetachFromWorker();
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::BindOnce(&SetDevToolsAttachedOnIO, context_weak_, version_id_,
+ false));
+ }
}
}
bool ServiceWorkerDevToolsAgentHost::DispatchProtocolMessage(
DevToolsSession* session,
const std::string& message) {
- if (state_ != WORKER_INSPECTED)
- return true;
-
int call_id = 0;
std::string method;
if (session->Dispatch(message, &call_id, &method) !=
@@ -161,11 +160,14 @@
return true;
}
- if (RenderProcessHost* host = RenderProcessHost::FromID(worker_process_id_)) {
- host->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend(
- worker_route_id_, session->session_id(), call_id, method, message));
- session->waiting_messages()[call_id] = {method, message};
+ if (state_ == WORKER_READY) {
+ if (RenderProcessHost* host =
+ RenderProcessHost::FromID(worker_process_id_)) {
+ host->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend(
+ worker_route_id_, session->session_id(), call_id, method, message));
+ }
}
+ session->waiting_messages()[call_id] = {method, message};
return true;
}
@@ -181,53 +183,35 @@
return handled;
}
-void ServiceWorkerDevToolsAgentHost::PauseForDebugOnStart() {
- DCHECK(state_ == WORKER_UNINSPECTED);
- state_ = WORKER_PAUSED_FOR_DEBUG_ON_START;
-}
-
-bool ServiceWorkerDevToolsAgentHost::IsPausedForDebugOnStart() {
- return state_ == WORKER_PAUSED_FOR_DEBUG_ON_START ||
- state_ == WORKER_READY_FOR_DEBUG_ON_START;
-}
-
-bool ServiceWorkerDevToolsAgentHost::IsReadyForInspection() {
- return state_ == WORKER_INSPECTED || state_ == WORKER_UNINSPECTED ||
- state_ == WORKER_READY_FOR_DEBUG_ON_START;
-}
-
void ServiceWorkerDevToolsAgentHost::WorkerReadyForInspection() {
- if (state_ == WORKER_PAUSED_FOR_REATTACH) {
- DCHECK(IsAttached());
- state_ = WORKER_INSPECTED;
+ DCHECK_EQ(WORKER_NOT_READY, state_);
+ state_ = WORKER_READY;
+ if (!sessions().empty()) {
AttachToWorker();
- if (RenderProcessHost* host =
- RenderProcessHost::FromID(worker_process_id_)) {
- for (DevToolsSession* session : sessions()) {
- session->SetRenderer(host, nullptr);
- host->Send(new DevToolsAgentMsg_Reattach(
- worker_route_id_, session->session_id(), session->state_cookie()));
- for (const auto& pair : session->waiting_messages()) {
- int call_id = pair.first;
- const DevToolsSession::Message& message = pair.second;
- host->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend(
- worker_route_id_, session->session_id(), call_id, message.method,
- message.message));
- }
- }
- }
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
base::BindOnce(&SetDevToolsAttachedOnIO,
context_weak_, version_id_, true));
- } else if (state_ == WORKER_PAUSED_FOR_DEBUG_ON_START) {
- state_ = WORKER_READY_FOR_DEBUG_ON_START;
+ }
+ if (RenderProcessHost* host = RenderProcessHost::FromID(worker_process_id_)) {
+ for (DevToolsSession* session : sessions()) {
+ session->SetRenderer(host, nullptr);
+ host->Send(new DevToolsAgentMsg_Reattach(
+ worker_route_id_, session->session_id(), session->state_cookie()));
+ for (const auto& pair : session->waiting_messages()) {
+ int call_id = pair.first;
+ const DevToolsSession::Message& message = pair.second;
+ host->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend(
+ worker_route_id_, session->session_id(), call_id, message.method,
+ message.message));
+ }
+ }
}
}
void ServiceWorkerDevToolsAgentHost::WorkerRestarted(int worker_process_id,
int worker_route_id) {
DCHECK_EQ(WORKER_TERMINATED, state_);
- state_ = IsAttached() ? WORKER_PAUSED_FOR_REATTACH : WORKER_UNINSPECTED;
+ state_ = WORKER_NOT_READY;
worker_process_id_ = worker_process_id;
worker_route_id_ = worker_route_id;
RenderProcessHost* host = RenderProcessHost::FromID(worker_process_id_);
@@ -237,15 +221,13 @@
void ServiceWorkerDevToolsAgentHost::WorkerDestroyed() {
DCHECK_NE(WORKER_TERMINATED, state_);
- if (state_ == WORKER_INSPECTED) {
- DCHECK(IsAttached());
- for (auto* inspector : protocol::InspectorHandler::ForAgentHost(this))
- inspector->TargetCrashed();
- DetachFromWorker();
- for (DevToolsSession* session : sessions())
- session->SetRenderer(nullptr, nullptr);
- }
state_ = WORKER_TERMINATED;
+ for (auto* inspector : protocol::InspectorHandler::ForAgentHost(this))
+ inspector->TargetCrashed();
+ for (DevToolsSession* session : sessions())
+ session->SetRenderer(nullptr, nullptr);
+ if (!sessions().empty())
+ DetachFromWorker();
}
void ServiceWorkerDevToolsAgentHost::AttachToWorker() {
diff --git a/content/browser/devtools/service_worker_devtools_agent_host.h b/content/browser/devtools/service_worker_devtools_agent_host.h
index ab2f075..f1c6c12 100644
--- a/content/browser/devtools/service_worker_devtools_agent_host.h
+++ b/content/browser/devtools/service_worker_devtools_agent_host.h
@@ -56,11 +56,8 @@
// IPC::Listener implementation.
bool OnMessageReceived(const IPC::Message& msg) override;
- void PauseForDebugOnStart();
- bool IsPausedForDebugOnStart();
- bool IsReadyForInspection();
- void WorkerReadyForInspection();
void WorkerRestarted(int worker_process_id, int worker_route_id);
+ void WorkerReadyForInspection();
void WorkerDestroyed();
void WorkerVersionInstalled();
void WorkerVersionDoomed();
@@ -81,21 +78,17 @@
bool Matches(const ServiceWorkerContextCore* context, int64_t version_id);
private:
- enum WorkerState {
- WORKER_UNINSPECTED,
- WORKER_INSPECTED,
- WORKER_TERMINATED,
- WORKER_PAUSED_FOR_DEBUG_ON_START,
- WORKER_READY_FOR_DEBUG_ON_START,
- WORKER_PAUSED_FOR_REATTACH,
- };
-
~ServiceWorkerDevToolsAgentHost() override;
void AttachToWorker();
void DetachFromWorker();
void OnDispatchOnInspectorFrontend(const DevToolsMessageChunk& message);
+ enum WorkerState {
+ WORKER_NOT_READY,
+ WORKER_READY,
+ WORKER_TERMINATED,
+ };
WorkerState state_;
base::UnguessableToken devtools_worker_token_;
int worker_process_id_;
diff --git a/content/browser/devtools/service_worker_devtools_manager.cc b/content/browser/devtools/service_worker_devtools_manager.cc
index c4541a3d..34d0f65 100644
--- a/content/browser/devtools/service_worker_devtools_manager.cc
+++ b/content/browser/devtools/service_worker_devtools_manager.cc
@@ -69,11 +69,13 @@
url, scope, is_installed_version,
*devtools_worker_token);
live_hosts_[worker_id] = host;
- for (auto& observer : observer_list_)
- observer.WorkerCreated(host.get());
- if (debug_service_worker_on_start_)
- host->PauseForDebugOnStart();
- *pause_on_start = host->IsPausedForDebugOnStart();
+ *pause_on_start = debug_service_worker_on_start_;
+ for (auto& observer : observer_list_) {
+ bool should_pause_on_start = false;
+ observer.WorkerCreated(host.get(), &should_pause_on_start);
+ if (should_pause_on_start)
+ *pause_on_start = true;
+ }
return;
}
@@ -81,8 +83,8 @@
terminated_hosts_.erase(it);
live_hosts_[worker_id] = agent_host;
agent_host->WorkerRestarted(worker_process_id, worker_route_id);
- *devtools_worker_token = agent_host->devtools_worker_token();
*pause_on_start = agent_host->IsAttached();
+ *devtools_worker_token = agent_host->devtools_worker_token();
}
void ServiceWorkerDevToolsManager::WorkerReadyForInspection(
@@ -95,11 +97,8 @@
return;
scoped_refptr<ServiceWorkerDevToolsAgentHost> host = it->second;
host->WorkerReadyForInspection();
- for (auto& observer : observer_list_)
- observer.WorkerReadyForInspection(host.get());
-
- // Then bring up UI for the ones not picked by other clients.
- if (host->IsPausedForDebugOnStart() && !host->IsAttached())
+ // Bring up UI for the ones not picked by other clients.
+ if (debug_service_worker_on_start_ && !host->IsAttached())
host->Inspect();
}
diff --git a/content/browser/devtools/service_worker_devtools_manager.h b/content/browser/devtools/service_worker_devtools_manager.h
index 38fd5cd..226180a0 100644
--- a/content/browser/devtools/service_worker_devtools_manager.h
+++ b/content/browser/devtools/service_worker_devtools_manager.h
@@ -35,9 +35,8 @@
public:
class Observer {
public:
- virtual void WorkerCreated(ServiceWorkerDevToolsAgentHost* host) {}
- virtual void WorkerReadyForInspection(
- ServiceWorkerDevToolsAgentHost* host) {}
+ virtual void WorkerCreated(ServiceWorkerDevToolsAgentHost* host,
+ bool* should_pause_on_start) {}
virtual void WorkerVersionInstalled(ServiceWorkerDevToolsAgentHost* host) {}
virtual void WorkerVersionDoomed(ServiceWorkerDevToolsAgentHost* host) {}
virtual void WorkerDestroyed(ServiceWorkerDevToolsAgentHost* host) {}
diff --git a/content/browser/devtools/shared_worker_devtools_agent_host.cc b/content/browser/devtools/shared_worker_devtools_agent_host.cc
index 931303a..10bd7e8e 100644
--- a/content/browser/devtools/shared_worker_devtools_agent_host.cc
+++ b/content/browser/devtools/shared_worker_devtools_agent_host.cc
@@ -22,6 +22,7 @@
SharedWorkerHost* worker_host,
const base::UnguessableToken& devtools_worker_token)
: DevToolsAgentHostImpl(devtools_worker_token.ToString()),
+ state_(WORKER_NOT_READY),
worker_host_(worker_host),
devtools_worker_token_(devtools_worker_token),
instance_(new SharedWorkerInstance(*worker_host->instance())) {
@@ -68,8 +69,8 @@
session->AddHandler(std::make_unique<protocol::NetworkHandler>(GetId()));
session->AddHandler(std::make_unique<protocol::SchemaHandler>());
session->SetRenderer(GetProcess(), nullptr);
- if (!waiting_ready_for_reattach_ && EnsureAgent())
- session->AttachToAgent(agent_ptr_);
+ if (state_ == WORKER_READY)
+ session->AttachToAgent(EnsureAgent());
}
void SharedWorkerDevToolsAgentHost::DetachSession(int session_id) {
@@ -96,14 +97,11 @@
}
void SharedWorkerDevToolsAgentHost::WorkerReadyForInspection() {
+ DCHECK_EQ(WORKER_NOT_READY, state_);
DCHECK(worker_host_);
- if (!waiting_ready_for_reattach_)
- return;
- waiting_ready_for_reattach_ = false;
- if (!EnsureAgent())
- return;
+ state_ = WORKER_READY;
for (DevToolsSession* session : sessions()) {
- session->ReattachToAgent(agent_ptr_);
+ session->ReattachToAgent(EnsureAgent());
for (const auto& pair : session->waiting_messages()) {
int call_id = pair.first;
const DevToolsSession::Message& message = pair.second;
@@ -113,18 +111,20 @@
}
}
-bool SharedWorkerDevToolsAgentHost::WorkerRestarted(
+void SharedWorkerDevToolsAgentHost::WorkerRestarted(
SharedWorkerHost* worker_host) {
+ DCHECK_EQ(WORKER_TERMINATED, state_);
DCHECK(!worker_host_);
+ state_ = WORKER_NOT_READY;
worker_host_ = worker_host;
for (DevToolsSession* session : sessions())
session->SetRenderer(GetProcess(), nullptr);
- waiting_ready_for_reattach_ = IsAttached();
- return waiting_ready_for_reattach_;
}
void SharedWorkerDevToolsAgentHost::WorkerDestroyed() {
+ DCHECK_NE(WORKER_TERMINATED, state_);
DCHECK(worker_host_);
+ state_ = WORKER_TERMINATED;
for (auto* inspector : protocol::InspectorHandler::ForAgentHost(this))
inspector->TargetCrashed();
for (DevToolsSession* session : sessions())
@@ -138,12 +138,13 @@
: nullptr;
}
-bool SharedWorkerDevToolsAgentHost::EnsureAgent() {
- if (!worker_host_)
- return false;
+const blink::mojom::DevToolsAgentAssociatedPtr&
+SharedWorkerDevToolsAgentHost::EnsureAgent() {
+ DCHECK_EQ(WORKER_READY, state_);
+ DCHECK(worker_host_);
if (!agent_ptr_)
worker_host_->GetDevToolsAgent(mojo::MakeRequest(&agent_ptr_));
- return true;
+ return agent_ptr_;
}
} // namespace content
diff --git a/content/browser/devtools/shared_worker_devtools_agent_host.h b/content/browser/devtools/shared_worker_devtools_agent_host.h
index d59ac31..3f7d2048 100644
--- a/content/browser/devtools/shared_worker_devtools_agent_host.h
+++ b/content/browser/devtools/shared_worker_devtools_agent_host.h
@@ -41,8 +41,7 @@
bool Matches(SharedWorkerHost* worker_host);
void WorkerReadyForInspection();
- // Returns whether the worker should be paused for reattach.
- bool WorkerRestarted(SharedWorkerHost* worker_host);
+ void WorkerRestarted(SharedWorkerHost* worker_host);
void WorkerDestroyed();
const base::UnguessableToken& devtools_worker_token() const {
@@ -50,17 +49,20 @@
}
private:
- friend class SharedWorkerDevToolsManagerTest;
-
~SharedWorkerDevToolsAgentHost() override;
RenderProcessHost* GetProcess();
- bool EnsureAgent();
+ const blink::mojom::DevToolsAgentAssociatedPtr& EnsureAgent();
+ enum WorkerState {
+ WORKER_NOT_READY,
+ WORKER_READY,
+ WORKER_TERMINATED,
+ };
+ WorkerState state_;
SharedWorkerHost* worker_host_;
blink::mojom::DevToolsAgentAssociatedPtr agent_ptr_;
base::UnguessableToken devtools_worker_token_;
std::unique_ptr<SharedWorkerInstance> instance_;
- bool waiting_ready_for_reattach_ = false;
DISALLOW_COPY_AND_ASSIGN(SharedWorkerDevToolsAgentHost);
};
diff --git a/content/browser/devtools/shared_worker_devtools_manager.cc b/content/browser/devtools/shared_worker_devtools_manager.cc
index 779f122c..5731e4bb 100644
--- a/content/browser/devtools/shared_worker_devtools_manager.cc
+++ b/content/browser/devtools/shared_worker_devtools_manager.cc
@@ -45,7 +45,8 @@
SharedWorkerDevToolsAgentHost* agent_host = *it;
terminated_hosts_.erase(it);
live_hosts_[worker_host] = agent_host;
- *pause_on_start = agent_host->WorkerRestarted(worker_host);
+ agent_host->WorkerRestarted(worker_host);
+ *pause_on_start = agent_host->IsAttached();
*devtools_worker_token = agent_host->devtools_worker_token();
}
diff --git a/content/browser/devtools/shared_worker_devtools_manager.h b/content/browser/devtools/shared_worker_devtools_manager.h
index becbdd0..a937f44 100644
--- a/content/browser/devtools/shared_worker_devtools_manager.h
+++ b/content/browser/devtools/shared_worker_devtools_manager.h
@@ -28,6 +28,7 @@
void AddAllAgentHosts(
std::vector<scoped_refptr<SharedWorkerDevToolsAgentHost>>* result);
+ void AgentHostDestroyed(SharedWorkerDevToolsAgentHost* agent_host);
void WorkerCreated(SharedWorkerHost* worker_host,
bool* pause_on_start,
@@ -37,14 +38,9 @@
private:
friend struct base::DefaultSingletonTraits<SharedWorkerDevToolsManager>;
- friend class SharedWorkerDevToolsAgentHost;
- friend class SharedWorkerDevToolsManagerTest;
- FRIEND_TEST_ALL_PREFIXES(SharedWorkerDevToolsManagerTest, BasicTest);
- FRIEND_TEST_ALL_PREFIXES(SharedWorkerDevToolsManagerTest, AttachTest);
SharedWorkerDevToolsManager();
~SharedWorkerDevToolsManager();
- void AgentHostDestroyed(SharedWorkerDevToolsAgentHost* agent_host);
// We retatin agent hosts as long as the shared worker is alive.
std::map<SharedWorkerHost*, scoped_refptr<SharedWorkerDevToolsAgentHost>>
diff --git a/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.cpp b/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.cpp
index 7cdadf5..d19a928 100644
--- a/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebDevToolsAgentImpl.cpp
@@ -533,7 +533,8 @@
String state = saved_state;
InspectorSession* session = InitializeSession(session_id, &state);
session->Restore();
- if (worker_client_)
+ // TODO(dgozman): use the optional instead of checking for empty.
+ if (worker_client_ && !state.IsEmpty())
worker_client_->ResumeStartup();
}
diff --git a/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp b/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
index 42e3ddf..b2a3b36 100644
--- a/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
+++ b/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
@@ -208,7 +208,6 @@
WebDevToolsAgentImpl* devtools_agent = shadow_page_->DevToolsAgent();
if (devtools_agent)
devtools_agent->Reattach(session_id, saved_state);
- ResumeStartup();
}
void WebEmbeddedWorkerImpl::DetachDevTools(int session_id) {