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

Side by Side Diff: content/browser/debugger/worker_devtools_manager.cc

Issue 7248076: DevTools: add initial support for shared workers debugging (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed some debug printing Created 9 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/debugger/worker_devtools_manager.h"
6
7 #include <list>
8
9 #include "base/tuple.h"
10 #include "content/browser/browser_thread.h"
11 #include "content/browser/debugger/devtools_manager.h"
12 #include "content/browser/debugger/worker_devtools_message_filter.h"
13 #include "content/browser/worker_host/worker_process_host.h"
14 #include "content/common/devtools_messages.h"
15
16 class WorkerDevToolsManager::DevToolsWorkerIds {
17 public:
18 DevToolsWorkerIds() : next_id_(1) {}
19
20 int CreateDevToolsId(WorkerProcessHost* host, int route_id) {
21 DCHECK(-1 == FindDevToolsId(host->id(), route_id));
22 int devtools_id = next_id_++;
23 map_.push_back(Entry(host, route_id, devtools_id));
24 return devtools_id;
25 }
26
27 int FindDevToolsId(int worker_process_host_id, int route_id) {
28 for (IdMap::iterator it = map_.begin();
29 it != map_.end(); ++it) {
30 if (it->a->id() == worker_process_host_id && it->b == route_id)
31 return it->c;
32 }
33 return -1;
34 }
35
36 bool FindWorkerInfo(
37 int devtools_id,
38 WorkerProcessHost** host,
39 int* route_id) {
40 for (IdMap::iterator it = map_.begin();
41 it != map_.end(); ++it) {
42 if (it->c == devtools_id) {
43 *host = it->a;
44 *route_id = it->b;
45 return true;
46 }
47 }
48 return false;
49 }
50
51 bool TakeWorkerInfo(
52 int devtools_id,
53 WorkerProcessHost** host,
54 int* route_id) {
55 for (IdMap::iterator it = map_.begin();
56 it != map_.end(); ++it) {
57 if (it->c == devtools_id) {
58 *host = it->a;
59 *route_id = it->b;
60 map_.erase(it);
61 return true;
62 }
63 }
64 return false;
65 }
66
67 void WorkerDevToolsMessageFilterClosing(int worker_process_host_id) {
68 IdMap::iterator it = map_.begin();
69 while (it != map_.end()) {
70 if (it->a->id() == worker_process_host_id)
71 it = map_.erase(it);
72 else
73 ++it;
74 }
75 }
76
77 private:
78 int next_id_;
79 typedef Tuple3<WorkerProcessHost*, int, int> Entry;
80 typedef std::list<Entry> IdMap;
81 IdMap map_;
82 DISALLOW_COPY_AND_ASSIGN(DevToolsWorkerIds);
83 };
84
85 // static
86 WorkerDevToolsManager* WorkerDevToolsManager::GetInstance() {
87 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
88 return Singleton<WorkerDevToolsManager>::get();
89 }
90
91 WorkerDevToolsManager::WorkerDevToolsManager()
92 : devtools_worker_ids_(new DevToolsWorkerIds()) {
93 }
94
95 WorkerDevToolsManager::~WorkerDevToolsManager() {
96 }
97
98 static void OpenDevToolsForWorkerOnUIThread(
99 int worker_devtools_id) {
100 DevToolsManager::GetInstance()->OpenDevToolsForWorker(
101 worker_devtools_id);
102 }
103
104 static WorkerProcessHost* FindWorkerProcessHostForWorker(
105 int worker_process_host_id,
106 int worker_route_id) {
107 BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS);
108 for (; !iter.Done(); ++iter) {
109 if (iter->id() != worker_process_host_id)
110 continue;
111 WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter);
112 const WorkerProcessHost::Instances& instances = worker->instances();
113 for (WorkerProcessHost::Instances::const_iterator i = instances.begin();
114 i != instances.end(); ++i) {
115 if (i->shared() && i->worker_route_id() == worker_route_id)
116 return worker;
117 }
118 return NULL;
119 }
120 return NULL;
121 }
122
123 void WorkerDevToolsManager::OpenDevToolsForWorker(int worker_process_host_id,
124 int worker_route_id) {
125 WorkerProcessHost* host = FindWorkerProcessHostForWorker(
126 worker_process_host_id,
127 worker_route_id);
128 if (!host)
129 return;
130
131 int devtools_id = devtools_worker_ids_->FindDevToolsId(
132 worker_process_host_id, worker_route_id);
133 // DevTools client is already attached.
134 if (devtools_id != -1)
135 return;
136
137 host->Send(new WorkerDevToolsAgentMsg_Attach(worker_route_id));
138
139 devtools_id = devtools_worker_ids_->CreateDevToolsId(
140 host, worker_route_id);
141 BrowserThread::PostTask(
142 BrowserThread::UI, FROM_HERE,
143 NewRunnableFunction(
144 OpenDevToolsForWorkerOnUIThread,
145 devtools_id));
146 }
147
148 void WorkerDevToolsManager::WorkerDevToolsClientClosing(
149 int worker_devtools_id) {
150 WorkerProcessHost* host;
151 int route_id;
152 if (!devtools_worker_ids_->TakeWorkerInfo(
153 worker_devtools_id, &host, &route_id))
154 return;
155 host->Send(new WorkerDevToolsAgentMsg_Detach(route_id));
156 }
157
158 static void ForwardToDevToolsClientOnUIThread(
159 int worker_devtools_id,
160 const IPC::Message& message) {
161 DevToolsManager::GetInstance()->ForwardToWorkerDevToolsClient(
162 worker_devtools_id, message);
163 }
164
165 void WorkerDevToolsManager::ForwardToDevToolsClient(
166 int worker_process_host_id,
167 int worker_route_id,
168 const IPC::Message& message) {
169 int devtools_id = devtools_worker_ids_->FindDevToolsId(
170 worker_process_host_id, worker_route_id);
171 DCHECK(devtools_id != -1);
172 if (devtools_id == -1)
173 return;
174 BrowserThread::PostTask(
175 BrowserThread::UI, FROM_HERE,
176 NewRunnableFunction(
177 ForwardToDevToolsClientOnUIThread,
178 devtools_id,
179 IPC::Message(message)));
180 }
181
182 void WorkerDevToolsManager::ForwardToWorkerDevToolsAgent(
183 int worker_devtools_id,
184 const IPC::Message& message) {
185 WorkerProcessHost* host;
186 int route_id;
187 if (!devtools_worker_ids_->FindWorkerInfo(
188 worker_devtools_id, &host, &route_id))
189 return;
190 IPC::Message* msg = new IPC::Message(message);
191 msg->set_routing_id(route_id);
192 host->Send(msg);
193 }
194
195 void WorkerDevToolsManager::WorkerProcessDestroying(
196 int worker_process_host_id) {
197 devtools_worker_ids_->WorkerDevToolsMessageFilterClosing(
198 worker_process_host_id);
199 }
200
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698