Commit 087e3211 authored by François Beaufort's avatar François Beaufort Committed by Commit Bot

[PTZ] Add "panTiltZoom" support to permissions API

This CL adds a new "panTiltZoom" PermissionDescriptor key to the
Permissions API to be used as an extension to camera permission.

The normal camera permission can still be queried using {name: "camera"}
(panTiltZoom is false by default) while the pan/tilt/zoom camera
permission can be requested using {name: "camera", panTiltZoom: true}.

    navigator.permissions.query({"name":"camera","panTiltZoom":true})

This CL only implements the Permissions API. getUserMedia implementation
will follow when detection for PTZ connected/selected camera is added.

Spec change: https://github.com/w3c/permissions/pull/204
Manual test: https://ptz.glitch.me/

Bug: 934063
Change-Id: I0884caebfdba3df9d66599cb84f437db9af35b9c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2116070Reviewed-by: default avatarJochen Eisinger <jochen@chromium.org>
Reviewed-by: default avatarMounir Lamouri <mlamouri@chromium.org>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarAndy Paicu <andypaicu@chromium.org>
Commit-Queue: François Beaufort <beaufort.francois@gmail.com>
Cr-Commit-Position: refs/heads/master@{#759150}
parent fb8fd1c7
...@@ -339,6 +339,7 @@ int AwPermissionManager::RequestPermissions( ...@@ -339,6 +339,7 @@ int AwPermissionManager::RequestPermissions(
case PermissionType::VR: case PermissionType::VR:
case PermissionType::AR: case PermissionType::AR:
case PermissionType::STORAGE_ACCESS_GRANT: case PermissionType::STORAGE_ACCESS_GRANT:
case PermissionType::CAMERA_PAN_TILT_ZOOM:
NOTIMPLEMENTED() << "RequestPermissions is not implemented for " NOTIMPLEMENTED() << "RequestPermissions is not implemented for "
<< static_cast<int>(permissions[i]); << static_cast<int>(permissions[i]);
pending_request_raw->SetPermissionStatus(permissions[i], pending_request_raw->SetPermissionStatus(permissions[i],
...@@ -544,6 +545,7 @@ void AwPermissionManager::CancelPermissionRequest(int request_id) { ...@@ -544,6 +545,7 @@ void AwPermissionManager::CancelPermissionRequest(int request_id) {
case PermissionType::VR: case PermissionType::VR:
case PermissionType::AR: case PermissionType::AR:
case PermissionType::STORAGE_ACCESS_GRANT: case PermissionType::STORAGE_ACCESS_GRANT:
case PermissionType::CAMERA_PAN_TILT_ZOOM:
NOTIMPLEMENTED() << "CancelPermission not implemented for " NOTIMPLEMENTED() << "CancelPermission not implemented for "
<< static_cast<int>(permission); << static_cast<int>(permission);
break; break;
......
...@@ -443,7 +443,7 @@ public class WebsitePermissionsFetcherTest { ...@@ -443,7 +443,7 @@ public class WebsitePermissionsFetcherTest {
// If the ContentSettingsType.NUM_TYPES value changes *and* a new value has been exposed on // If the ContentSettingsType.NUM_TYPES value changes *and* a new value has been exposed on
// Android, then please update this code block to include a test for your new type. // Android, then please update this code block to include a test for your new type.
// Otherwise, just update count in the assert. // Otherwise, just update count in the assert.
Assert.assertEquals(61, ContentSettingsType.NUM_TYPES); Assert.assertEquals(62, ContentSettingsType.NUM_TYPES);
websitePreferenceBridge.addContentSettingException( websitePreferenceBridge.addContentSettingException(
new ContentSettingException(ContentSettingsType.COOKIES, googleOrigin, new ContentSettingException(ContentSettingsType.COOKIES, googleOrigin,
ContentSettingValues.DEFAULT, preferenceSource)); ContentSettingValues.DEFAULT, preferenceSource));
......
...@@ -742,6 +742,8 @@ jumbo_static_library("browser") { ...@@ -742,6 +742,8 @@ jumbo_static_library("browser") {
"media/router/media_router_feature.h", "media/router/media_router_feature.h",
"media/webrtc/audio_debug_recordings_handler.cc", "media/webrtc/audio_debug_recordings_handler.cc",
"media/webrtc/audio_debug_recordings_handler.h", "media/webrtc/audio_debug_recordings_handler.h",
"media/webrtc/camera_pan_tilt_zoom_permission_context.cc",
"media/webrtc/camera_pan_tilt_zoom_permission_context.h",
"media/webrtc/desktop_media_list.h", "media/webrtc/desktop_media_list.h",
"media/webrtc/desktop_media_list_base.cc", "media/webrtc/desktop_media_list_base.cc",
"media/webrtc/desktop_media_list_base.h", "media/webrtc/desktop_media_list_base.h",
......
// Copyright 2020 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 "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h"
#include "chrome/browser/content_settings/tab_specific_content_settings.h"
#include "components/permissions/permission_request_id.h"
CameraPanTiltZoomPermissionContext::CameraPanTiltZoomPermissionContext(
content::BrowserContext* browser_context)
: PermissionContextBase(browser_context,
ContentSettingsType::CAMERA_PAN_TILT_ZOOM,
blink::mojom::FeaturePolicyFeature::kNotFound) {}
CameraPanTiltZoomPermissionContext::~CameraPanTiltZoomPermissionContext() =
default;
void CameraPanTiltZoomPermissionContext::DecidePermission(
content::WebContents* web_contents,
const permissions::PermissionRequestID& id,
const GURL& requesting_origin,
const GURL& embedding_origin,
bool user_gesture,
permissions::BrowserPermissionCallback callback) {
// TODO(crbug.com/934063): Remove when user prompt is implemented.
NOTREACHED();
}
bool CameraPanTiltZoomPermissionContext::IsRestrictedToSecureOrigins() const {
return true;
}
// Copyright 2020 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.
#ifndef CHROME_BROWSER_MEDIA_WEBRTC_CAMERA_PAN_TILT_ZOOM_PERMISSION_CONTEXT_H_
#define CHROME_BROWSER_MEDIA_WEBRTC_CAMERA_PAN_TILT_ZOOM_PERMISSION_CONTEXT_H_
#include "base/macros.h"
#include "components/permissions/permission_context_base.h"
// Manage user permissions that only controls camera movement (pan/tilt/zoom).
class CameraPanTiltZoomPermissionContext
: public permissions::PermissionContextBase {
public:
explicit CameraPanTiltZoomPermissionContext(
content::BrowserContext* browser_context);
~CameraPanTiltZoomPermissionContext() override;
CameraPanTiltZoomPermissionContext(
const CameraPanTiltZoomPermissionContext&) = delete;
CameraPanTiltZoomPermissionContext& operator=(
const CameraPanTiltZoomPermissionContext&) = delete;
private:
// PermissionContextBase
void DecidePermission(
content::WebContents* web_contents,
const permissions::PermissionRequestID& id,
const GURL& requesting_origin,
const GURL& embedding_origin,
bool user_gesture,
permissions::BrowserPermissionCallback callback) override;
bool IsRestrictedToSecureOrigins() const override;
};
#endif // CHROME_BROWSER_MEDIA_WEBRTC_CAMERA_PAN_TILT_ZOOM_PERMISSION_CONTEXT_H_
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "chrome/browser/idle/idle_detection_permission_context.h" #include "chrome/browser/idle/idle_detection_permission_context.h"
#include "chrome/browser/media/midi_permission_context.h" #include "chrome/browser/media/midi_permission_context.h"
#include "chrome/browser/media/midi_sysex_permission_context.h" #include "chrome/browser/media/midi_sysex_permission_context.h"
#include "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h"
#include "chrome/browser/media/webrtc/media_stream_device_permission_context.h" #include "chrome/browser/media/webrtc/media_stream_device_permission_context.h"
#include "chrome/browser/notifications/notification_permission_context.h" #include "chrome/browser/notifications/notification_permission_context.h"
#include "chrome/browser/payments/payment_handler_permission_context.h" #include "chrome/browser/payments/payment_handler_permission_context.h"
...@@ -129,6 +130,8 @@ permissions::PermissionManager::PermissionContextMap CreatePermissionContexts( ...@@ -129,6 +130,8 @@ permissions::PermissionManager::PermissionContextMap CreatePermissionContexts(
ContentSettingsType::AR); ContentSettingsType::AR);
permission_contexts[ContentSettingsType::STORAGE_ACCESS] = permission_contexts[ContentSettingsType::STORAGE_ACCESS] =
std::make_unique<StorageAccessGrantPermissionContext>(profile); std::make_unique<StorageAccessGrantPermissionContext>(profile);
permission_contexts[ContentSettingsType::CAMERA_PAN_TILT_ZOOM] =
std::make_unique<CameraPanTiltZoomPermissionContext>(profile);
return permission_contexts; return permission_contexts;
} }
} // namespace } // namespace
......
...@@ -140,6 +140,7 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = { ...@@ -140,6 +140,7 @@ const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = {
{ContentSettingsType::SAFE_BROWSING_URL_CHECK_DATA, nullptr}, {ContentSettingsType::SAFE_BROWSING_URL_CHECK_DATA, nullptr},
{ContentSettingsType::NATIVE_FILE_SYSTEM_READ_GUARD, nullptr}, {ContentSettingsType::NATIVE_FILE_SYSTEM_READ_GUARD, nullptr},
{ContentSettingsType::STORAGE_ACCESS, nullptr}, {ContentSettingsType::STORAGE_ACCESS, nullptr},
{ContentSettingsType::CAMERA_PAN_TILT_ZOOM, nullptr},
}; };
static_assert(base::size(kContentSettingsTypeGroupNames) == static_assert(base::size(kContentSettingsTypeGroupNames) ==
// ContentSettingsType starts at -1, so add 1 here. // ContentSettingsType starts at -1, so add 1 here.
......
...@@ -595,6 +595,7 @@ void ContentSettingsRegistry::Init() { ...@@ -595,6 +595,7 @@ void ContentSettingsRegistry::Init() {
ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE, ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE,
ContentSettingsInfo::PERSISTENT, ContentSettingsInfo::PERSISTENT,
ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY); ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY);
Register(ContentSettingsType::STORAGE_ACCESS, "storage-access", Register(ContentSettingsType::STORAGE_ACCESS, "storage-access",
CONTENT_SETTING_ASK, WebsiteSettingsInfo::SYNCABLE, CONTENT_SETTING_ASK, WebsiteSettingsInfo::SYNCABLE,
WhitelistedSchemes(), ForceAllowedOrigins(), WhitelistedSchemes(), ForceAllowedOrigins(),
...@@ -605,6 +606,18 @@ void ContentSettingsRegistry::Init() { ...@@ -605,6 +606,18 @@ void ContentSettingsRegistry::Init() {
ContentSettingsInfo::INHERIT_IN_INCOGNITO, ContentSettingsInfo::INHERIT_IN_INCOGNITO,
ContentSettingsInfo::PERSISTENT, ContentSettingsInfo::PERSISTENT,
ContentSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS); ContentSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS);
Register(ContentSettingsType::CAMERA_PAN_TILT_ZOOM, "camera-pan-tilt-zoom",
CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE,
WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme),
ForceAllowedOrigins(),
ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK,
CONTENT_SETTING_ASK),
WebsiteSettingsInfo::SINGLE_ORIGIN_ONLY_SCOPE,
WebsiteSettingsRegistry::DESKTOP,
ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE,
ContentSettingsInfo::PERSISTENT,
ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY);
} }
void ContentSettingsRegistry::Register( void ContentSettingsRegistry::Register(
......
...@@ -87,6 +87,7 @@ constexpr HistogramValue kHistogramValue[] = { ...@@ -87,6 +87,7 @@ constexpr HistogramValue kHistogramValue[] = {
{ContentSettingsType::AR, 65}, {ContentSettingsType::AR, 65},
{ContentSettingsType::NATIVE_FILE_SYSTEM_READ_GUARD, 66}, {ContentSettingsType::NATIVE_FILE_SYSTEM_READ_GUARD, 66},
{ContentSettingsType::STORAGE_ACCESS, 67}, {ContentSettingsType::STORAGE_ACCESS, 67},
{ContentSettingsType::CAMERA_PAN_TILT_ZOOM, 68},
}; };
} // namespace } // namespace
......
...@@ -205,6 +205,10 @@ enum class ContentSettingsType : int32_t { ...@@ -205,6 +205,10 @@ enum class ContentSettingsType : int32_t {
// TODO(https://crbug.com/989663): Reconcile the two. // TODO(https://crbug.com/989663): Reconcile the two.
STORAGE_ACCESS, STORAGE_ACCESS,
// Content setting which stores whether to allow a site to control camera
// movements. It does not give access to camera.
CAMERA_PAN_TILT_ZOOM,
NUM_TYPES, NUM_TYPES,
}; };
......
...@@ -124,6 +124,8 @@ ContentSettingsType PermissionTypeToContentSettingSafe( ...@@ -124,6 +124,8 @@ ContentSettingsType PermissionTypeToContentSettingSafe(
return ContentSettingsType::AR; return ContentSettingsType::AR;
case PermissionType::STORAGE_ACCESS_GRANT: case PermissionType::STORAGE_ACCESS_GRANT:
return ContentSettingsType::STORAGE_ACCESS; return ContentSettingsType::STORAGE_ACCESS;
case PermissionType::CAMERA_PAN_TILT_ZOOM:
return ContentSettingsType::CAMERA_PAN_TILT_ZOOM;
case PermissionType::NUM: case PermissionType::NUM:
break; break;
} }
......
...@@ -54,6 +54,7 @@ enum class PermissionRequestType { ...@@ -54,6 +54,7 @@ enum class PermissionRequestType {
PERMISSION_VR = 21, PERMISSION_VR = 21,
PERMISSION_AR = 22, PERMISSION_AR = 22,
PERMISSION_STORAGE_ACCESS = 23, PERMISSION_STORAGE_ACCESS = 23,
PERMISSION_CAMERA_PAN_TILT_ZOOM = 24,
// NUM must be the last value in the enum. // NUM must be the last value in the enum.
NUM NUM
}; };
......
...@@ -101,6 +101,8 @@ std::string GetPermissionRequestString(PermissionRequestType type) { ...@@ -101,6 +101,8 @@ std::string GetPermissionRequestString(PermissionRequestType type) {
return "AR"; return "AR";
case PermissionRequestType::PERMISSION_STORAGE_ACCESS: case PermissionRequestType::PERMISSION_STORAGE_ACCESS:
return "StorageAccess"; return "StorageAccess";
case PermissionRequestType::PERMISSION_CAMERA_PAN_TILT_ZOOM:
return "CameraPanTiltZoom";
default: default:
NOTREACHED(); NOTREACHED();
return ""; return "";
......
...@@ -65,6 +65,8 @@ std::string PermissionUtil::GetPermissionString( ...@@ -65,6 +65,8 @@ std::string PermissionUtil::GetPermissionString(
return "AR"; return "AR";
case ContentSettingsType::STORAGE_ACCESS: case ContentSettingsType::STORAGE_ACCESS:
return "StorageAccess"; return "StorageAccess";
case ContentSettingsType::CAMERA_PAN_TILT_ZOOM:
return "CameraPanTiltZoom";
default: default:
break; break;
} }
...@@ -102,6 +104,8 @@ PermissionRequestType PermissionUtil::GetRequestType(ContentSettingsType type) { ...@@ -102,6 +104,8 @@ PermissionRequestType PermissionUtil::GetRequestType(ContentSettingsType type) {
return PermissionRequestType::PERMISSION_AR; return PermissionRequestType::PERMISSION_AR;
case ContentSettingsType::STORAGE_ACCESS: case ContentSettingsType::STORAGE_ACCESS:
return PermissionRequestType::PERMISSION_STORAGE_ACCESS; return PermissionRequestType::PERMISSION_STORAGE_ACCESS;
case ContentSettingsType::CAMERA_PAN_TILT_ZOOM:
return PermissionRequestType::PERMISSION_CAMERA_PAN_TILT_ZOOM;
default: default:
NOTREACHED(); NOTREACHED();
return PermissionRequestType::UNKNOWN; return PermissionRequestType::UNKNOWN;
...@@ -161,6 +165,8 @@ bool PermissionUtil::GetPermissionType(ContentSettingsType type, ...@@ -161,6 +165,8 @@ bool PermissionUtil::GetPermissionType(ContentSettingsType type,
*out = PermissionType::AR; *out = PermissionType::AR;
} else if (type == ContentSettingsType::STORAGE_ACCESS) { } else if (type == ContentSettingsType::STORAGE_ACCESS) {
*out = PermissionType::STORAGE_ACCESS_GRANT; *out = PermissionType::STORAGE_ACCESS_GRANT;
} else if (type == ContentSettingsType::CAMERA_PAN_TILT_ZOOM) {
*out = PermissionType::CAMERA_PAN_TILT_ZOOM;
} else { } else {
return false; return false;
} }
...@@ -192,6 +198,7 @@ bool PermissionUtil::IsPermission(ContentSettingsType type) { ...@@ -192,6 +198,7 @@ bool PermissionUtil::IsPermission(ContentSettingsType type) {
case ContentSettingsType::VR: case ContentSettingsType::VR:
case ContentSettingsType::AR: case ContentSettingsType::AR:
case ContentSettingsType::STORAGE_ACCESS: case ContentSettingsType::STORAGE_ACCESS:
case ContentSettingsType::CAMERA_PAN_TILT_ZOOM:
return true; return true;
default: default:
return false; return false;
......
...@@ -64,6 +64,7 @@ PermissionToSchedulingFeature(PermissionType permission_name) { ...@@ -64,6 +64,7 @@ PermissionToSchedulingFeature(PermissionType permission_name) {
case PermissionType::SENSORS: case PermissionType::SENSORS:
case PermissionType::AR: case PermissionType::AR:
case PermissionType::VR: case PermissionType::VR:
case PermissionType::CAMERA_PAN_TILT_ZOOM:
return base::nullopt; return base::nullopt;
} }
} }
......
...@@ -57,7 +57,12 @@ base::Optional<PermissionType> PermissionDescriptorToPermissionType( ...@@ -57,7 +57,12 @@ base::Optional<PermissionType> PermissionDescriptorToPermissionType(
case PermissionName::AUDIO_CAPTURE: case PermissionName::AUDIO_CAPTURE:
return PermissionType::AUDIO_CAPTURE; return PermissionType::AUDIO_CAPTURE;
case PermissionName::VIDEO_CAPTURE: case PermissionName::VIDEO_CAPTURE:
return PermissionType::VIDEO_CAPTURE; if (descriptor->extension && descriptor->extension->is_camera_device() &&
descriptor->extension->get_camera_device()->panTiltZoom) {
return PermissionType::CAMERA_PAN_TILT_ZOOM;
} else {
return PermissionType::VIDEO_CAPTURE;
}
case PermissionName::BACKGROUND_SYNC: case PermissionName::BACKGROUND_SYNC:
return PermissionType::BACKGROUND_SYNC; return PermissionType::BACKGROUND_SYNC;
case PermissionName::SENSORS: case PermissionName::SENSORS:
......
...@@ -47,6 +47,7 @@ enum class PermissionType { ...@@ -47,6 +47,7 @@ enum class PermissionType {
VR = 25, VR = 25,
AR = 26, AR = 26,
STORAGE_ACCESS_GRANT = 27, STORAGE_ACCESS_GRANT = 27,
CAMERA_PAN_TILT_ZOOM = 28,
// Always keep this at the end. // Always keep this at the end.
NUM, NUM,
......
...@@ -52,6 +52,7 @@ bool IsWhitelistedPermissionType(PermissionType permission) { ...@@ -52,6 +52,7 @@ bool IsWhitelistedPermissionType(PermissionType permission) {
case PermissionType::NFC: case PermissionType::NFC:
case PermissionType::VR: case PermissionType::VR:
case PermissionType::AR: case PermissionType::AR:
case PermissionType::CAMERA_PAN_TILT_ZOOM:
return false; return false;
} }
......
...@@ -38,10 +38,15 @@ struct ClipboardPermissionDescriptor { ...@@ -38,10 +38,15 @@ struct ClipboardPermissionDescriptor {
bool allowWithoutSanitization; bool allowWithoutSanitization;
}; };
struct CameraDevicePermissionDescriptor {
bool panTiltZoom;
};
// Union of possible extensions to the base PermissionDescriptor type. // Union of possible extensions to the base PermissionDescriptor type.
union PermissionDescriptorExtension { union PermissionDescriptorExtension {
MidiPermissionDescriptor midi; MidiPermissionDescriptor midi;
ClipboardPermissionDescriptor clipboard; ClipboardPermissionDescriptor clipboard;
CameraDevicePermissionDescriptor camera_device;
}; };
// This struct roughly corresponds to the PermissionDescriptor dictionary as // This struct roughly corresponds to the PermissionDescriptor dictionary as
......
...@@ -520,6 +520,7 @@ static_idl_files_in_modules = get_path_info( ...@@ -520,6 +520,7 @@ static_idl_files_in_modules = get_path_info(
"//third_party/blink/renderer/modules/permissions/permission_descriptor.idl", "//third_party/blink/renderer/modules/permissions/permission_descriptor.idl",
"//third_party/blink/renderer/modules/permissions/permission_status.idl", "//third_party/blink/renderer/modules/permissions/permission_status.idl",
"//third_party/blink/renderer/modules/permissions/permissions.idl", "//third_party/blink/renderer/modules/permissions/permissions.idl",
"//third_party/blink/renderer/modules/permissions/camera_device_permission_descriptor.idl",
"//third_party/blink/renderer/modules/permissions/push_permission_descriptor.idl", "//third_party/blink/renderer/modules/permissions/push_permission_descriptor.idl",
"//third_party/blink/renderer/modules/permissions/testing/internals_permission.idl", "//third_party/blink/renderer/modules/permissions/testing/internals_permission.idl",
"//third_party/blink/renderer/modules/permissions/worker_navigator_permissions.idl", "//third_party/blink/renderer/modules/permissions/worker_navigator_permissions.idl",
......
// Copyright 2020 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.
// TODO: Inherit from DevicePermissionDescriptor.
dictionary CameraDevicePermissionDescriptor : PermissionDescriptor {
// https://w3c.github.io/permissions/#dom-cameradevicepermissiondescriptor-pantiltzoom
boolean panTiltZoom = false;
};
\ No newline at end of file
...@@ -12,6 +12,7 @@ modules_dictionary_idl_files = [ ...@@ -12,6 +12,7 @@ modules_dictionary_idl_files = [
"midi_permission_descriptor.idl", "midi_permission_descriptor.idl",
"permission_descriptor.idl", "permission_descriptor.idl",
"push_permission_descriptor.idl", "push_permission_descriptor.idl",
"camera_device_permission_descriptor.idl",
] ]
modules_dependency_idl_files = [ modules_dependency_idl_files = [
......
...@@ -6,10 +6,12 @@ ...@@ -6,10 +6,12 @@
#include <utility> #include <utility>
#include "build/build_config.h"
#include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
#include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h" #include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h"
#include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_camera_device_permission_descriptor.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_clipboard_permission_descriptor.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_clipboard_permission_descriptor.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_midi_permission_descriptor.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_midi_permission_descriptor.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_permission_descriptor.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_permission_descriptor.h"
...@@ -79,6 +81,17 @@ PermissionDescriptorPtr CreateClipboardPermissionDescriptor( ...@@ -79,6 +81,17 @@ PermissionDescriptorPtr CreateClipboardPermissionDescriptor(
return descriptor; return descriptor;
} }
PermissionDescriptorPtr CreateVideoCapturePermissionDescriptor(
bool pan_tilt_zoom) {
auto descriptor =
CreatePermissionDescriptor(mojom::blink::PermissionName::VIDEO_CAPTURE);
auto camera_device_extension =
mojom::blink::CameraDevicePermissionDescriptor::New(pan_tilt_zoom);
descriptor->extension = mojom::blink::PermissionDescriptorExtension::New();
descriptor->extension->set_camera_device(std::move(camera_device_extension));
return descriptor;
}
PermissionDescriptorPtr ParsePermissionDescriptor( PermissionDescriptorPtr ParsePermissionDescriptor(
ScriptState* script_state, ScriptState* script_state,
const ScriptValue& raw_descriptor, const ScriptValue& raw_descriptor,
...@@ -94,8 +107,22 @@ PermissionDescriptorPtr ParsePermissionDescriptor( ...@@ -94,8 +107,22 @@ PermissionDescriptorPtr ParsePermissionDescriptor(
const String& name = permission->name(); const String& name = permission->name();
if (name == "geolocation") if (name == "geolocation")
return CreatePermissionDescriptor(PermissionName::GEOLOCATION); return CreatePermissionDescriptor(PermissionName::GEOLOCATION);
if (name == "camera") if (name == "camera") {
return CreatePermissionDescriptor(PermissionName::VIDEO_CAPTURE); #if !defined(OS_ANDROID)
CameraDevicePermissionDescriptor* camera_device_permission =
NativeValueTraits<CameraDevicePermissionDescriptor>::NativeValue(
script_state->GetIsolate(), raw_descriptor.V8Value(),
exception_state);
if (exception_state.HadException())
return nullptr;
if (RuntimeEnabledFeatures::MediaCapturePanTiltEnabled()) {
return CreateVideoCapturePermissionDescriptor(
camera_device_permission->panTiltZoom());
}
#endif
return CreateVideoCapturePermissionDescriptor(false /* pan_tilt_zoom */);
}
if (name == "microphone") if (name == "microphone")
return CreatePermissionDescriptor(PermissionName::AUDIO_CAPTURE); return CreatePermissionDescriptor(PermissionName::AUDIO_CAPTURE);
if (name == "notifications") if (name == "notifications")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment