1 // Copyright 2019 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_FEATURE_OBSERVER_H_
6 #define CONTENT_BROWSER_FEATURE_OBSERVER_H_
7 
8 #include "base/containers/stack_container.h"
9 #include "base/macros.h"
10 #include "content/common/content_export.h"
11 #include "content/public/browser/global_routing_id.h"
12 #include "mojo/public/cpp/bindings/receiver_set.h"
13 #include "third_party/blink/public/mojom/feature_observer/feature_observer.mojom.h"
14 
15 namespace content {
16 
17 class FeatureObserverClient;
18 
19 // Observer interface to be notified when frames hold resources.
20 // client interfaces will be called on the same sequence GetFeatureObserver is
21 // called from.
22 class CONTENT_EXPORT FeatureObserver : public blink::mojom::FeatureObserver {
23  public:
24   // |client_| must outlive FeatureObserver.
25   FeatureObserver(FeatureObserverClient* client, GlobalFrameRoutingId id);
26   ~FeatureObserver() override;
27 
28   FeatureObserver(const FeatureObserver&) = delete;
29   FeatureObserver& operator=(const FeatureObserver&) = delete;
30 
31   void GetFeatureObserver(
32       mojo::PendingReceiver<blink::mojom::FeatureObserver> receiver);
33 
34   // blink::mojom::FeatureObserver implementation:
35   // For a given FeatureObserver receiver passed in through Bind, register the
36   // lifetime of a feature of a given type.
37   void Register(mojo::PendingReceiver<blink::mojom::ObservedFeature> feature,
38                 blink::mojom::ObservedFeatureType type) override;
39 
40  private:
41   // FeatureObservers notifying us about features used in this frame.
42   mojo::ReceiverSet<blink::mojom::FeatureObserver> observers_;
43 
44   // Registered features.
45   mojo::ReceiverSet<blink::mojom::ObservedFeature> features_by_type_
46       [static_cast<int>(blink::mojom::ObservedFeatureType::kMaxValue) + 1];
47 
48   FeatureObserverClient* const client_;
49   const GlobalFrameRoutingId id_;
50 };
51 
52 }  // namespace content
53 
54 #endif  // CONTENT_BROWSER_FEATURE_OBSERVER_H_
55