blob: 43a4704904037018564c14d944db02ecb99356f7 [file] [log] [blame]
simonhatch0b016192015-05-22 19:14:021// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_TRACING_BACKGROUND_TRACING_MANAGER_IMPL_H_
6#define CONTENT_BROWSER_TRACING_BACKGROUND_TRACING_MANAGER_IMPL_H_
7
Ehsan Chiniforooshana09fc882017-06-14 16:24:388#include <map>
dcheng59716272016-04-09 05:19:089#include <memory>
Ehsan Chiniforooshana09fc882017-06-14 16:24:3810#include <set>
11#include <string>
dcheng59716272016-04-09 05:19:0812
simonhatch0b016192015-05-22 19:14:0213#include "base/lazy_instance.h"
avib7348942015-12-25 20:57:1014#include "base/macros.h"
simonhatch0b016192015-05-22 19:14:0215#include "base/memory/ref_counted_memory.h"
simonhatch0b016192015-05-22 19:14:0216#include "base/memory/weak_ptr.h"
simonhatch2ad3355b2015-07-18 03:51:0817#include "base/metrics/histogram.h"
oysteinef4ce0b062015-08-26 01:33:0618#include "content/browser/tracing/background_tracing_config_impl.h"
simonhatch0b016192015-05-22 19:14:0219#include "content/browser/tracing/tracing_controller_impl.h"
simonhatch0b016192015-05-22 19:14:0220#include "content/public/browser/background_tracing_manager.h"
21
22namespace content {
23
oysteinef4ce0b062015-08-26 01:33:0624class BackgroundTracingRule;
Ehsan Chiniforooshana09fc882017-06-14 16:24:3825class TraceMessageFilter;
oysteine386fc9e2015-06-07 18:45:4126class TracingDelegate;
27
oysteinef4ce0b062015-08-26 01:33:0628class BackgroundTracingManagerImpl : public BackgroundTracingManager {
simonhatch0b016192015-05-22 19:14:0229 public:
ssideb549622017-03-29 21:46:0030 // Enabled state observers get a callback when the state of background tracing
31 // changes.
32 class CONTENT_EXPORT EnabledStateObserver {
33 public:
34 // Called when the activation of a background tracing scenario is
35 // successful.
36 virtual void OnScenarioActivated(
37 const BackgroundTracingConfigImpl* config) = 0;
38
Siddhartha24ef3c472017-08-22 00:19:2039 // In case the scenario was aborted before or after tracing was enabled.
40 virtual void OnScenarioAborted() = 0;
41
ssideb549622017-03-29 21:46:0042 // Called after tracing is enabled on all processes because the rule was
43 // triggered.
44 virtual void OnTracingEnabled(
45 BackgroundTracingConfigImpl::CategoryPreset preset) = 0;
46
47 virtual ~EnabledStateObserver() = default;
48 };
49
Ehsan Chiniforooshana09fc882017-06-14 16:24:3850 class TraceMessageFilterObserver {
51 public:
52 virtual void OnTraceMessageFilterAdded(TraceMessageFilter* filter) = 0;
53 virtual void OnTraceMessageFilterRemoved(TraceMessageFilter* filter) = 0;
54 };
55
ssideb549622017-03-29 21:46:0056 CONTENT_EXPORT static BackgroundTracingManagerImpl* GetInstance();
simonhatch0b016192015-05-22 19:14:0257
dcheng59716272016-04-09 05:19:0858 bool SetActiveScenario(std::unique_ptr<BackgroundTracingConfig>,
simonhatch0b016192015-05-22 19:14:0259 const ReceiveCallback&,
oysteineaf2b8002015-06-06 05:02:2860 DataFiltering data_filtering) override;
simonhatch0b016192015-05-22 19:14:0261 void WhenIdle(IdleCallback idle_callback) override;
62
63 void TriggerNamedEvent(TriggerHandle, StartedFinalizingCallback) override;
64 TriggerHandle RegisterTriggerType(const char* trigger_name) override;
simonhatch0b016192015-05-22 19:14:0265
oysteinea7d2d842015-10-21 20:57:0766 void OnHistogramTrigger(const std::string& histogram_name);
67
68 void OnRuleTriggered(const BackgroundTracingRule* triggered_rule,
69 StartedFinalizingCallback callback);
70 void AbortScenario();
oysteine53772602015-11-02 22:41:2771 bool HasActiveScenario() override;
oysteinea7d2d842015-10-21 20:57:0772
ssideb549622017-03-29 21:46:0073 void OnStartTracingDone(BackgroundTracingConfigImpl::CategoryPreset preset);
74
75 // Add/remove EnabledStateObserver.
76 CONTENT_EXPORT void AddEnabledStateObserver(EnabledStateObserver* observer);
77 CONTENT_EXPORT void RemoveEnabledStateObserver(
78 EnabledStateObserver* observer);
79
Ehsan Chiniforooshana09fc882017-06-14 16:24:3880 // Add/remove TraceMessageFilter{Observer}.
81 void AddTraceMessageFilter(TraceMessageFilter* trace_message_filter);
82 void RemoveTraceMessageFilter(TraceMessageFilter* trace_message_filter);
83 void AddTraceMessageFilterObserver(TraceMessageFilterObserver* observer);
84 void RemoveTraceMessageFilterObserver(TraceMessageFilterObserver* observer);
85
oysteinea7d2d842015-10-21 20:57:0786 // For tests
simonhatch0b016192015-05-22 19:14:0287 void InvalidateTriggerHandlesForTesting() override;
oysteinea7d2d842015-10-21 20:57:0788 CONTENT_EXPORT void SetRuleTriggeredCallbackForTesting(
89 const base::Closure& callback);
fmeawad743fcdf2015-06-03 23:55:3490 void FireTimerForTesting() override;
oysteinea7d2d842015-10-21 20:57:0791 CONTENT_EXPORT bool IsTracingForTesting();
oysteinef4ce0b062015-08-26 01:33:0692
simonhatch0b016192015-05-22 19:14:0293 private:
94 BackgroundTracingManagerImpl();
95 ~BackgroundTracingManagerImpl() override;
96
ssid8ed45162016-06-04 08:13:2697 void StartTracing(BackgroundTracingConfigImpl::CategoryPreset,
98 base::trace_event::TraceRecordMode);
zhenw873bdff2015-11-11 22:16:5599 void StartTracingIfConfigNeedsIt();
dcheng59716272016-04-09 05:19:08100 void OnFinalizeStarted(std::unique_ptr<const base::DictionaryValue> metadata,
101 base::RefCountedString*);
simonhatch0b016192015-05-22 19:14:02102 void OnFinalizeComplete();
103 void BeginFinalizing(StartedFinalizingCallback);
oysteine4b43fe0f2015-06-12 19:23:08104 void ValidateStartupScenario();
simonhatch0b016192015-05-22 19:14:02105
caseqbffe4e62016-07-14 02:09:14106 void AddCustomMetadata();
simonhatch0cc9fee2015-06-15 22:26:19107
simonhatch0b016192015-05-22 19:14:02108 std::string GetTriggerNameFromHandle(TriggerHandle handle) const;
109 bool IsTriggerHandleValid(TriggerHandle handle) const;
110
oysteinef4ce0b062015-08-26 01:33:06111 BackgroundTracingRule* GetRuleAbleToTriggerTracing(
112 TriggerHandle handle) const;
113 bool IsSupportedConfig(BackgroundTracingConfigImpl* config);
simonhatch0b016192015-05-22 19:14:02114
zhenwd601ddc52015-06-02 21:46:34115 std::string GetCategoryFilterStringForCategoryPreset(
oysteinef4ce0b062015-08-26 01:33:06116 BackgroundTracingConfigImpl::CategoryPreset) const;
simonhatch0b016192015-05-22 19:14:02117
fmeawad743fcdf2015-06-03 23:55:34118 class TracingTimer {
119 public:
120 explicit TracingTimer(StartedFinalizingCallback);
121 ~TracingTimer();
122
simonhatch99cf30b2015-08-27 14:58:25123 void StartTimer(int seconds);
fmeawad743fcdf2015-06-03 23:55:34124 void CancelTimer();
fmeawad743fcdf2015-06-03 23:55:34125 void FireTimerForTesting();
126
127 private:
128 void TracingTimerFired();
129
danakj8c3eb802015-09-24 07:53:00130 base::OneShotTimer tracing_timer_;
fmeawad743fcdf2015-06-03 23:55:34131 StartedFinalizingCallback callback_;
132 };
133
dcheng59716272016-04-09 05:19:08134 std::unique_ptr<TracingDelegate> delegate_;
135 std::unique_ptr<const content::BackgroundTracingConfigImpl> config_;
simonhatch0b016192015-05-22 19:14:02136 std::map<TriggerHandle, std::string> trigger_handles_;
dcheng59716272016-04-09 05:19:08137 std::unique_ptr<TracingTimer> tracing_timer_;
simonhatch0b016192015-05-22 19:14:02138 ReceiveCallback receive_callback_;
oysteine59dc4002016-06-07 21:27:09139 std::unique_ptr<base::DictionaryValue> last_triggered_rule_;
simonhatch0b016192015-05-22 19:14:02140 bool is_gathering_;
141 bool is_tracing_;
142 bool requires_anonymized_data_;
143 int trigger_handle_ids_;
144
oysteinea7d2d842015-10-21 20:57:07145 TriggerHandle triggered_named_event_handle_;
simonhatch99cf30b2015-08-27 14:58:25146
Ehsan Chiniforooshana09fc882017-06-14 16:24:38147 // There is no need to use base::ObserverList to store observers because we
148 // only access |background_tracing_observers_| and
149 // |trace_message_filter_observers_| from the UI thread.
150 std::set<EnabledStateObserver*> background_tracing_observers_;
151 std::set<scoped_refptr<TraceMessageFilter>> trace_message_filters_;
152 std::set<TraceMessageFilterObserver*> trace_message_filter_observers_;
ssideb549622017-03-29 21:46:00153
simonhatch0b016192015-05-22 19:14:02154 IdleCallback idle_callback_;
oysteineaf2b8002015-06-06 05:02:28155 base::Closure tracing_enabled_callback_for_testing_;
oysteinea7d2d842015-10-21 20:57:07156 base::Closure rule_triggered_callback_for_testing_;
simonhatch0b016192015-05-22 19:14:02157
scottmg5e65e3a2017-03-08 08:48:46158 friend struct base::LazyInstanceTraitsBase<BackgroundTracingManagerImpl>;
simonhatch0b016192015-05-22 19:14:02159
160 DISALLOW_COPY_AND_ASSIGN(BackgroundTracingManagerImpl);
161};
162
163} // namespace content
164
165#endif // CONTENT_BROWSER_TRACING_BACKGROUND_TRACING_MANAGER_IMPL_H_