blob: d5ba03096120a8360527d85efc91fe7141afad5d [file] [log] [blame]
// Copyright 2024 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/content_settings/core/common/content_settings_types.h"
#include "extensions/browser/guest_view/web_view/web_view_permission_types.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/permissions/permission_utils.h"
namespace controlled_frame {
class ControlledFramePermissionsTest : public ::testing::Test {
public:
ControlledFramePermissionsTest() = default;
};
// This test verifies that all of the permissions / capabilities listed here
// have been vetted as operational or disabled for Controlled Frame. When a new
// permission is being added to one of the following types, the permission
// should be evaluated in the same way to understand if changes are necessary
// to ensure that the permission works well for the Controlled Frame API.
// Once it's vetted, you can add it to the appropriate switch statement in this
// test, then seek review from a Controlled Frame code owner.
//
// Here's a list of the concerns to consider for each permission:
//
// - Should the permission be disabled in Controlled Frame?
// If a permission or capability does not support isolating its permission
// grant/deny state from the default storage partition / profile, then it
// should be disabled in Controlled Frame. This helps prevent leaking user
// data from the default storage partition into an IWA context.
//
// - Does the permission ensure that the embedder also handles a permission
// request?
// Capabilities should be able to convey their permission request state
// into an embedding context as a way to verify that the permission should
// be granted. This helps the Controlled Frame API's permissionrequest
// event to work as expected.
//
// - Does the capability require a permissions policy?
// Controlled Frame embedders, such as Isolated Web Apps, need to have the
// appropriate permissions policy granted as well. In order to ensure that
// policy is granted, the capability must verify that the embedder has the
// new policy enabled, too.
//
// For more info about adding a new permission, see
// [add_new_permission.md](https://crsrc.org/c/components/permissions/add_new_permission.md).
TEST_F(ControlledFramePermissionsTest, Verify) {
std::vector<int> web_view_permissions;
for (int i = WEB_VIEW_PERMISSION_TYPE_MIN_VALUE;
i <= WEB_VIEW_PERMISSION_TYPE_MAX_VALUE; ++i) {
switch (i) {
case WEB_VIEW_PERMISSION_TYPE_UNKNOWN:
case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD:
case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM:
case WEB_VIEW_PERMISSION_TYPE_FULLSCREEN:
case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION:
case WEB_VIEW_PERMISSION_TYPE_HID:
case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG:
case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN:
case WEB_VIEW_PERMISSION_TYPE_MEDIA:
case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW:
case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK:
case WEB_VIEW_PERMISSION_TYPE_CLIPBOARD_READ_WRITE:
case WEB_VIEW_PERMISSION_TYPE_CLIPBOARD_SANITIZED_WRITE:
break;
default:
web_view_permissions.push_back(i);
}
}
EXPECT_TRUE(web_view_permissions.empty())
<< "found unknown WEB_VIEW_PERMISSION_TYPE: "
<< testing::PrintToString(web_view_permissions);
std::vector<ContentSettingsType> content_settings_types;
for (int i = static_cast<int>(ContentSettingsType::kMinValue);
i <= static_cast<int>(ContentSettingsType::kMaxValue); ++i) {
switch (static_cast<ContentSettingsType>(i)) {
case ContentSettingsType::GEOLOCATION:
case ContentSettingsType::GEOLOCATION_WITH_OPTIONS:
case ContentSettingsType::NOTIFICATIONS:
case ContentSettingsType::MIDI:
case ContentSettingsType::MIDI_SYSEX:
case ContentSettingsType::DURABLE_STORAGE:
case ContentSettingsType::MEDIASTREAM_CAMERA:
case ContentSettingsType::MEDIASTREAM_MIC:
case ContentSettingsType::BACKGROUND_SYNC:
case ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER:
case ContentSettingsType::SENSORS:
case ContentSettingsType::DEPRECATED_ACCESSIBILITY_EVENTS:
case ContentSettingsType::CLIPBOARD_READ_WRITE:
case ContentSettingsType::CLIPBOARD_SANITIZED_WRITE:
case ContentSettingsType::PAYMENT_HANDLER:
case ContentSettingsType::BACKGROUND_FETCH:
case ContentSettingsType::PERIODIC_BACKGROUND_SYNC:
case ContentSettingsType::WAKE_LOCK_SCREEN:
case ContentSettingsType::WAKE_LOCK_SYSTEM:
case ContentSettingsType::NFC:
case ContentSettingsType::VR:
case ContentSettingsType::AR:
case ContentSettingsType::HAND_TRACKING:
case ContentSettingsType::SMART_CARD_DATA:
case ContentSettingsType::STORAGE_ACCESS:
case ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS:
case ContentSettingsType::CAMERA_PAN_TILT_ZOOM:
case ContentSettingsType::WINDOW_MANAGEMENT:
case ContentSettingsType::LOCAL_FONTS:
case ContentSettingsType::IDLE_DETECTION:
case ContentSettingsType::DISPLAY_CAPTURE:
case ContentSettingsType::CAPTURED_SURFACE_CONTROL:
case ContentSettingsType::WEB_PRINTING:
case ContentSettingsType::SPEAKER_SELECTION:
case ContentSettingsType::KEYBOARD_LOCK:
case ContentSettingsType::POINTER_LOCK:
case ContentSettingsType::AUTOMATIC_FULLSCREEN:
case ContentSettingsType::WEB_APP_INSTALLATION:
case ContentSettingsType::USB_GUARD:
case ContentSettingsType::SERIAL_GUARD:
case ContentSettingsType::BLUETOOTH_GUARD:
case ContentSettingsType::BLUETOOTH_SCANNING:
case ContentSettingsType::FILE_SYSTEM_WRITE_GUARD:
case ContentSettingsType::HID_GUARD:
case ContentSettingsType::SMART_CARD_GUARD:
case ContentSettingsType::DEFAULT:
case ContentSettingsType::COOKIES:
case ContentSettingsType::IMAGES:
case ContentSettingsType::JAVASCRIPT:
case ContentSettingsType::POPUPS:
case ContentSettingsType::AUTO_SELECT_CERTIFICATE:
case ContentSettingsType::MIXEDSCRIPT:
case ContentSettingsType::PROTOCOL_HANDLERS:
case ContentSettingsType::DEPRECATED_PPAPI_BROKER:
case ContentSettingsType::AUTOMATIC_DOWNLOADS:
case ContentSettingsType::SSL_CERT_DECISIONS:
case ContentSettingsType::APP_BANNER:
case ContentSettingsType::SITE_ENGAGEMENT:
case ContentSettingsType::USB_CHOOSER_DATA:
case ContentSettingsType::AUTOPLAY:
case ContentSettingsType::IMPORTANT_SITE_INFO:
case ContentSettingsType::PERMISSION_AUTOBLOCKER_DATA:
case ContentSettingsType::ADS:
case ContentSettingsType::ADS_DATA:
case ContentSettingsType::PASSWORD_PROTECTION:
case ContentSettingsType::MEDIA_ENGAGEMENT:
case ContentSettingsType::SOUND:
case ContentSettingsType::CLIENT_HINTS:
case ContentSettingsType::INTENT_PICKER_DISPLAY:
case ContentSettingsType::SERIAL_CHOOSER_DATA:
case ContentSettingsType::HID_CHOOSER_DATA:
case ContentSettingsType::LEGACY_COOKIE_ACCESS:
case ContentSettingsType::BLUETOOTH_CHOOSER_DATA:
case ContentSettingsType::SAFE_BROWSING_URL_CHECK_DATA:
case ContentSettingsType::FILE_SYSTEM_READ_GUARD:
case ContentSettingsType::PERMISSION_AUTOREVOCATION_DATA:
case ContentSettingsType::FILE_SYSTEM_LAST_PICKED_DIRECTORY:
case ContentSettingsType::FILE_SYSTEM_ACCESS_CHOOSER_DATA:
case ContentSettingsType::FEDERATED_IDENTITY_SHARING:
case ContentSettingsType::JAVASCRIPT_JIT:
case ContentSettingsType::HTTP_ALLOWED:
case ContentSettingsType::FORMFILL_METADATA:
case ContentSettingsType::DEPRECATED_FEDERATED_IDENTITY_ACTIVE_SESSION:
case ContentSettingsType::AUTO_DARK_WEB_CONTENT:
case ContentSettingsType::REQUEST_DESKTOP_SITE:
case ContentSettingsType::FEDERATED_IDENTITY_API:
case ContentSettingsType::NOTIFICATION_INTERACTIONS:
case ContentSettingsType::REDUCED_ACCEPT_LANGUAGE:
case ContentSettingsType::NOTIFICATION_PERMISSION_REVIEW:
case ContentSettingsType::
FEDERATED_IDENTITY_IDENTITY_PROVIDER_SIGNIN_STATUS:
case ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS:
case ContentSettingsType::FEDERATED_IDENTITY_AUTO_REAUTHN_PERMISSION:
case ContentSettingsType::
FEDERATED_IDENTITY_IDENTITY_PROVIDER_REGISTRATION:
case ContentSettingsType::ANTI_ABUSE:
case ContentSettingsType::THIRD_PARTY_STORAGE_PARTITIONING:
case ContentSettingsType::HTTPS_ENFORCED:
case ContentSettingsType::ALL_SCREEN_CAPTURE:
case ContentSettingsType::COOKIE_CONTROLS_METADATA:
case ContentSettingsType::TPCD_HEURISTICS_GRANTS:
case ContentSettingsType::TPCD_METADATA_GRANTS:
case ContentSettingsType::TPCD_TRIAL:
case ContentSettingsType::AUTO_PICTURE_IN_PICTURE:
case ContentSettingsType::FILE_SYSTEM_ACCESS_EXTENDED_PERMISSION:
case ContentSettingsType::FILE_SYSTEM_ACCESS_RESTORE_PERMISSION:
case ContentSettingsType::SUB_APP_INSTALLATION_PROMPTS:
case ContentSettingsType::DIRECT_SOCKETS:
case ContentSettingsType::REVOKED_ABUSIVE_NOTIFICATION_PERMISSIONS:
case ContentSettingsType::TRACKING_PROTECTION:
case ContentSettingsType::DISPLAY_MEDIA_SYSTEM_AUDIO:
case ContentSettingsType::JAVASCRIPT_OPTIMIZER:
case ContentSettingsType::STORAGE_ACCESS_HEADER_ORIGIN_TRIAL:
case ContentSettingsType::DIRECT_SOCKETS_PRIVATE_NETWORK_ACCESS:
case ContentSettingsType::LEGACY_COOKIE_SCOPE:
case ContentSettingsType::
ARE_SUSPICIOUS_NOTIFICATIONS_ALLOWLISTED_BY_USER:
case ContentSettingsType::CONTROLLED_FRAME:
case ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS:
case ContentSettingsType::LOCAL_NETWORK_ACCESS:
case ContentSettingsType::
ON_DEVICE_SPEECH_RECOGNITION_LANGUAGES_DOWNLOADED:
case ContentSettingsType::INITIALIZED_TRANSLATIONS:
case ContentSettingsType::SUSPICIOUS_NOTIFICATION_IDS:
case ContentSettingsType::DEVICE_ATTRIBUTES:
case ContentSettingsType::PERMISSION_ACTIONS_HISTORY:
case ContentSettingsType::SUSPICIOUS_NOTIFICATION_SHOW_ORIGINAL:
break;
default:
content_settings_types.push_back(static_cast<ContentSettingsType>(i));
}
}
EXPECT_TRUE(content_settings_types.empty())
<< "found unknown ContentSettingsType: "
<< testing::PrintToString(content_settings_types);
std::vector<blink::PermissionType> permission_types;
// PermissionType is a hand-written enum where ::NUM, the max value, is
// invalid.
for (int i = static_cast<int>(blink::PermissionType::MIN_VALUE);
i != static_cast<int>(blink::PermissionType::NUM); ++i) {
// PermissionType entries are marked deprecated by commenting them out.
// Skip these now-invalid values here.
if (i == 2 || i == 11 || i == 13 || i == 14 || i == 15 || i == 32) {
continue;
}
switch (static_cast<blink::PermissionType>(i)) {
case blink::PermissionType::MIDI_SYSEX:
case blink::PermissionType::NOTIFICATIONS:
case blink::PermissionType::GEOLOCATION:
case blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
case blink::PermissionType::MIDI:
case blink::PermissionType::DURABLE_STORAGE:
case blink::PermissionType::AUDIO_CAPTURE:
case blink::PermissionType::VIDEO_CAPTURE:
case blink::PermissionType::BACKGROUND_SYNC:
case blink::PermissionType::SENSORS:
case blink::PermissionType::PAYMENT_HANDLER:
case blink::PermissionType::BACKGROUND_FETCH:
case blink::PermissionType::IDLE_DETECTION:
case blink::PermissionType::PERIODIC_BACKGROUND_SYNC:
case blink::PermissionType::WAKE_LOCK_SCREEN:
case blink::PermissionType::WAKE_LOCK_SYSTEM:
case blink::PermissionType::NFC:
case blink::PermissionType::CLIPBOARD_READ_WRITE:
case blink::PermissionType::CLIPBOARD_SANITIZED_WRITE:
case blink::PermissionType::VR:
case blink::PermissionType::AR:
case blink::PermissionType::STORAGE_ACCESS_GRANT:
case blink::PermissionType::CAMERA_PAN_TILT_ZOOM:
case blink::PermissionType::WINDOW_MANAGEMENT:
case blink::PermissionType::LOCAL_FONTS:
case blink::PermissionType::DISPLAY_CAPTURE:
case blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS:
case blink::PermissionType::CAPTURED_SURFACE_CONTROL:
case blink::PermissionType::SMART_CARD:
case blink::PermissionType::WEB_PRINTING:
case blink::PermissionType::SPEAKER_SELECTION:
case blink::PermissionType::KEYBOARD_LOCK:
case blink::PermissionType::POINTER_LOCK:
case blink::PermissionType::AUTOMATIC_FULLSCREEN:
case blink::PermissionType::HAND_TRACKING:
case blink::PermissionType::WEB_APP_INSTALLATION:
case blink::PermissionType::LOCAL_NETWORK_ACCESS:
break;
default:
permission_types.push_back(static_cast<blink::PermissionType>(i));
}
}
EXPECT_TRUE(permission_types.empty())
<< "found unknown PermissionType: "
<< testing::PrintToString(permission_types);
}
} // namespace controlled_frame