OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/profiler.h" | 8 #include "base/debug/profiler.h" |
9 #include "base/memory/weak_ptr.h" | 9 #include "base/memory/weak_ptr.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
74 } | 74 } |
75 | 75 |
76 void OnClose(int connection_id) override { | 76 void OnClose(int connection_id) override { |
77 } | 77 } |
78 | 78 |
79 void OnHttpRequest( | 79 void OnHttpRequest( |
80 int connection_id, const net::HttpServerRequestInfo& info) override { | 80 int connection_id, const net::HttpServerRequestInfo& info) override { |
81 | 81 |
82 // FIXME: We should use use a fancier lookup system more like what | 82 // FIXME: We should use use a fancier lookup system more like what |
83 // services/http_server/http_server.cc does with AddHandler. | 83 // services/http_server/http_server.cc does with AddHandler. |
84 if (info.path == "/trace") | 84 if (info.path == "/reload") |
85 ToggleTracing(connection_id); | |
86 else if (info.path == "/reload") | |
87 Load(connection_id, url_); | 85 Load(connection_id, url_); |
88 else if (info.path == "/inspect") | 86 else if (info.path == "/inspect") |
89 Inspect(connection_id); | 87 Inspect(connection_id); |
90 else if (info.path == "/quit") | 88 else if (info.path == "/quit") |
91 Quit(connection_id); | 89 Quit(connection_id); |
92 else if (info.path == "/load") | 90 else if (info.path == "/load") |
93 Load(connection_id, info.data); | 91 Load(connection_id, info.data); |
94 else if (info.path == "/start_profiling") | 92 else if (info.path == "/start_profiling") |
95 StartProfiling(connection_id); | 93 StartProfiling(connection_id); |
96 else if (info.path == "/stop_profiling") | 94 else if (info.path == "/stop_profiling") |
97 StopProfiling(connection_id); | 95 StopProfiling(connection_id); |
98 else { | 96 else if (info.path == "/start_tracing") |
97 StartTracing(connection_id); | |
98 else if (info.path == "/stop_tracing") | |
99 StopTracing(connection_id); | |
100 else | |
99 Help(info.path, connection_id); | 101 Help(info.path, connection_id); |
100 } | |
101 } | 102 } |
102 | 103 |
103 void OnWebSocketRequest( | 104 void OnWebSocketRequest( |
104 int connection_id, const net::HttpServerRequestInfo& info) override { | 105 int connection_id, const net::HttpServerRequestInfo& info) override { |
105 Error(connection_id, "OnWebSocketRequest not implemented"); | 106 Error(connection_id, "OnWebSocketRequest not implemented"); |
106 } | 107 } |
107 | 108 |
108 void OnWebSocketMessage( | 109 void OnWebSocketMessage( |
109 int connection_id, const std::string& data) override { | 110 int connection_id, const std::string& data) override { |
110 Error(connection_id, "OnWebSocketMessage not implemented"); | 111 Error(connection_id, "OnWebSocketMessage not implemented"); |
111 } | 112 } |
112 | 113 |
113 void Error(int connection_id, std::string message) { | 114 void Error(int connection_id, std::string message) { |
114 web_server_->Send500(connection_id, message); | 115 web_server_->Send500(connection_id, message); |
115 } | 116 } |
116 | 117 |
117 void Respond(int connection_id, std::string response) { | 118 void Respond(int connection_id, std::string response) { |
118 // When sending tracing data back over the wire to the client, we can blow | 119 // When sending tracing data back over the wire to the client, we can blow |
119 // through the default send buffer size. | 120 // through the default send buffer size. |
120 web_server_->SetSendBufferSize( | 121 web_server_->SetSendBufferSize( |
121 connection_id, std::max(kMinSendBufferSize, response.length())); | 122 connection_id, std::max(kMinSendBufferSize, response.length())); |
122 web_server_->Send200(connection_id, response, "text/plain"); | 123 web_server_->Send200(connection_id, response, "text/plain"); |
123 } | 124 } |
124 | 125 |
125 void Help(std::string path, int connection_id) { | 126 void Help(std::string path, int connection_id) { |
126 std::string help = base::StringPrintf("Sky Debugger running on port %d\n" | 127 std::string help = base::StringPrintf("Sky Debugger running on port %d\n" |
127 "Supported URLs:\n" | 128 "Supported URLs:\n" |
128 "/toggle_tracing -- Start/stop tracing\n" | |
129 "/reload -- Reload the current page\n" | 129 "/reload -- Reload the current page\n" |
130 "/inspect -- Start inspector server for current page\n" | |
131 "/quit -- Quit\n" | 130 "/quit -- Quit\n" |
132 "/load -- Load a new URL, url in POST body.\n", | 131 "/load -- Load a new URL, url in POST body.\n", |
133 command_port_); | 132 command_port_); |
134 if (path != "/") | 133 if (path != "/") |
135 help = "Unknown path: " + path + "\n\n" + help; | 134 help = "Unknown path: " + path + "\n\n" + help; |
136 Respond(connection_id, help); | 135 Respond(connection_id, help); |
137 } | 136 } |
138 | 137 |
139 void Load(int connection_id, std::string url) { | 138 void Load(int connection_id, std::string url) { |
140 url_ = url; | 139 url_ = url; |
(...skipping 10 matching lines...) Expand all Loading... | |
151 debugger_->InjectInspector(); | 150 debugger_->InjectInspector(); |
152 Respond(connection_id, | 151 Respond(connection_id, |
153 "Open the following URL in Chrome:\n" | 152 "Open the following URL in Chrome:\n" |
154 "chrome-devtools://devtools/bundled/devtools.html?ws=localhost:9898\n"); | 153 "chrome-devtools://devtools/bundled/devtools.html?ws=localhost:9898\n"); |
155 } | 154 } |
156 | 155 |
157 void Quit(int connection_id) { | 156 void Quit(int connection_id) { |
158 debugger_->Shutdown(); | 157 debugger_->Shutdown(); |
159 } | 158 } |
160 | 159 |
161 void ToggleTracing(int connection_id) { | 160 void StartTracing(int connection_id) { |
162 bool was_tracing = is_tracing_; | 161 if (is_tracing_) { |
163 is_tracing_ = !is_tracing_; | 162 Error(connection_id, "Already tracing. Use stop_tracing to stop.\n"); |
164 | |
165 if (was_tracing) { | |
166 tracing_->StopAndFlush(); | |
167 trace_collector_->GetTrace(base::Bind( | |
168 &Prompt::OnTraceAvailable, base::Unretained(this), connection_id)); | |
169 return; | 163 return; |
170 } | 164 } |
171 | 165 |
166 is_tracing_ = true; | |
eseidel
2015/01/27 21:07:21
You don't need to check this, there are apis to te
abarth-chromium
2015/01/27 21:27:59
We're using mojo's multiapp tracing system to trac
| |
172 mojo::DataPipe pipe; | 167 mojo::DataPipe pipe; |
173 tracing_->Start(pipe.producer_handle.Pass(), mojo::String("*")); | 168 tracing_->Start(pipe.producer_handle.Pass(), mojo::String("*")); |
174 trace_collector_.reset(new TraceCollector(pipe.consumer_handle.Pass())); | 169 trace_collector_.reset(new TraceCollector(pipe.consumer_handle.Pass())); |
175 Respond(connection_id, "Starting trace (type 'trace' to stop tracing)\n"); | 170 Respond(connection_id, "Starting trace (type 'trace' to stop tracing)\n"); |
esprehn
2015/01/27 20:59:24
is this right? Or do you need to type stop_tracing
abarth-chromium
2015/01/27 21:27:59
Ah, will fix.
| |
176 } | 171 } |
177 | 172 |
173 void StopTracing(int connection_id) { | |
174 if (!is_tracing_) { | |
175 Error(connection_id, "Not tracing yet. Use start_tracing to start.\n"); | |
176 return; | |
177 } | |
178 | |
179 is_tracing_ = false; | |
180 tracing_->StopAndFlush(); | |
181 trace_collector_->GetTrace(base::Bind( | |
182 &Prompt::OnTraceAvailable, base::Unretained(this), connection_id)); | |
183 } | |
184 | |
178 void OnTraceAvailable(int connection_id, std::string trace) { | 185 void OnTraceAvailable(int connection_id, std::string trace) { |
179 trace_collector_.reset(); | 186 trace_collector_.reset(); |
180 Respond(connection_id, trace); | 187 Respond(connection_id, trace); |
181 } | 188 } |
182 | 189 |
183 void StartProfiling(int connection_id) { | 190 void StartProfiling(int connection_id) { |
184 #if !defined(NDEBUG) || !defined(ENABLE_PROFILING) | 191 #if !defined(NDEBUG) || !defined(ENABLE_PROFILING) |
185 Error(connection_id, | 192 Error(connection_id, |
186 "Profiling requires is_debug=false and enable_profiling=true"); | 193 "Profiling requires is_debug=false and enable_profiling=true"); |
187 return; | 194 return; |
(...skipping 26 matching lines...) Expand all Loading... | |
214 }; | 221 }; |
215 | 222 |
216 } // namespace debugger | 223 } // namespace debugger |
217 } // namespace sky | 224 } // namespace sky |
218 | 225 |
219 MojoResult MojoMain(MojoHandle shell_handle) { | 226 MojoResult MojoMain(MojoHandle shell_handle) { |
220 mojo::ApplicationRunnerChromium runner(new sky::debugger::Prompt); | 227 mojo::ApplicationRunnerChromium runner(new sky::debugger::Prompt); |
221 runner.set_message_loop_type(base::MessageLoop::TYPE_IO); | 228 runner.set_message_loop_type(base::MessageLoop::TYPE_IO); |
222 return runner.Run(shell_handle); | 229 return runner.Run(shell_handle); |
223 } | 230 } |
OLD | NEW |