| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "android_webview/browser/aw_content_browser_client.h" |
| |
| #include "android_webview/browser/aw_browser_context.h" |
| #include "components/cdm/browser/media_drm_storage_impl.h" |
| #include "components/prefs/pref_service.h" |
| #include "media/mojo/buildflags.h" |
| |
| namespace android_webview { |
| |
| namespace { |
| |
| #if BUILDFLAG(ENABLE_MOJO_CDM) |
| void CreateOriginId(cdm::MediaDrmStorageImpl::OriginIdObtainedCB callback) { |
| std::move(callback).Run(true, base::UnguessableToken::Create()); |
| } |
| |
| void AllowEmptyOriginIdCB(base::OnceCallback<void(bool)> callback) { |
| // Since CreateOriginId() always returns a non-empty origin ID, we don't need |
| // to allow empty origin ID. |
| std::move(callback).Run(false); |
| } |
| |
| void CreateMediaDrmStorage( |
| content::RenderFrameHost* render_frame_host, |
| mojo::PendingReceiver<::media::mojom::MediaDrmStorage> receiver) { |
| DCHECK(render_frame_host); |
| |
| if (render_frame_host->GetLastCommittedOrigin().opaque()) { |
| DVLOG(1) << __func__ << ": Unique origin."; |
| return; |
| } |
| |
| content::WebContents* web_contents = |
| content::WebContents::FromRenderFrameHost(render_frame_host); |
| DCHECK(web_contents) << "WebContents not available."; |
| |
| auto* aw_browser_context = |
| static_cast<AwBrowserContext*>(web_contents->GetBrowserContext()); |
| DCHECK(aw_browser_context) << "AwBrowserContext not available."; |
| |
| PrefService* pref_service = aw_browser_context->GetPrefService(); |
| DCHECK(pref_service); |
| |
| // The object will be deleted on connection error, or when the frame navigates |
| // away. |
| new cdm::MediaDrmStorageImpl( |
| render_frame_host, pref_service, base::BindRepeating(&CreateOriginId), |
| base::BindRepeating(&AllowEmptyOriginIdCB), std::move(receiver)); |
| } |
| #endif // BUILDFLAG(ENABLE_MOJO_CDM) |
| |
| } // anonymous namespace |
| |
| void AwContentBrowserClient::BindMediaServiceReceiver( |
| content::RenderFrameHost* render_frame_host, |
| mojo::GenericPendingReceiver receiver) { |
| #if BUILDFLAG(ENABLE_MOJO_CDM) |
| if (auto r = receiver.As<media::mojom::MediaDrmStorage>()) { |
| CreateMediaDrmStorage(render_frame_host, std::move(r)); |
| return; |
| } |
| #endif |
| } |
| |
| } // namespace android_webview |