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