| // 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<network::mojom::NetLogProxySource> | 
 |           proxy_source_receiver, | 
 |       mojo::Remote<network::mojom::NetLogProxySink> 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<network::mojom::NetLogProxySource> proxy_source_receiver_; | 
 |   mojo::Remote<network::mojom::NetLogProxySink> proxy_sink_remote_; | 
 |   scoped_refptr<base::SequencedTaskRunner> 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<NetLogProxySource> weak_this_; | 
 |  | 
 |   base::WeakPtrFactory<NetLogProxySource> weak_factory_{this}; | 
 | }; | 
 |  | 
 | }  // namespace net_log | 
 |  | 
 | #endif  // COMPONENTS_NET_LOG_NET_LOG_PROXY_SOURCE_H_ |