// Copyright 2020 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 COMPONENTS_NET_LOG_NET_LOG_PROXY_SOURCE_H_ #define COMPONENTS_NET_LOG_NET_LOG_PROXY_SOURCE_H_ #include "base/memory/weak_ptr.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/log/net_log.h" #include "services/network/public/mojom/network_service.mojom.h" namespace base { class SequencedTaskRunner; } namespace net_log { // Implementation of NetLogProxySource mojo interface which observes local // NetLog events and proxies them over mojo to a remote NetLogProxySink. // Observing and proxying is only active when notified through // UpdateCaptureModes() that capturing is active in the remote process. class NetLogProxySource : public net::NetLog::ThreadSafeObserver, public network::mojom::NetLogProxySource { public: // When notified through |proxy_source_receiver| that capturing is active, // registers a local NetLog observer and sends all NetLog events to // |proxy_sink_remote|. // The caller is expected to create a new NetLogProxySource if the remote // process is restarted. NetLogProxySource( mojo::PendingReceiver proxy_source_receiver, mojo::Remote proxy_sink_remote); ~NetLogProxySource() override; NetLogProxySource(const NetLogProxySource&) = delete; NetLogProxySource& operator=(const NetLogProxySource&) = delete; // Remove NetLog observer and close mojo pipes. void ShutDown(); // NetLog::ThreadSafeObserver: void OnAddEntry(const net::NetLogEntry& entry) override; // mojom::NetLogProxySource: void UpdateCaptureModes(net::NetLogCaptureModeSet modes) override; private: // Proxy entry to the remote. Must only be called on |task_runner_|. void SendNetLogEntry(net::NetLogEventType type, net::NetLogSourceType source_type, uint32_t source_id, base::TimeTicks source_start_time, net::NetLogEventPhase phase, base::TimeTicks time, base::Value params); mojo::Receiver proxy_source_receiver_; mojo::Remote proxy_sink_remote_; scoped_refptr task_runner_; // A WeakPtr to |this|, which is used when posting tasks from the // NetLog::ThreadSafeObserver to |task_runner_|. This single WeakPtr instance // is used for all tasks as the ThreadSafeObserver may call on any thread, so // the weak_factory_ cannot be accessed safely from those threads. base::WeakPtr weak_this_; base::WeakPtrFactory weak_factory_{this}; }; } // namespace net_log #endif // COMPONENTS_NET_LOG_NET_LOG_PROXY_SOURCE_H_