910e62b5创建于 1月15日历史提交
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/public/browser/permission_descriptor_util.h"

namespace {
static blink::mojom::PermissionDescriptorPtr CreatePermissionDescriptor(
    blink::mojom::PermissionName name) {
  auto descriptor = blink::mojom::PermissionDescriptor::New();
  descriptor->name = name;
  return descriptor;
}

static blink::mojom::PermissionDescriptorPtr CreateMidiPermissionDescriptor(
    bool sysex) {
  auto descriptor =
      CreatePermissionDescriptor(blink::mojom::PermissionName::MIDI);
  auto midi_extension = blink::mojom::MidiPermissionDescriptor::New();
  midi_extension->sysex = sysex;
  descriptor->extension = blink::mojom::PermissionDescriptorExtension::NewMidi(
      std::move(midi_extension));
  return descriptor;
}

static blink::mojom::PermissionDescriptorPtr
CreateClipboardPermissionDescriptor(blink::mojom::PermissionName name,
                                    bool has_user_gesture,
                                    bool will_be_sanitized) {
  auto descriptor = CreatePermissionDescriptor(name);
  auto clipboard_extension = blink::mojom::ClipboardPermissionDescriptor::New(
      has_user_gesture, will_be_sanitized);
  descriptor->extension =
      blink::mojom::PermissionDescriptorExtension::NewClipboard(
          std::move(clipboard_extension));
  return descriptor;
}

static blink::mojom::PermissionDescriptorPtr
CreateVideoCapturePermissionDescriptor(bool pan_tilt_zoom) {
  auto descriptor =
      CreatePermissionDescriptor(blink::mojom::PermissionName::VIDEO_CAPTURE);
  auto camera_device_extension =
      blink::mojom::CameraDevicePermissionDescriptor::New(pan_tilt_zoom);
  descriptor->extension =
      blink::mojom::PermissionDescriptorExtension::NewCameraDevice(
          std::move(camera_device_extension));
  return descriptor;
}

static blink::mojom::PermissionDescriptorPtr
CreateFullscreenPermissionDescriptor(bool allow_without_user_gesture) {
  auto descriptor =
      CreatePermissionDescriptor(blink::mojom::PermissionName::FULLSCREEN);
  auto fullscreen_extension = blink::mojom::FullscreenPermissionDescriptor::New(
      allow_without_user_gesture);
  descriptor->extension =
      blink::mojom::PermissionDescriptorExtension::NewFullscreen(
          std::move(fullscreen_extension));
  return descriptor;
}
}  // namespace

namespace content {

// static
blink::mojom::PermissionDescriptorPtr
content::PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionType(
    blink::PermissionType permission_type) {
  switch (permission_type) {
    case blink::PermissionType::MIDI_SYSEX:
      return CreateMidiPermissionDescriptor(/*sysex=*/true);
    case blink::PermissionType::NOTIFICATIONS:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::NOTIFICATIONS);
    case blink::PermissionType::GEOLOCATION:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::GEOLOCATION);
    case blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::PROTECTED_MEDIA_IDENTIFIER);
    case blink::PermissionType::MIDI:
      return CreateMidiPermissionDescriptor(false);
    case blink::PermissionType::DURABLE_STORAGE:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::DURABLE_STORAGE);
    case blink::PermissionType::AUDIO_CAPTURE:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::AUDIO_CAPTURE);
    case blink::PermissionType::VIDEO_CAPTURE:
      return CreateVideoCapturePermissionDescriptor(/*pan_tilt_zoom=*/false);
    case blink::PermissionType::BACKGROUND_SYNC:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::BACKGROUND_SYNC);
    case blink::PermissionType::SENSORS:
      return CreatePermissionDescriptor(blink::mojom::PermissionName::SENSORS);
    case blink::PermissionType::PAYMENT_HANDLER:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::PAYMENT_HANDLER);
    case blink::PermissionType::BACKGROUND_FETCH:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::BACKGROUND_FETCH);
    case blink::PermissionType::IDLE_DETECTION:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::IDLE_DETECTION);
    case blink::PermissionType::PERIODIC_BACKGROUND_SYNC:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::PERIODIC_BACKGROUND_SYNC);
    case blink::PermissionType::WAKE_LOCK_SCREEN:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::SCREEN_WAKE_LOCK);
    case blink::PermissionType::WAKE_LOCK_SYSTEM:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::SYSTEM_WAKE_LOCK);
    case blink::PermissionType::NFC:
      return CreatePermissionDescriptor(blink::mojom::PermissionName::NFC);
    case blink::PermissionType::CLIPBOARD_READ_WRITE:
      return CreateClipboardPermissionDescriptor(
          blink::mojom::PermissionName::CLIPBOARD_WRITE, false, false);
    case blink::PermissionType::CLIPBOARD_SANITIZED_WRITE:
      return CreateClipboardPermissionDescriptor(
          blink::mojom::PermissionName::CLIPBOARD_WRITE, true, true);
    case blink::PermissionType::VR:
      return CreatePermissionDescriptor(blink::mojom::PermissionName::VR);
    case blink::PermissionType::AR:
      return CreatePermissionDescriptor(blink::mojom::PermissionName::AR);
    case blink::PermissionType::STORAGE_ACCESS_GRANT:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::STORAGE_ACCESS);
    case blink::PermissionType::CAMERA_PAN_TILT_ZOOM:
      return CreateVideoCapturePermissionDescriptor(true);
    case blink::PermissionType::WINDOW_MANAGEMENT:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::WINDOW_MANAGEMENT);
    case blink::PermissionType::LOCAL_FONTS:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::LOCAL_FONTS);
    case blink::PermissionType::DISPLAY_CAPTURE:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::DISPLAY_CAPTURE);
    case blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::TOP_LEVEL_STORAGE_ACCESS);
    case blink::PermissionType::CAPTURED_SURFACE_CONTROL:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::CAPTURED_SURFACE_CONTROL);
    case blink::PermissionType::SMART_CARD:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::SMART_CARD);
    case blink::PermissionType::WEB_PRINTING:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::WEB_PRINTING);
    case blink::PermissionType::SPEAKER_SELECTION:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::SPEAKER_SELECTION);
    case blink::PermissionType::KEYBOARD_LOCK:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::KEYBOARD_LOCK);
    case blink::PermissionType::POINTER_LOCK:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::POINTER_LOCK);
    case blink::PermissionType::AUTOMATIC_FULLSCREEN:
      return CreateFullscreenPermissionDescriptor(
          /*allow_without_user_gesture=*/true);
    case blink::PermissionType::HAND_TRACKING:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::HAND_TRACKING);
    case blink::PermissionType::WEB_APP_INSTALLATION:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::WEB_APP_INSTALLATION);
    case blink::PermissionType::LOCAL_NETWORK_ACCESS:
      return CreatePermissionDescriptor(
          blink::mojom::PermissionName::LOCAL_NETWORK_ACCESS);
    case blink::PermissionType::NUM:
      NOTREACHED();
  }
  NOTREACHED();
}

// static
std::vector<blink::mojom::PermissionDescriptorPtr>
PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionTypes(
    const std::vector<blink::PermissionType>& permission_types) {
  std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
  descriptors.reserve(permission_types.size());
  for (const auto& permission_type : permission_types) {
    descriptors.emplace_back(
        CreatePermissionDescriptorForPermissionType(permission_type));
  }
  return descriptors;
}

}  // namespace content