1 // Copyright 2016 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_MEDIA_SESSION_MEDIA_SESSION_SERVICE_IMPL_H_
6 #define CONTENT_BROWSER_MEDIA_SESSION_MEDIA_SESSION_SERVICE_IMPL_H_
7 
8 #include "content/common/content_export.h"
9 #include "mojo/public/cpp/bindings/pending_receiver.h"
10 #include "mojo/public/cpp/bindings/pending_remote.h"
11 #include "mojo/public/cpp/bindings/receiver.h"
12 #include "mojo/public/cpp/bindings/remote.h"
13 #include "third_party/blink/public/mojom/mediasession/media_session.mojom.h"
14 
15 namespace content {
16 
17 class RenderFrameHost;
18 class MediaSessionImpl;
19 
20 // There is one MediaSessionService per frame. The class is owned by
21 // RenderFrameHost and should register/unregister itself to/from
22 // MediaSessionImpl when RenderFrameHost is created/destroyed.
23 class CONTENT_EXPORT MediaSessionServiceImpl
24     : public blink::mojom::MediaSessionService {
25  public:
26   ~MediaSessionServiceImpl() override;
27 
28   static void Create(
29       RenderFrameHost* render_frame_host,
30       mojo::PendingReceiver<blink::mojom::MediaSessionService> receiver);
GetClient()31   const mojo::Remote<blink::mojom::MediaSessionClient>& GetClient() {
32     return client_;
33   }
34   RenderFrameHost* GetRenderFrameHost();
35 
playback_state()36   blink::mojom::MediaSessionPlaybackState playback_state() const {
37     return playback_state_;
38   }
metadata()39   const blink::mojom::SpecMediaMetadataPtr& metadata() const {
40     return metadata_;
41   }
actions()42   const std::set<media_session::mojom::MediaSessionAction>& actions() const {
43     return actions_;
44   }
position()45   const base::Optional<media_session::MediaPosition>& position() const {
46     return position_;
47   }
48 
49   void DidFinishNavigation();
50   void FlushForTesting();
51 
52   // blink::mojom::MediaSessionService implementation.
53   void SetClient(
54       mojo::PendingRemote<blink::mojom::MediaSessionClient> client) override;
55 
56   void SetPlaybackState(blink::mojom::MediaSessionPlaybackState state) override;
57   void SetPositionState(
58       const base::Optional<media_session::MediaPosition>& position) override;
59   void SetMetadata(blink::mojom::SpecMediaMetadataPtr metadata) override;
60 
61   void EnableAction(media_session::mojom::MediaSessionAction action) override;
62   void DisableAction(media_session::mojom::MediaSessionAction action) override;
63 
64  protected:
65   explicit MediaSessionServiceImpl(RenderFrameHost* render_frame_host);
66 
67  private:
68   MediaSessionImpl* GetMediaSession();
69 
70   void Bind(mojo::PendingReceiver<blink::mojom::MediaSessionService> receiver);
71 
72   void ClearActions();
73 
74   const int render_frame_process_id_;
75   const int render_frame_routing_id_;
76 
77   // RAII binding of |this| to an MediaSessionService interface request.
78   // The binding is removed when receiver_ is cleared or goes out of scope.
79   std::unique_ptr<mojo::Receiver<blink::mojom::MediaSessionService>> receiver_;
80   mojo::Remote<blink::mojom::MediaSessionClient> client_;
81   blink::mojom::MediaSessionPlaybackState playback_state_;
82   blink::mojom::SpecMediaMetadataPtr metadata_;
83   std::set<media_session::mojom::MediaSessionAction> actions_;
84   base::Optional<media_session::MediaPosition> position_;
85 
86   DISALLOW_COPY_AND_ASSIGN(MediaSessionServiceImpl);
87 };
88 
89 }  // namespace content
90 
91 #endif  // CONTENT_BROWSER_MEDIA_SESSION_MEDIA_SESSION_SERVICE_IMPL_H_
92