aw_content_browser_client_receiver_bindings.cc 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // Copyright 2020 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. #include "android_webview/browser/aw_content_browser_client.h"
  5. #include "android_webview/browser/aw_browser_context.h"
  6. #include "android_webview/browser/aw_print_manager.h"
  7. #include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
  8. #include "android_webview/browser/safe_browsing/aw_url_checker_delegate_impl.h"
  9. #include "components/autofill/content/browser/content_autofill_driver_factory.h"
  10. #include "components/cdm/browser/media_drm_storage_impl.h"
  11. #include "components/content_capture/browser/onscreen_content_provider.h"
  12. #include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
  13. #include "components/prefs/pref_service.h"
  14. #include "components/safe_browsing/content/browser/mojo_safe_browsing_impl.h"
  15. #include "components/security_interstitials/content/security_interstitial_tab_helper.h"
  16. #include "components/spellcheck/spellcheck_buildflags.h"
  17. #include "content/public/browser/browser_associated_interface.h"
  18. #include "content/public/browser/render_frame_host.h"
  19. #include "content/public/browser/render_process_host.h"
  20. #include "media/mojo/buildflags.h"
  21. #include "mojo/public/cpp/bindings/self_owned_receiver.h"
  22. #include "services/service_manager/public/cpp/binder_registry.h"
  23. #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
  24. #if BUILDFLAG(ENABLE_SPELLCHECK)
  25. #include "components/spellcheck/browser/spell_check_host_impl.h"
  26. #endif
  27. namespace android_webview {
  28. namespace {
  29. #if BUILDFLAG(ENABLE_MOJO_CDM)
  30. void CreateOriginId(cdm::MediaDrmStorageImpl::OriginIdObtainedCB callback) {
  31. std::move(callback).Run(true, base::UnguessableToken::Create());
  32. }
  33. void AllowEmptyOriginIdCB(base::OnceCallback<void(bool)> callback) {
  34. // Since CreateOriginId() always returns a non-empty origin ID, we don't need
  35. // to allow empty origin ID.
  36. std::move(callback).Run(false);
  37. }
  38. void CreateMediaDrmStorage(
  39. content::RenderFrameHost* render_frame_host,
  40. mojo::PendingReceiver<::media::mojom::MediaDrmStorage> receiver) {
  41. CHECK(render_frame_host);
  42. if (render_frame_host->GetLastCommittedOrigin().opaque()) {
  43. DVLOG(1) << __func__ << ": Unique origin.";
  44. return;
  45. }
  46. auto* aw_browser_context =
  47. static_cast<AwBrowserContext*>(render_frame_host->GetBrowserContext());
  48. DCHECK(aw_browser_context) << "AwBrowserContext not available.";
  49. PrefService* pref_service = aw_browser_context->GetPrefService();
  50. DCHECK(pref_service);
  51. // The object will be deleted on connection error, or when the frame navigates
  52. // away.
  53. new cdm::MediaDrmStorageImpl(
  54. *render_frame_host, pref_service, base::BindRepeating(&CreateOriginId),
  55. base::BindRepeating(&AllowEmptyOriginIdCB), std::move(receiver));
  56. }
  57. #endif // BUILDFLAG(ENABLE_MOJO_CDM)
  58. // Helper method that checks the RenderProcessHost is still alive before hopping
  59. // over to the IO thread.
  60. void MaybeCreateSafeBrowsing(
  61. int rph_id,
  62. content::ResourceContext* resource_context,
  63. base::RepeatingCallback<scoped_refptr<safe_browsing::UrlCheckerDelegate>()>
  64. get_checker_delegate,
  65. mojo::PendingReceiver<safe_browsing::mojom::SafeBrowsing> receiver) {
  66. DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  67. content::RenderProcessHost* render_process_host =
  68. content::RenderProcessHost::FromID(rph_id);
  69. if (!render_process_host)
  70. return;
  71. content::GetIOThreadTaskRunner({})->PostTask(
  72. FROM_HERE,
  73. base::BindOnce(&safe_browsing::MojoSafeBrowsingImpl::MaybeCreate, rph_id,
  74. resource_context, std::move(get_checker_delegate),
  75. std::move(receiver)));
  76. }
  77. } // anonymous namespace
  78. void AwContentBrowserClient::BindMediaServiceReceiver(
  79. content::RenderFrameHost* render_frame_host,
  80. mojo::GenericPendingReceiver receiver) {
  81. #if BUILDFLAG(ENABLE_MOJO_CDM)
  82. if (auto r = receiver.As<media::mojom::MediaDrmStorage>()) {
  83. CreateMediaDrmStorage(render_frame_host, std::move(r));
  84. return;
  85. }
  86. #endif
  87. }
  88. void AwContentBrowserClient::
  89. RegisterAssociatedInterfaceBindersForRenderFrameHost(
  90. content::RenderFrameHost& render_frame_host,
  91. blink::AssociatedInterfaceRegistry& associated_registry) {
  92. // TODO(lingqi): Swap the parameters so that lambda functions are not needed.
  93. associated_registry.AddInterface<autofill::mojom::AutofillDriver>(
  94. base::BindRepeating(
  95. [](content::RenderFrameHost* render_frame_host,
  96. mojo::PendingAssociatedReceiver<autofill::mojom::AutofillDriver>
  97. receiver) {
  98. autofill::ContentAutofillDriverFactory::BindAutofillDriver(
  99. std::move(receiver), render_frame_host);
  100. },
  101. &render_frame_host));
  102. associated_registry.AddInterface<
  103. content_capture::mojom::ContentCaptureReceiver>(base::BindRepeating(
  104. [](content::RenderFrameHost* render_frame_host,
  105. mojo::PendingAssociatedReceiver<
  106. content_capture::mojom::ContentCaptureReceiver> receiver) {
  107. content_capture::OnscreenContentProvider::BindContentCaptureReceiver(
  108. std::move(receiver), render_frame_host);
  109. },
  110. &render_frame_host));
  111. associated_registry.AddInterface<mojom::FrameHost>(base::BindRepeating(
  112. [](content::RenderFrameHost* render_frame_host,
  113. mojo::PendingAssociatedReceiver<mojom::FrameHost> receiver) {
  114. AwRenderViewHostExt::BindFrameHost(std::move(receiver),
  115. render_frame_host);
  116. },
  117. &render_frame_host));
  118. associated_registry.AddInterface<page_load_metrics::mojom::PageLoadMetrics>(
  119. base::BindRepeating(
  120. [](content::RenderFrameHost* render_frame_host,
  121. mojo::PendingAssociatedReceiver<
  122. page_load_metrics::mojom::PageLoadMetrics> receiver) {
  123. page_load_metrics::MetricsWebContentsObserver::BindPageLoadMetrics(
  124. std::move(receiver), render_frame_host);
  125. },
  126. &render_frame_host));
  127. associated_registry.AddInterface<printing::mojom::PrintManagerHost>(
  128. base::BindRepeating(
  129. [](content::RenderFrameHost* render_frame_host,
  130. mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost>
  131. receiver) {
  132. AwPrintManager::BindPrintManagerHost(std::move(receiver),
  133. render_frame_host);
  134. },
  135. &render_frame_host));
  136. associated_registry.AddInterface<
  137. security_interstitials::mojom::InterstitialCommands>(base::BindRepeating(
  138. [](content::RenderFrameHost* render_frame_host,
  139. mojo::PendingAssociatedReceiver<
  140. security_interstitials::mojom::InterstitialCommands> receiver) {
  141. security_interstitials::SecurityInterstitialTabHelper::
  142. BindInterstitialCommands(std::move(receiver), render_frame_host);
  143. },
  144. &render_frame_host));
  145. }
  146. void AwContentBrowserClient::ExposeInterfacesToRenderer(
  147. service_manager::BinderRegistry* registry,
  148. blink::AssociatedInterfaceRegistry* associated_registry,
  149. content::RenderProcessHost* render_process_host) {
  150. content::ResourceContext* resource_context =
  151. render_process_host->GetBrowserContext()->GetResourceContext();
  152. registry->AddInterface<safe_browsing::mojom::SafeBrowsing>(
  153. base::BindRepeating(
  154. &MaybeCreateSafeBrowsing, render_process_host->GetID(),
  155. resource_context,
  156. base::BindRepeating(
  157. &AwContentBrowserClient::GetSafeBrowsingUrlCheckerDelegate,
  158. base::Unretained(this))),
  159. content::GetUIThreadTaskRunner({}));
  160. #if BUILDFLAG(ENABLE_SPELLCHECK)
  161. auto create_spellcheck_host =
  162. [](mojo::PendingReceiver<spellcheck::mojom::SpellCheckHost> receiver) {
  163. mojo::MakeSelfOwnedReceiver(std::make_unique<SpellCheckHostImpl>(),
  164. std::move(receiver));
  165. };
  166. registry->AddInterface<spellcheck::mojom::SpellCheckHost>(
  167. base::BindRepeating(create_spellcheck_host),
  168. content::GetUIThreadTaskRunner({}));
  169. #endif
  170. }
  171. } // namespace android_webview