| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ash/crosapi/multi_capture_service_ash.h" |
| |
| #include "ash/multi_capture/multi_capture_service_client.h" |
| #include "ash/shell.h" |
| #include "base/check_is_test.h" |
| #include "chrome/browser/ash/policy/multi_screen_capture/multi_screen_capture_policy_service.h" |
| #include "chrome/browser/ash/policy/multi_screen_capture/multi_screen_capture_policy_service_factory.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chromeos/ash/components/browser_context_helper/browser_context_helper.h" |
| #include "components/user_manager/user_manager.h" |
| #include "url/gurl.h" |
| |
| namespace crosapi { |
| |
| MultiCaptureServiceAsh::MultiCaptureServiceAsh() { |
| if (!ash::Shell::HasInstance()) { |
| CHECK_IS_TEST(); |
| } |
| } |
| MultiCaptureServiceAsh::~MultiCaptureServiceAsh() = default; |
| |
| void MultiCaptureServiceAsh::BindReceiver( |
| mojo::PendingReceiver<mojom::MultiCaptureService> receiver) { |
| multi_capture_service_receiver_set_.Add(this, std::move(receiver)); |
| } |
| |
| void MultiCaptureServiceAsh::MultiCaptureStarted(const std::string& label, |
| const std::string& host) { |
| // TODO(crbug.com/40249909): Origin cannot be used in a crosapi interface as |
| // it is not stable. Currently, only the host of the origin is used. Pass the |
| // complete origin when the `Origin` interface becomes stable. |
| GetMultiCaptureClient()->MultiCaptureStarted( |
| label, url::Origin::CreateFromNormalizedTuple(/*scheme=*/"https", host, |
| /*port=*/443)); |
| } |
| |
| void MultiCaptureServiceAsh::MultiCaptureStartedFromApp( |
| const std::string& label, |
| const std::string& app_id, |
| const std::string& app_name) { |
| GetMultiCaptureClient()->MultiCaptureStartedFromApp(label, app_id, app_name); |
| } |
| |
| void MultiCaptureServiceAsh::MultiCaptureStopped(const std::string& label) { |
| GetMultiCaptureClient()->MultiCaptureStopped(label); |
| } |
| |
| ash::MultiCaptureServiceClient* |
| MultiCaptureServiceAsh::GetMultiCaptureClient() { |
| auto* multi_capture_client = |
| ash::Shell::Get()->multi_capture_service_client(); |
| CHECK(multi_capture_client); |
| return multi_capture_client; |
| } |
| |
| void MultiCaptureServiceAsh::IsMultiCaptureAllowed( |
| const GURL& url, |
| IsMultiCaptureAllowedCallback callback) { |
| // This function is only called from the primary user on the Lacros side. |
| content::BrowserContext* context = |
| ash::BrowserContextHelper::Get()->GetBrowserContextByUser( |
| user_manager::UserManager::Get()->GetPrimaryUser()); |
| if (!context) { |
| std::move(callback).Run(false); |
| return; |
| } |
| |
| policy::MultiScreenCapturePolicyService* multi_capture_policy_service = |
| policy::MultiScreenCapturePolicyServiceFactory::GetForBrowserContext( |
| context); |
| if (!multi_capture_policy_service) { |
| std::move(callback).Run(false); |
| return; |
| } |
| |
| std::move(callback).Run( |
| multi_capture_policy_service->IsMultiScreenCaptureAllowed(url)); |
| } |
| |
| void MultiCaptureServiceAsh::IsMultiCaptureAllowedForAnyOriginOnMainProfile( |
| IsMultiCaptureAllowedForAnyOriginOnMainProfileCallback callback) { |
| auto* context = ash::BrowserContextHelper::Get()->GetBrowserContextByUser( |
| user_manager::UserManager::Get()->GetPrimaryUser()); |
| policy::MultiScreenCapturePolicyService* multi_capture_policy_service = |
| policy::MultiScreenCapturePolicyServiceFactory::GetForBrowserContext( |
| context); |
| std::move(callback).Run(multi_capture_policy_service && |
| multi_capture_policy_service->GetAllowListSize() > 0); |
| } |
| |
| } // namespace crosapi |