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

Unified Diff: content/browser/devtools/worker_devtools_manager.cc

Issue 11633035: DevTools: prepare workers for DevToolsManager::Attach(Detach)ClientHost removal. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years 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
« no previous file with comments | « content/browser/devtools/worker_devtools_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/devtools/worker_devtools_manager.cc
diff --git a/content/browser/devtools/worker_devtools_manager.cc b/content/browser/devtools/worker_devtools_manager.cc
index f341c8291485e4f97eeb6335aab9d55bd4026b9a..a837f554044d98a20e8ad39f0d1704e6ef9fcf3f 100644
--- a/content/browser/devtools/worker_devtools_manager.cc
+++ b/content/browser/devtools/worker_devtools_manager.cc
@@ -42,7 +42,8 @@ public:
instance_->map_[id] = host;
}
static void Remove(WorkerId id) {
- DCHECK(instance_);
+ if (!instance_)
+ return;
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
Instances& map = instance_->map_;
map.erase(id);
@@ -91,9 +92,18 @@ struct WorkerDevToolsManager::TerminatedInspectedWorker {
class WorkerDevToolsManager::WorkerDevToolsAgentHost
: public DevToolsAgentHost {
public:
- explicit WorkerDevToolsAgentHost(WorkerId worker_id)
- : worker_id_(worker_id) {
- AgentHosts::Add(worker_id, this);
+ explicit WorkerDevToolsAgentHost(WorkerId worker_id) : attached_(false) {
+ AttachToWorker(worker_id, false);
+ }
+
+ bool attached() { return attached_; }
yurys 2012/12/20 11:45:40 Could you pick another name to avoid confusion wit
pfeldman 2012/12/20 16:53:54 Done.
+
+ void AttachToWorker(WorkerId worker_id, bool reattach) {
+ AgentHosts::Remove(worker_id_);
+ worker_id_ = worker_id;
+ AgentHosts::Add(worker_id_, this);
+ attached_ = true;
+
BrowserThread::PostTask(
BrowserThread::IO,
FROM_HERE,
@@ -101,13 +111,25 @@ class WorkerDevToolsManager::WorkerDevToolsAgentHost
&RegisterAgent,
worker_id.first,
worker_id.second));
+
+ if (reattach)
+ Reattach(state_);
}
- void WorkerDestroyed() {
- NotifyCloseListener();
+ virtual void Detach() {
+ DevToolsAgentHost::Detach();
+ AgentHosts::Remove(worker_id_);
delete this;
}
+ void DetachFromWorker() {
+ attached_ = false;
+ }
+
+ void SaveAgentRuntimeState(const std::string& state) {
+ state_ = state;
+ }
+
private:
virtual ~WorkerDevToolsAgentHost() {
AgentHosts::Remove(worker_id_);
@@ -130,6 +152,8 @@ class WorkerDevToolsManager::WorkerDevToolsAgentHost
// DevToolsAgentHost implementation.
virtual void SendMessageToAgent(IPC::Message* message) OVERRIDE {
+ if (!attached_)
+ return;
yurys 2012/12/20 11:45:40 The message object will leak here.
pfeldman 2012/12/20 16:53:54 Done.
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(
@@ -138,11 +162,14 @@ class WorkerDevToolsManager::WorkerDevToolsAgentHost
worker_id_.second,
base::Owned(message)));
}
+
virtual void NotifyClientAttaching() OVERRIDE {}
virtual void NotifyClientDetaching() OVERRIDE {}
virtual int GetRenderProcessId() OVERRIDE { return -1; }
WorkerId worker_id_;
+ bool attached_;
+ std::string state_;
DISALLOW_COPY_AND_ASSIGN(WorkerDevToolsAgentHost);
};
@@ -152,8 +179,11 @@ class WorkerDevToolsManager::DetachedClientHosts {
public:
static void WorkerReloaded(WorkerId old_id, WorkerId new_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (instance_ && instance_->ReattachClient(old_id, new_id))
+ WorkerDevToolsAgentHost* agent = AgentHosts::GetAgentHost(old_id);
+ if (agent && agent->attached()) {
+ agent->AttachToWorker(new_id, true);
return;
+ }
RemovePendingWorkerData(old_id);
}
@@ -164,44 +194,21 @@ class WorkerDevToolsManager::DetachedClientHosts {
RemovePendingWorkerData(id);
return;
}
- DevToolsManagerImpl::GetInstance()->DispatchOnInspectorFrontend(
+ DevToolsManagerImpl* devtools_manager = DevToolsManagerImpl::GetInstance();
+ devtools_manager->DispatchOnInspectorFrontend(
agent,
WebKit::WebDevToolsAgent::workerDisconnectedFromWorkerEvent().utf8());
- int cookie = DevToolsManagerImpl::GetInstance()->DetachClientHost(agent);
- agent->WorkerDestroyed();
- if (cookie == -1) {
+ DevToolsClientHost* client_host =
+ devtools_manager->GetDevToolsClientHostFor(agent);
+ if (!client_host)
RemovePendingWorkerData(id);
return;
- }
- if (!instance_)
- new DetachedClientHosts();
- instance_->worker_id_to_cookie_[id] = cookie;
+ agent->DetachFromWorker();
}
private:
- DetachedClientHosts() {
- instance_ = this;
- }
- ~DetachedClientHosts() {
- instance_ = NULL;
- }
-
- bool ReattachClient(WorkerId old_id, WorkerId new_id) {
- WorkerIdToCookieMap::iterator it = worker_id_to_cookie_.find(old_id);
- if (it == worker_id_to_cookie_.end())
- return false;
- DevToolsAgentHost* agent =
- WorkerDevToolsManager::GetDevToolsAgentHostForWorker(
- new_id.first,
- new_id.second);
- DevToolsManagerImpl::GetInstance()->AttachClientHost(
- it->second,
- agent);
- worker_id_to_cookie_.erase(it);
- if (worker_id_to_cookie_.empty())
- delete this;
- return true;
- }
+ DetachedClientHosts() { }
+ ~DetachedClientHosts() { }
static void RemovePendingWorkerData(WorkerId id) {
BrowserThread::PostTask(
@@ -212,15 +219,8 @@ class WorkerDevToolsManager::DetachedClientHosts {
static void RemoveInspectedWorkerDataOnIOThread(WorkerId id) {
WorkerDevToolsManager::GetInstance()->RemoveInspectedWorkerData(id);
}
-
- static DetachedClientHosts* instance_;
- typedef std::map<WorkerId, int> WorkerIdToCookieMap;
- WorkerIdToCookieMap worker_id_to_cookie_;
};
-WorkerDevToolsManager::DetachedClientHosts*
- WorkerDevToolsManager::DetachedClientHosts::instance_ = NULL;
-
struct WorkerDevToolsManager::InspectedWorker {
InspectedWorker(WorkerProcessHost* host, int route_id, const GURL& url,
const string16& name)
@@ -367,7 +367,6 @@ void WorkerDevToolsManager::RegisterDevToolsAgentHostForWorker(
}
}
}
- NotifyWorkerDestroyedOnIOThread(worker_process_id, worker_route_id);
yurys 2012/12/20 11:45:40 Now that the notification is removed who will take
pfeldman 2012/12/20 16:53:54 Done.
}
void WorkerDevToolsManager::ForwardToDevToolsClient(
@@ -422,7 +421,7 @@ void WorkerDevToolsManager::ForwardToDevToolsClientOnUIThread(
WorkerDevToolsAgentHost* agent_host = AgentHosts::GetAgentHost(WorkerId(
worker_process_id,
worker_route_id));
- if (!agent_host)
+ if (!agent_host || !agent_host->attached())
return;
DevToolsManagerImpl::GetInstance()->DispatchOnInspectorFrontend(agent_host,
message);
@@ -436,31 +435,9 @@ void WorkerDevToolsManager::SaveAgentRuntimeStateOnUIThread(
WorkerDevToolsAgentHost* agent_host = AgentHosts::GetAgentHost(WorkerId(
worker_process_id,
worker_route_id));
- if (!agent_host)
+ if (!agent_host || !agent_host->attached())
return;
- DevToolsManagerImpl::GetInstance()->SaveAgentRuntimeState(agent_host, state);
-}
-
-// static
-void WorkerDevToolsManager::NotifyWorkerDestroyedOnIOThread(
- int worker_process_id,
- int worker_route_id) {
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(
- &WorkerDevToolsManager::NotifyWorkerDestroyedOnUIThread,
- worker_process_id,
- worker_route_id));
-}
-
-// static
-void WorkerDevToolsManager::NotifyWorkerDestroyedOnUIThread(
- int worker_process_id,
- int worker_route_id) {
- WorkerDevToolsAgentHost* host =
- AgentHosts::GetAgentHost(WorkerId(worker_process_id, worker_route_id));
- if (host)
- host->WorkerDestroyed();
+ agent_host->SaveAgentRuntimeState(state);
}
// static
« no previous file with comments | « content/browser/devtools/worker_devtools_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698