blob: 5a6f9e6980d33d16a0c17353ef53f69d8ec87046 [file] [log] [blame]
// 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/memory/weak_ptr.h"
#include "base/trace_event/trace_log.h"
#include "content/common/content_export.h"
#include "content/public/browser/tracing_controller.h"
#include "mojo/public/cpp/system/data_pipe_drainer.h"
#include "services/tracing/public/mojom/tracing.mojom.h"
namespace base {
namespace trace_event {
class TraceConfig;
} // namespace trace_event
class DictionaryValue;
class RefCountedString;
} // namespace base
namespace tracing {
class BaseAgent;
} // namespace tracing
namespace content {
class TracingDelegate;
class TracingUI;
class TracingControllerImpl
: public TracingController,
public mojo::DataPipeDrainer::Client,
public base::trace_event::TraceLog::AsyncEnabledStateObserver {
public:
// Create an endpoint for dumping the trace data to a callback.
CONTENT_EXPORT static scoped_refptr<TraceDataEndpoint> CreateCallbackEndpoint(
const base::Callback<void(std::unique_ptr<const base::DictionaryValue>,
base::RefCountedString*)>& 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();
// 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) override;
bool GetTraceBufferUsage(GetTraceBufferUsageCallback callback) override;
bool IsTracing() const override;
void RegisterTracingUI(TracingUI* tracing_ui);
void UnregisterTracingUI(TracingUI* tracing_ui);
// For unittests.
CONTENT_EXPORT void SetTracingDelegateForTesting(
std::unique_ptr<TracingDelegate> delegate);
private:
friend std::default_delete<TracingControllerImpl>;
~TracingControllerImpl() override;
void AddAgents();
void ConnectToServiceIfNeeded();
void DisconnectFromService();
std::unique_ptr<base::DictionaryValue> GenerateMetadataDict() const;
// mojo::DataPipeDrainer::Client
void OnDataAvailable(const void* data, size_t num_bytes) override;
void OnDataComplete() override;
// base::trace_event::TraceLog::AsyncEnabledStateObserver
void OnTraceLogEnabled() override;
void OnTraceLogDisabled() override;
void OnMetadataAvailable(base::Value metadata);
void CompleteFlush();
tracing::mojom::CoordinatorPtr coordinator_;
std::vector<std::unique_ptr<tracing::BaseAgent>> agents_;
std::unique_ptr<TracingDelegate> delegate_;
std::unique_ptr<base::trace_event::TraceConfig> trace_config_;
StartTracingDoneCallback start_tracing_done_;
std::unique_ptr<mojo::DataPipeDrainer> drainer_;
scoped_refptr<TraceDataEndpoint> trace_data_endpoint_;
std::unique_ptr<base::DictionaryValue> filtered_metadata_;
std::set<TracingUI*> tracing_uis_;
bool is_data_complete_ = false;
bool is_metadata_available_ = false;
// NOTE: Weak pointers must be invalidated before all other member variables.
base::WeakPtrFactory<TracingControllerImpl> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(TracingControllerImpl);
};
} // namespace content
#endif // CONTENT_BROWSER_TRACING_TRACING_CONTROLLER_IMPL_H_