1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
// 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 "components/cast_receiver/browser/permissions_manager_impl.h"
#include "base/containers/contains.h"
#include "content/public/browser/web_contents.h"
namespace cast_receiver {
namespace {
// Key in the WebContents's UserData where the singleton instance for this
// WebContents will be stored.
// TODO(crbug.com/1382897): Combine with other cast_receiver UserData.
const char kPermissionManagerUserDataKey[] =
"components/cast_receiver/browser/permissions_manager_impl";
} // namespace
// static
PermissionsManager* PermissionsManager::GetInstance(
content::WebContents& web_contents) {
PermissionsManager* instance = static_cast<PermissionsManagerImpl*>(
web_contents.GetUserData(&kPermissionManagerUserDataKey));
return instance;
}
// static
PermissionsManagerImpl* PermissionsManagerImpl::CreateInstance(
content::WebContents& web_contents,
std::string app_id) {
DCHECK(GetInstance(web_contents) == nullptr);
std::unique_ptr<PermissionsManagerImpl> permission_manager =
std::make_unique<PermissionsManagerImpl>(std::move(app_id));
auto* ptr = permission_manager.get();
web_contents.SetUserData(&kPermissionManagerUserDataKey,
std::move(permission_manager));
return ptr;
}
PermissionsManagerImpl::PermissionsManagerImpl(std::string app_id)
: app_id_(std::move(app_id)) {}
PermissionsManagerImpl::~PermissionsManagerImpl() = default;
void PermissionsManagerImpl::AddPermission(blink::PermissionType permission) {
// TODO(crbug.com/1383326): Ensure this each permission is valid per an allow
// list maintained by this component.
permissions_.push_back(permission);
}
void PermissionsManagerImpl::AddOrigin(url::Origin origin) {
CHECK(!origin.opaque());
additional_origins_.push_back(std::move(origin));
}
const std::string& PermissionsManagerImpl::GetAppId() const {
return app_id_;
}
blink::mojom::PermissionStatus PermissionsManagerImpl::GetPermissionStatus(
blink::PermissionType permission,
const GURL& url) const {
if (!base::Contains(permissions_, permission)) {
return blink::mojom::PermissionStatus::DENIED;
}
const url::Origin url_origin = url::Origin::Create(url);
if (app_url_ && url_origin.IsSameOriginWith(app_url_.value())) {
return blink::mojom::PermissionStatus::GRANTED;
}
if (base::Contains(additional_origins_, url_origin)) {
return blink::mojom::PermissionStatus::GRANTED;
}
return blink::mojom::PermissionStatus::DENIED;
}
} // namespace cast_receiver
|