| // Copyright (c) 2013 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. |
| |
| #ifndef CONTENT_BROWSER_TRACING_TRACING_CONTROLLER_IMPL_H_ |
| #define CONTENT_BROWSER_TRACING_TRACING_CONTROLLER_IMPL_H_ |
| |
| #include <memory> |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include "base/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 "build/chromeos_buildflags.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/abseil-cpp/absl/types/optional.h" |
| |
| namespace perfetto { |
| namespace protos { |
| namespace pbzero { |
| class TracePacket; |
| } // namespace pbzero |
| } // namespace protos |
| } // namespace perfetto |
| |
| namespace base { |
| |
| namespace trace_event { |
| class TraceConfig; |
| } // namespace trace_event |
| |
| } // namespace base |
| |
| namespace tracing { |
| class BaseAgent; |
| } // namespace tracing |
| |
| 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; |
| |
| // 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(); |
| |
| // For unittests. |
| CONTENT_EXPORT void SetTracingDelegateForTesting( |
| std::unique_ptr<TracingDelegate> delegate); |
| |
| private: |
| friend std::default_delete<TracingControllerImpl>; |
| |
| ~TracingControllerImpl() override; |
| void AddAgents(); |
| void ConnectToServiceIfNeeded(); |
| absl::optional<base::Value::Dict> GenerateMetadataDict(); |
| void GenerateMetadataPacket(perfetto::protos::pbzero::TracePacket* packet, |
| bool privacy_filtering_enabled); |
| |
| // mojo::DataPipeDrainer::Client |
| void OnDataAvailable(const void* data, size_t num_bytes) override; |
| void OnDataComplete() override; |
| |
| void OnReadBuffersComplete(); |
| |
| void CompleteFlush(); |
| |
| void InitStartupTracingForDuration(); |
| void EndStartupTracing(); |
| #if BUILDFLAG(IS_CHROMEOS_ASH) |
| 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::vector<std::unique_ptr<tracing::BaseAgent>> agents_; |
| std::unique_ptr<TracingDelegate> delegate_; |
| 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; |
| |
| #if BUILDFLAG(IS_CHROMEOS_ASH) |
| 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_ |