| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "services/tracing/recorder.h" |
| |
| #include <utility> |
| |
| #include "base/bind.h" |
| #include "base/callback_forward.h" |
| #include "base/memory/ref_counted.h" |
| #include "services/tracing/public/mojom/tracing.mojom.h" |
| |
| namespace tracing { |
| |
| Recorder::Recorder(mojom::RecorderRequest request, |
| mojom::TraceDataType data_type, |
| const base::RepeatingClosure& on_data_change_callback) |
| : is_recording_(true), |
| data_type_(data_type), |
| on_data_change_callback_(on_data_change_callback), |
| binding_(this, std::move(request)), |
| weak_ptr_factory_(this) { |
| binding_.set_connection_error_handler(base::BindOnce( |
| &Recorder::OnConnectionError, weak_ptr_factory_.GetWeakPtr())); |
| } |
| |
| Recorder::~Recorder() = default; |
| |
| void Recorder::AddChunk(const std::string& chunk) { |
| if (chunk.empty()) |
| return; |
| if (data_type_ != mojom::TraceDataType::STRING && !data_.empty()) |
| data_.append(","); |
| data_.append(chunk); |
| on_data_change_callback_.Run(); |
| } |
| |
| void Recorder::AddMetadata(base::Value metadata) { |
| base::DictionaryValue* dict; |
| bool result = metadata.GetAsDictionary(&dict); |
| DCHECK(result); |
| |
| metadata_.MergeDictionary(static_cast<base::DictionaryValue*>(&metadata)); |
| } |
| |
| void Recorder::OnConnectionError() { |
| is_recording_ = false; |
| on_data_change_callback_.Run(); |
| } |
| |
| } // namespace tracing |