blob: eb9f46939b517a55e1d4ef49379e76e524910a4c [file] [log] [blame]
// Copyright 2019 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 "content/public/browser/devtools_permission_overrides.h"
#include "base/no_destructor.h"
namespace content {
using PermissionOverrides = DevToolsPermissionOverrides::PermissionOverrides;
using PermissionStatus = blink::mojom::PermissionStatus;
DevToolsPermissionOverrides::DevToolsPermissionOverrides() = default;
DevToolsPermissionOverrides::~DevToolsPermissionOverrides() = default;
DevToolsPermissionOverrides::DevToolsPermissionOverrides(
DevToolsPermissionOverrides&& other) = default;
DevToolsPermissionOverrides& DevToolsPermissionOverrides::operator=(
DevToolsPermissionOverrides&& other) = default;
void DevToolsPermissionOverrides::Set(const url::Origin& origin,
const PermissionType& permission,
const PermissionStatus status) {
PermissionOverrides& origin_overrides = overrides_[origin];
origin_overrides[permission] = status;
// Special override status - MIDI_SYSEX is stronger than MIDI, meaning that
// granting MIDI_SYSEX implies granting MIDI, while denying MIDI implies
// denying MIDI_SYSEX.
if (permission == PermissionType::MIDI &&
status != PermissionStatus::GRANTED) {
origin_overrides[PermissionType::MIDI_SYSEX] = status;
} else if (permission == PermissionType::MIDI_SYSEX &&
status == PermissionStatus::GRANTED) {
origin_overrides[PermissionType::MIDI] = status;
}
}
base::Optional<PermissionStatus> DevToolsPermissionOverrides::Get(
const url::Origin& origin,
const PermissionType& type) const {
auto current_override = overrides_.find(origin);
if (current_override == overrides_.end())
return base::nullopt;
auto new_status = current_override->second.find(type);
if (new_status == current_override->second.end())
return base::nullopt;
return base::make_optional(new_status->second);
}
const PermissionOverrides& DevToolsPermissionOverrides::GetAll(
const url::Origin& origin) const {
static const base::NoDestructor<PermissionOverrides> empty_overrides;
auto it = overrides_.find(origin);
if (it == overrides_.end())
return *empty_overrides;
return it->second;
}
void DevToolsPermissionOverrides::GrantPermissions(
const url::Origin& origin,
const std::vector<PermissionType>& permissions) {
const std::vector<PermissionType>& kAllPermissionTypes =
GetAllPermissionTypes();
PermissionOverrides granted_overrides;
for (const auto& permission : kAllPermissionTypes)
granted_overrides[permission] = PermissionStatus::DENIED;
for (const auto& permission : permissions)
granted_overrides[permission] = PermissionStatus::GRANTED;
Reset(origin);
SetAll(origin, granted_overrides);
}
void DevToolsPermissionOverrides::SetAll(const url::Origin& origin,
const PermissionOverrides& overrides) {
PermissionOverrides& current_override = overrides_[origin];
for (const auto& setting : overrides)
current_override[setting.first] = setting.second;
}
} // namespace content