1 // Copyright 2014 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 CHROMECAST_RENDERER_CAST_CONTENT_RENDERER_CLIENT_H_
6 #define CHROMECAST_RENDERER_CAST_CONTENT_RENDERER_CLIENT_H_
7 
8 #include <memory>
9 #include <string>
10 #include <vector>
11 
12 #include "base/macros.h"
13 #include "build/build_config.h"
14 #include "chromecast/chromecast_buildflags.h"
15 #include "chromecast/common/mojom/application_media_capabilities.mojom.h"
16 #include "chromecast/renderer/cast_activity_url_filter_manager.h"
17 #include "chromecast/renderer/identification_settings_manager_store.h"
18 #include "content/public/renderer/content_renderer_client.h"
19 #include "media/base/audio_codecs.h"
20 #include "media/base/audio_parameters.h"
21 #include "mojo/public/cpp/bindings/receiver.h"
22 
23 namespace extensions {
24 class ExtensionsClient;
25 class ExtensionsGuestViewContainerDispatcher;
26 class CastExtensionsRendererClient;
27 }  // namespace extensions
28 
29 namespace chromecast {
30 class IdentificationSettingsManager;
31 class MemoryPressureObserverImpl;
32 namespace media {
33 class MediaCapsObserverImpl;
34 class SupportedCodecProfileLevelsMemo;
35 
36 #if defined(OS_ANDROID)
37 class CastAudioDeviceFactory;
38 #endif  // defined(OS_ANDROID)
39 }
40 
41 namespace shell {
42 
43 class CastContentRendererClient
44     : public content::ContentRendererClient,
45       public mojom::ApplicationMediaCapabilitiesObserver,
46       public IdentificationSettingsManagerStore {
47  public:
48   // Creates an implementation of CastContentRendererClient. Platform should
49   // link in an implementation as needed.
50   static std::unique_ptr<CastContentRendererClient> Create();
51 
52   ~CastContentRendererClient() override;
53 
54   // ContentRendererClient implementation:
55   void RenderThreadStarted() override;
56   void RenderViewCreated(content::RenderView* render_view) override;
57   void RenderFrameCreated(content::RenderFrame* render_frame) override;
58   void RunScriptsAtDocumentStart(content::RenderFrame* render_frame) override;
59   void RunScriptsAtDocumentEnd(content::RenderFrame* render_frame) override;
60   void AddSupportedKeySystems(
61       std::vector<std::unique_ptr<::media::KeySystemProperties>>*
62           key_systems_properties) override;
63   bool IsSupportedAudioType(const ::media::AudioType& type) override;
64   bool IsSupportedVideoType(const ::media::VideoType& type) override;
65   bool IsSupportedBitstreamAudioCodec(::media::AudioCodec codec) override;
66   std::unique_ptr<blink::WebPrescientNetworking> CreatePrescientNetworking(
67       content::RenderFrame* render_frame) override;
68   bool DeferMediaLoad(content::RenderFrame* render_frame,
69                       bool render_frame_has_played_media_before,
70                       base::OnceClosure closure) override;
71   std::unique_ptr<::media::Demuxer> OverrideDemuxerForUrl(
72       content::RenderFrame* render_frame,
73       const GURL& url,
74       scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
75   bool IsIdleMediaSuspendEnabled() override;
76   void SetRuntimeFeaturesDefaultsBeforeBlinkInitialization() override;
77   std::unique_ptr<content::WebSocketHandshakeThrottleProvider>
78   CreateWebSocketHandshakeThrottleProvider() override;
79   std::unique_ptr<content::URLLoaderThrottleProvider>
80   CreateURLLoaderThrottleProvider(
81       content::URLLoaderThrottleProviderType type) override;
82   base::Optional<::media::AudioRendererAlgorithmParameters>
83   GetAudioRendererAlgorithmParameters(
84       ::media::AudioParameters audio_parameters) override;
85 
86  protected:
87   CastContentRendererClient();
88 
89   // Returns true if running is deferred until in foreground; false if running
90   // occurs immediately.
91   virtual bool RunWhenInForeground(content::RenderFrame* render_frame,
92                                    base::OnceClosure closure);
93 
activity_url_filter_manager()94   CastActivityUrlFilterManager* activity_url_filter_manager() {
95     return activity_url_filter_manager_.get();
96   }
97 
98  private:
99   // mojom::ApplicationMediaCapabilitiesObserver implementation:
100   void OnSupportedBitstreamAudioCodecsChanged(
101       const BitstreamAudioCodecsInfo& info) override;
102 
103   bool CheckSupportedBitstreamAudioCodec(::media::AudioCodec codec,
104                                          bool check_spatial_rendering);
105 
106   // IdentificationSettingsManagerStore implementation:
107   IdentificationSettingsManager* GetSettingsManagerFromRenderFrameID(
108       int render_frame_id) override;
109 
110   // Called when a render frame is removed.
111   void OnRenderFrameRemoved(int render_frame_id);
112 
113   std::unique_ptr<media::MediaCapsObserverImpl> media_caps_observer_;
114   std::unique_ptr<media::SupportedCodecProfileLevelsMemo> supported_profiles_;
115   mojo::Receiver<mojom::ApplicationMediaCapabilitiesObserver>
116       app_media_capabilities_observer_receiver_{this};
117 #if !defined(OS_ANDROID)
118   std::unique_ptr<MemoryPressureObserverImpl> memory_pressure_observer_;
119 #endif
120 
121 #if BUILDFLAG(ENABLE_CHROMECAST_EXTENSIONS)
122   std::unique_ptr<extensions::ExtensionsClient> extensions_client_;
123   std::unique_ptr<extensions::CastExtensionsRendererClient>
124       extensions_renderer_client_;
125   std::unique_ptr<extensions::ExtensionsGuestViewContainerDispatcher>
126       guest_view_container_dispatcher_;
127 #endif
128 
129 #if defined(OS_ANDROID)
130   std::unique_ptr<media::CastAudioDeviceFactory> cast_audio_device_factory_;
131 #endif
132 
133   BitstreamAudioCodecsInfo supported_bitstream_audio_codecs_info_;
134 
135   base::flat_map<int, std::unique_ptr<IdentificationSettingsManager>>
136       settings_managers_;
137   std::unique_ptr<CastActivityUrlFilterManager> activity_url_filter_manager_;
138 
139   DISALLOW_COPY_AND_ASSIGN(CastContentRendererClient);
140 };
141 
142 }  // namespace shell
143 }  // namespace chromecast
144 
145 #endif  // CHROMECAST_RENDERER_CAST_CONTENT_RENDERER_CLIENT_H_
146