| Index: content/browser/devtools/protocol/tracing_handler.cc
|
| diff --git a/content/browser/devtools/protocol/tracing_handler.cc b/content/browser/devtools/protocol/tracing_handler.cc
|
| index 97c08edbe5e16cef729967f0aeb00e651ae8d44f..590ed9b83bcfd5b2422a51ceab56b7f332710cf9 100644
|
| --- a/content/browser/devtools/protocol/tracing_handler.cc
|
| +++ b/content/browser/devtools/protocol/tracing_handler.cc
|
| @@ -22,10 +22,7 @@
|
| #include "content/browser/tracing/tracing_controller_impl.h"
|
|
|
| namespace content {
|
| -namespace devtools {
|
| -namespace tracing {
|
| -
|
| -using Response = DevToolsProtocolClient::Response;
|
| +namespace protocol {
|
|
|
| namespace {
|
|
|
| @@ -131,13 +128,15 @@ TracingHandler::TracingHandler(TracingHandler::Target target,
|
| TracingHandler::~TracingHandler() {
|
| }
|
|
|
| -void TracingHandler::SetClient(std::unique_ptr<Client> client) {
|
| - client_.swap(client);
|
| +void TracingHandler::Wire(UberDispatcher* dispatcher) {
|
| + frontend_.reset(new Tracing::Frontend(dispatcher->channel()));
|
| + Tracing::Dispatcher::wire(dispatcher, this);
|
| }
|
|
|
| -void TracingHandler::Detached() {
|
| +Response TracingHandler::Disable() {
|
| if (did_initiate_recording_)
|
| StopTracing(scoped_refptr<TracingController::TraceDataSink>());
|
| + return Response::OK();
|
| }
|
|
|
| void TracingHandler::OnTraceDataCollected(const std::string& trace_fragment) {
|
| @@ -149,74 +148,81 @@ void TracingHandler::OnTraceDataCollected(const std::string& trace_fragment) {
|
| message.reserve(message.size() + trace_fragment.size() + messageSuffixSize);
|
| message += trace_fragment;
|
| message += "] } }";
|
| - client_->SendRawNotification(message);
|
| + frontend_->sendRawNotification(message);
|
| }
|
|
|
| void TracingHandler::OnTraceComplete() {
|
| - client_->TracingComplete(TracingCompleteParams::Create());
|
| + frontend_->TracingComplete();
|
| }
|
|
|
| void TracingHandler::OnTraceToStreamComplete(const std::string& stream_handle) {
|
| - client_->TracingComplete(
|
| - TracingCompleteParams::Create()->set_stream(stream_handle));
|
| + frontend_->TracingComplete(stream_handle);
|
| }
|
|
|
| -Response TracingHandler::Start(
|
| - DevToolsCommandId command_id,
|
| - const std::string* categories,
|
| - const std::string* options,
|
| - const double* buffer_usage_reporting_interval,
|
| - const std::string* transfer_mode,
|
| - const std::unique_ptr<base::DictionaryValue>& config) {
|
| +void TracingHandler::Start(Maybe<std::string> categories,
|
| + Maybe<std::string> options,
|
| + Maybe<double> buffer_usage_reporting_interval,
|
| + Maybe<std::string> transfer_mode,
|
| + Maybe<Tracing::TraceConfig> config,
|
| + std::unique_ptr<StartCallback> callback) {
|
| + bool return_as_stream = transfer_mode.fromMaybe("") ==
|
| + Tracing::Start::TransferModeEnum::ReturnAsStream;
|
| if (IsTracing()) {
|
| if (!did_initiate_recording_ && IsStartupTracingActive()) {
|
| // If tracing is already running because it was initiated by startup
|
| // tracing, honor the transfer mode update, as that's the only way
|
| // for the client to communicate it.
|
| - return_as_stream_ =
|
| - transfer_mode && *transfer_mode == start::kTransferModeReturnAsStream;
|
| + return_as_stream_ = return_as_stream;
|
| }
|
| - return Response::InternalError("Tracing is already started");
|
| + callback->sendFailure(Response::Error("Tracing is already started"));
|
| + return;
|
| }
|
|
|
| - if (config && (categories || options)) {
|
| - return Response::InternalError(
|
| + if (config.isJust() && (categories.isJust() || options.isJust())) {
|
| + callback->sendFailure(Response::InvalidParams(
|
| "Either trace config (preferred), or categories+options should be "
|
| - "specified, but not both.");
|
| + "specified, but not both."));
|
| + return;
|
| }
|
|
|
| did_initiate_recording_ = true;
|
| - return_as_stream_ =
|
| - transfer_mode && *transfer_mode == start::kTransferModeReturnAsStream;
|
| - if (buffer_usage_reporting_interval)
|
| - SetupTimer(*buffer_usage_reporting_interval);
|
| + return_as_stream_ = return_as_stream;
|
| + if (buffer_usage_reporting_interval.isJust())
|
| + SetupTimer(buffer_usage_reporting_interval.fromJust());
|
|
|
| base::trace_event::TraceConfig trace_config;
|
| - if (config) {
|
| - trace_config = GetTraceConfigFromDevToolsConfig(*config);
|
| - } else if (categories || options) {
|
| + if (config.isJust()) {
|
| + std::unique_ptr<base::Value> value =
|
| + protocol::toBaseValue(config.fromJust()->serialize().get(), 1000);
|
| + if (value && value->IsType(base::Value::TYPE_DICTIONARY)) {
|
| + trace_config = GetTraceConfigFromDevToolsConfig(
|
| + *static_cast<base::DictionaryValue*>(value.get()));
|
| + }
|
| + } else if (categories.isJust() || options.isJust()) {
|
| trace_config = base::trace_event::TraceConfig(
|
| - categories ? *categories : std::string(),
|
| - options ? *options : std::string());
|
| + categories.fromMaybe(""), options.fromMaybe(""));
|
| }
|
|
|
| // If inspected target is a render process Tracing.start will be handled by
|
| // tracing agent in the renderer.
|
| + if (target_ == Renderer)
|
| + callback->fallThrough();
|
| +
|
| TracingController::GetInstance()->StartTracing(
|
| trace_config,
|
| base::Bind(&TracingHandler::OnRecordingEnabled,
|
| weak_factory_.GetWeakPtr(),
|
| - command_id));
|
| -
|
| - return target_ == Renderer ? Response::FallThrough() : Response::OK();
|
| + base::Passed(std::move(callback))));
|
| }
|
|
|
| -Response TracingHandler::End(DevToolsCommandId command_id) {
|
| +void TracingHandler::End(std::unique_ptr<EndCallback> callback) {
|
| // Startup tracing triggered by --trace-config-file is a special case, where
|
| // tracing is started automatically upon browser startup and can be stopped
|
| // via DevTools.
|
| - if (!did_initiate_recording_ && !IsStartupTracingActive())
|
| - return Response::InternalError("Tracing is not started");
|
| + if (!did_initiate_recording_ && !IsStartupTracingActive()) {
|
| + callback->sendFailure(Response::Error("Tracing is not started"));
|
| + return;
|
| + }
|
|
|
| scoped_refptr<TracingController::TraceDataSink> sink;
|
| if (return_as_stream_) {
|
| @@ -228,70 +234,71 @@ Response TracingHandler::End(DevToolsCommandId command_id) {
|
| StopTracing(sink);
|
| // If inspected target is a render process Tracing.end will be handled by
|
| // tracing agent in the renderer.
|
| - return target_ == Renderer ? Response::FallThrough() : Response::OK();
|
| + if (target_ == Renderer)
|
| + callback->fallThrough();
|
| + else
|
| + callback->sendSuccess();
|
| }
|
|
|
| -Response TracingHandler::GetCategories(DevToolsCommandId command_id) {
|
| +void TracingHandler::GetCategories(
|
| + std::unique_ptr<GetCategoriesCallback> callback) {
|
| TracingController::GetInstance()->GetCategories(
|
| base::Bind(&TracingHandler::OnCategoriesReceived,
|
| weak_factory_.GetWeakPtr(),
|
| - command_id));
|
| - return Response::OK();
|
| + base::Passed(std::move(callback))));
|
| }
|
|
|
| -void TracingHandler::OnRecordingEnabled(DevToolsCommandId command_id) {
|
| +void TracingHandler::OnRecordingEnabled(
|
| + std::unique_ptr<StartCallback> callback) {
|
| TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"),
|
| "TracingStartedInBrowser", TRACE_EVENT_SCOPE_THREAD,
|
| "frameTreeNodeId", frame_tree_node_id_);
|
| if (target_ != Renderer)
|
| - client_->SendStartResponse(command_id, StartResponse::Create());
|
| + callback->sendSuccess();
|
| }
|
|
|
| void TracingHandler::OnBufferUsage(float percent_full,
|
| size_t approximate_event_count) {
|
| // TODO(crbug426117): remove set_value once all clients have switched to
|
| // the new interface of the event.
|
| - client_->BufferUsage(BufferUsageParams::Create()
|
| - ->set_value(percent_full)
|
| - ->set_percent_full(percent_full)
|
| - ->set_event_count(approximate_event_count));
|
| + frontend_->BufferUsage(percent_full, percent_full, approximate_event_count);
|
| }
|
|
|
| void TracingHandler::OnCategoriesReceived(
|
| - DevToolsCommandId command_id,
|
| + std::unique_ptr<GetCategoriesCallback> callback,
|
| const std::set<std::string>& category_set) {
|
| - std::vector<std::string> categories;
|
| + std::unique_ptr<protocol::Array<std::string>> categories =
|
| + protocol::Array<std::string>::create();
|
| for (const std::string& category : category_set)
|
| - categories.push_back(category);
|
| - client_->SendGetCategoriesResponse(command_id,
|
| - GetCategoriesResponse::Create()->set_categories(categories));
|
| + categories->addItem(category);
|
| + callback->sendSuccess(std::move(categories));
|
| }
|
|
|
| -Response TracingHandler::RequestMemoryDump(DevToolsCommandId command_id) {
|
| - if (!IsTracing())
|
| - return Response::InternalError("Tracing is not started");
|
| +void TracingHandler::RequestMemoryDump(
|
| + std::unique_ptr<RequestMemoryDumpCallback> callback) {
|
| + if (!IsTracing()) {
|
| + callback->sendFailure(Response::Error("Tracing is not started"));
|
| + return;
|
| + }
|
|
|
| base::trace_event::MemoryDumpManager::GetInstance()->RequestGlobalDump(
|
| base::trace_event::MemoryDumpType::EXPLICITLY_TRIGGERED,
|
| base::trace_event::MemoryDumpLevelOfDetail::DETAILED,
|
| base::Bind(&TracingHandler::OnMemoryDumpFinished,
|
| - weak_factory_.GetWeakPtr(), command_id));
|
| - return Response::OK();
|
| + weak_factory_.GetWeakPtr(),
|
| + base::Passed(std::move(callback))));
|
| }
|
|
|
| -void TracingHandler::OnMemoryDumpFinished(DevToolsCommandId command_id,
|
| - uint64_t dump_guid,
|
| - bool success) {
|
| - client_->SendRequestMemoryDumpResponse(
|
| - command_id,
|
| - RequestMemoryDumpResponse::Create()
|
| - ->set_dump_guid(base::StringPrintf("0x%" PRIx64, dump_guid))
|
| - ->set_success(success));
|
| +void TracingHandler::OnMemoryDumpFinished(
|
| + std::unique_ptr<RequestMemoryDumpCallback> callback,
|
| + uint64_t dump_guid,
|
| + bool success) {
|
| + callback->sendSuccess(base::StringPrintf("0x%" PRIx64, dump_guid), success);
|
| }
|
|
|
| Response TracingHandler::RecordClockSyncMarker(const std::string& sync_id) {
|
| if (!IsTracing())
|
| - return Response::InternalError("Tracing is not started");
|
| + return Response::Error("Tracing is not started");
|
|
|
| TracingControllerImpl::GetInstance()->RecordClockSyncMarker(
|
| sync_id,
|
| @@ -350,5 +357,4 @@ base::trace_event::TraceConfig TracingHandler::GetTraceConfigFromDevToolsConfig(
|
| }
|
|
|
| } // namespace tracing
|
| -} // namespace devtools
|
| -} // namespace content
|
| +} // namespace protocol
|
|
|