1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_TRACING_TRACING_CONTROLLER_IMPL_H_
#define CONTENT_BROWSER_TRACING_TRACING_CONTROLLER_IMPL_H_
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/ref_counted.h"
#include "base/task/task_traits.h"
#include "base/timer/timer.h"
#include "base/values.h"
#include "content/common/content_export.h"
#include "content/public/browser/tracing_controller.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/data_pipe_drainer.h"
#include "services/tracing/public/mojom/perfetto_service.mojom.h"
#include "third_party/perfetto/protos/perfetto/trace/chrome/chrome_metadata.pbzero.h"
namespace perfetto::protos::pbzero {
class TracePacket;
} // namespace perfetto::protos::pbzero
namespace base::trace_event {
class TraceConfig;
} // namespace base::trace_event
namespace content {
class TracingDelegate;
class TracingControllerImpl : public TracingController,
public mojo::DataPipeDrainer::Client,
public tracing::mojom::TracingSessionClient {
public:
// Create an endpoint for dumping the trace data to a callback.
CONTENT_EXPORT static scoped_refptr<TraceDataEndpoint> CreateCallbackEndpoint(
CompletionCallback callback);
CONTENT_EXPORT static scoped_refptr<TraceDataEndpoint>
CreateCompressedStringEndpoint(scoped_refptr<TraceDataEndpoint> endpoint,
bool compress_with_background_priority);
CONTENT_EXPORT static TracingControllerImpl* GetInstance();
// Should be called on the UI thread.
CONTENT_EXPORT TracingControllerImpl();
TracingControllerImpl(const TracingControllerImpl&) = delete;
TracingControllerImpl& operator=(const TracingControllerImpl&) = delete;
// Returns the embedder's tracing delegate.
TracingDelegate* tracing_delegate() { return delegate_.get(); }
// TracingController implementation.
bool GetCategories(GetCategoriesDoneCallback callback) override;
bool StartTracing(const base::trace_event::TraceConfig& trace_config,
StartTracingDoneCallback callback) override;
bool StopTracing(const scoped_refptr<TraceDataEndpoint>& endpoint) override;
bool StopTracing(const scoped_refptr<TraceDataEndpoint>& endpoint,
const std::string& agent_label,
bool privacy_filtering_enabled = false) override;
bool GetTraceBufferUsage(GetTraceBufferUsageCallback callback) override;
bool IsTracing() override;
// tracing::mojom::TracingSessionClient implementation:
void OnTracingEnabled() override;
void OnTracingDisabled(bool tracing_succeeded) override;
void OnTracingFailed();
private:
friend std::default_delete<TracingControllerImpl>;
~TracingControllerImpl() override;
void InitializeDataSources();
void ConnectToServiceIfNeeded();
std::optional<base::Value::Dict> GenerateMetadataDict();
static void RecorderMetadataToBundle(
perfetto::protos::pbzero::ChromeEventBundle* bundle);
static void GenerateMetadataPacket(
perfetto::protos::pbzero::TracePacket* packet,
bool privacy_filtering_enabled);
void GenerateMetadataPacketFieldTrials(
perfetto::protos::pbzero::ChromeMetadataPacket* metadata_proto,
bool privacy_filtering_enabled);
// mojo::DataPipeDrainer::Client
void OnDataAvailable(base::span<const uint8_t> data) override;
void OnDataComplete() override;
void OnReadBuffersComplete();
void CompleteFlush();
void InitStartupTracingForDuration();
void EndStartupTracing();
#if BUILDFLAG(IS_CHROMEOS)
void OnMachineStatisticsLoaded();
#endif
mojo::Remote<tracing::mojom::ConsumerHost> consumer_host_;
mojo::Remote<tracing::mojom::TracingSessionHost> tracing_session_host_;
mojo::Receiver<tracing::mojom::TracingSessionClient> receiver_{this};
StartTracingDoneCallback start_tracing_callback_;
std::unique_ptr<base::trace_event::TraceConfig> trace_config_;
std::unique_ptr<mojo::DataPipeDrainer> drainer_;
scoped_refptr<TraceDataEndpoint> trace_data_endpoint_;
bool is_data_complete_ = false;
bool read_buffers_complete_ = false;
std::unique_ptr<TracingDelegate> delegate_;
#if BUILDFLAG(IS_CHROMEOS)
bool are_statistics_loaded_ = false;
std::string hardware_class_;
base::WeakPtrFactory<TracingControllerImpl> weak_ptr_factory_{this};
#endif
};
} // namespace content
#endif // CONTENT_BROWSER_TRACING_TRACING_CONTROLLER_IMPL_H_
|