diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc index c64bf97fc848b..5b42521ccc943 100644 --- a/chrome/common/extensions/permissions/permission_set_unittest.cc +++ b/chrome/common/extensions/permissions/permission_set_unittest.cc @@ -808,6 +808,7 @@ TEST(PermissionsTest, PermissionMessages) { skip.insert(APIPermission::kBrailleDisplayPrivate); skip.insert(APIPermission::kCast); skip.insert(APIPermission::kCastStreaming); + skip.insert(APIPermission::kCecPrivate); skip.insert(APIPermission::kChromeosInfoPrivate); skip.insert(APIPermission::kCloudPrintPrivate); skip.insert(APIPermission::kCommandLinePrivate); diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn index b544afbcac436..81d399a842e0d 100644 --- a/chromeos/BUILD.gn +++ b/chromeos/BUILD.gn @@ -153,6 +153,8 @@ component("chromeos") { "dbus/biod/fake_biod_client.h", "dbus/blocking_method_caller.cc", "dbus/blocking_method_caller.h", + "dbus/cec_service_client.cc", + "dbus/cec_service_client.h", "dbus/concierge_client.cc", "dbus/concierge_client.h", "dbus/cras_audio_client.cc", @@ -182,6 +184,8 @@ component("chromeos") { "dbus/fake_arc_oemcrypto_client.h", "dbus/fake_auth_policy_client.cc", "dbus/fake_auth_policy_client.h", + "dbus/fake_cec_service_client.cc", + "dbus/fake_cec_service_client.h", "dbus/fake_concierge_client.cc", "dbus/fake_concierge_client.h", "dbus/fake_cras_audio_client.cc", diff --git a/chromeos/dbus/cec_service_client.cc b/chromeos/dbus/cec_service_client.cc new file mode 100644 index 0000000000000..4753975b954e6 --- /dev/null +++ b/chromeos/dbus/cec_service_client.cc @@ -0,0 +1,78 @@ +// Copyright 2018 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 "chromeos/dbus/cec_service_client.h" + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/macros.h" +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" +#include "chromeos/dbus/fake_cec_service_client.h" +#include "dbus/bus.h" +#include "dbus/message.h" +#include "dbus/object_proxy.h" + +#include "third_party/cros_system_api/dbus/service_constants.h" + +namespace chromeos { + +namespace { + +// Real implementation of CecServiceClient. +class CecServiceClientImpl : public CecServiceClient { + public: + CecServiceClientImpl() = default; + + ~CecServiceClientImpl() override = default; + + void SendStandBy() override { + dbus::MethodCall method_call(cecservice::kCecServiceInterface, + cecservice::kSendStandByToAllDevicesMethod); + cec_service_proxy_->CallMethod(&method_call, + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::DoNothing()); + } + + void SendWakeUp() override { + dbus::MethodCall method_call(cecservice::kCecServiceInterface, + cecservice::kSendWakeUpToAllDevicesMethod); + cec_service_proxy_->CallMethod(&method_call, + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::DoNothing()); + } + + protected: + void Init(dbus::Bus* bus) override { + cec_service_proxy_ = + bus->GetObjectProxy(cecservice::kCecServiceName, + dbus::ObjectPath(cecservice::kCecServicePath)); + } + + private: + scoped_refptr<dbus::ObjectProxy> cec_service_proxy_; + + DISALLOW_COPY_AND_ASSIGN(CecServiceClientImpl); +}; + +} // namespace + +//////////////////////////////////////////////////////////////////////////////// +// CecServiceClient + +CecServiceClient::CecServiceClient() = default; + +CecServiceClient::~CecServiceClient() = default; + +// static +std::unique_ptr<CecServiceClient> CecServiceClient::Create( + DBusClientImplementationType type) { + if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) + return std::make_unique<CecServiceClientImpl>(); + + DCHECK_EQ(FAKE_DBUS_CLIENT_IMPLEMENTATION, type); + return std::make_unique<FakeCecServiceClient>(); +} + +} // namespace chromeos diff --git a/chromeos/dbus/cec_service_client.h b/chromeos/dbus/cec_service_client.h new file mode 100644 index 0000000000000..800d0364aff51 --- /dev/null +++ b/chromeos/dbus/cec_service_client.h @@ -0,0 +1,51 @@ +// Copyright 2018 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 CHROMEOS_DBUS_CEC_SERVICE_CLIENT_H_ +#define CHROMEOS_DBUS_CEC_SERVICE_CLIENT_H_ + +#include <memory> + +#include "base/macros.h" +#include "chromeos/dbus/dbus_client.h" +#include "chromeos/dbus/dbus_client_implementation_type.h" +#include "chromeos/dbus/dbus_method_call_status.h" + +namespace chromeos { + +// CecServiceClient is used to communicate with org.chromium.CecService. +// +// CecService offers a small subset of HDMI CEC capabilities focused on power +// management of connected displays. +// +// All methods should be called from the origin thread (UI thread) +// which initializes the DBusThreadManager instance. +class CHROMEOS_EXPORT CecServiceClient : public DBusClient { + public: + ~CecServiceClient() override; + + // For normal usage, access the singleton via DBusThreadManager::Get(). + static std::unique_ptr<CecServiceClient> Create( + DBusClientImplementationType type); + + // Puts all connected HDMI CEC capable displays into stand-by mode. The effect + // of calling this method is on a best effort basis, no guarantees of displays + // going into stand-by is made. + virtual void SendStandBy() = 0; + + // Wakes up all connected HDMI CEC capable displays from stand-by mode. The + // effect of calling this method is on a best effort basis, no guarantees of + // displays going into stand-by is made. + virtual void SendWakeUp() = 0; + + protected: + CecServiceClient(); + + private: + DISALLOW_COPY_AND_ASSIGN(CecServiceClient); +}; + +} // namespace chromeos + +#endif // CHROMEOS_DBUS_CEC_SERVICE_CLIENT_H_ diff --git a/chromeos/dbus/dbus_clients_common.cc b/chromeos/dbus/dbus_clients_common.cc index 0e233d659a381..7b7cba287a2d1 100644 --- a/chromeos/dbus/dbus_clients_common.cc +++ b/chromeos/dbus/dbus_clients_common.cc @@ -7,6 +7,7 @@ #include "base/command_line.h" #include "chromeos/chromeos_switches.h" #include "chromeos/dbus/biod/biod_client.h" +#include "chromeos/dbus/cec_service_client.h" #include "chromeos/dbus/cras_audio_client.h" #include "chromeos/dbus/cryptohome_client.h" #include "chromeos/dbus/dbus_client_implementation_type.h" @@ -53,6 +54,8 @@ DBusClientsCommon::DBusClientsCommon(bool use_real_clients) { biod_client_.reset(BiodClient::Create(client_impl_type)); + cec_service_client_ = CecServiceClient::Create(client_impl_type); + if (use_real_clients) cras_audio_client_.reset(CrasAudioClient::Create()); else @@ -135,6 +138,7 @@ void DBusClientsCommon::Initialize(dbus::Bus* system_bus) { DCHECK(DBusThreadManager::IsInitialized()); biod_client_->Init(system_bus); + cec_service_client_->Init(system_bus); cras_audio_client_->Init(system_bus); cryptohome_client_->Init(system_bus); gsm_sms_client_->Init(system_bus); diff --git a/chromeos/dbus/dbus_clients_common.h b/chromeos/dbus/dbus_clients_common.h index ef8267570bc07..239ab89b3f274 100644 --- a/chromeos/dbus/dbus_clients_common.h +++ b/chromeos/dbus/dbus_clients_common.h @@ -17,6 +17,7 @@ class Bus; namespace chromeos { class BiodClient; +class CecServiceClient; class CrasAudioClient; class CryptohomeClient; class GsmSMSClient; @@ -52,6 +53,7 @@ class CHROMEOS_EXPORT DBusClientsCommon { friend class DBusThreadManagerSetter; std::unique_ptr<BiodClient> biod_client_; + std::unique_ptr<CecServiceClient> cec_service_client_; std::unique_ptr<CrasAudioClient> cras_audio_client_; std::unique_ptr<CryptohomeClient> cryptohome_client_; std::unique_ptr<GsmSMSClient> gsm_sms_client_; diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc index 3fddfe56b8f08..e395a55db77e7 100644 --- a/chromeos/dbus/dbus_thread_manager.cc +++ b/chromeos/dbus/dbus_thread_manager.cc @@ -17,6 +17,7 @@ #include "chromeos/dbus/arc_oemcrypto_client.h" #include "chromeos/dbus/auth_policy_client.h" #include "chromeos/dbus/biod/biod_client.h" +#include "chromeos/dbus/cec_service_client.h" #include "chromeos/dbus/concierge_client.h" #include "chromeos/dbus/cras_audio_client.h" #include "chromeos/dbus/cros_disks_client.h" @@ -138,6 +139,10 @@ BiodClient* DBusThreadManager::GetBiodClient() { return clients_common_->biod_client_.get(); } +CecServiceClient* DBusThreadManager::GetCecServiceClient() { + return clients_common_->cec_service_client_.get(); +} + ConciergeClient* DBusThreadManager::GetConciergeClient() { return clients_browser_ ? clients_browser_->concierge_client_.get() : nullptr; } diff --git a/chromeos/dbus/dbus_thread_manager.h b/chromeos/dbus/dbus_thread_manager.h index f1978635b705b..54e092bd79739 100644 --- a/chromeos/dbus/dbus_thread_manager.h +++ b/chromeos/dbus/dbus_thread_manager.h @@ -29,6 +29,7 @@ class ArcObbMounterClient; class ArcOemCryptoClient; class AuthPolicyClient; class BiodClient; +class CecServiceClient; class ConciergeClient; class CrasAudioClient; class CrosDisksClient; @@ -134,6 +135,7 @@ class CHROMEOS_EXPORT DBusThreadManager { ArcOemCryptoClient* GetArcOemCryptoClient(); AuthPolicyClient* GetAuthPolicyClient(); BiodClient* GetBiodClient(); + CecServiceClient* GetCecServiceClient(); ConciergeClient* GetConciergeClient(); CrasAudioClient* GetCrasAudioClient(); CrosDisksClient* GetCrosDisksClient(); diff --git a/chromeos/dbus/fake_cec_service_client.cc b/chromeos/dbus/fake_cec_service_client.cc new file mode 100644 index 0000000000000..9a81b613bcf54 --- /dev/null +++ b/chromeos/dbus/fake_cec_service_client.cc @@ -0,0 +1,38 @@ +// Copyright 2018 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 "chromeos/dbus/fake_cec_service_client.h" + +#include "chromeos/dbus/dbus_method_call_status.h" + +namespace chromeos { + +FakeCecServiceClient::FakeCecServiceClient() = default; +FakeCecServiceClient::~FakeCecServiceClient() = default; + +void FakeCecServiceClient::SendStandBy() { + stand_by_call_count_++; + current_state_ = kStandBy; +} + +void FakeCecServiceClient::SendWakeUp() { + wake_up_call_count_++; + current_state_ = kAwake; +} + +int FakeCecServiceClient::stand_by_call_count() { + return stand_by_call_count_; +} + +int FakeCecServiceClient::wake_up_call_count() { + return wake_up_call_count_; +} + +FakeCecServiceClient::CurrentState FakeCecServiceClient::current_state() { + return current_state_; +} + +void FakeCecServiceClient::Init(dbus::Bus* bus) {} + +} // namespace chromeos diff --git a/chromeos/dbus/fake_cec_service_client.h b/chromeos/dbus/fake_cec_service_client.h new file mode 100644 index 0000000000000..3e1bd3ef35c3a --- /dev/null +++ b/chromeos/dbus/fake_cec_service_client.h @@ -0,0 +1,42 @@ +// Copyright 2018 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 CHROMEOS_DBUS_FAKE_CEC_SERVICE_CLIENT_H_ +#define CHROMEOS_DBUS_FAKE_CEC_SERVICE_CLIENT_H_ + +#include "base/macros.h" +#include "chromeos/dbus/cec_service_client.h" + +namespace chromeos { + +class CHROMEOS_EXPORT FakeCecServiceClient : public CecServiceClient { + public: + FakeCecServiceClient(); + ~FakeCecServiceClient() override; + + enum CurrentState { kUndefined, kStandBy, kAwake }; + + // CecServiceClient + void SendStandBy() override; + void SendWakeUp() override; + + int stand_by_call_count(); + int wake_up_call_count(); + + CurrentState current_state(); + + protected: + void Init(dbus::Bus* bus) override; + + private: + int stand_by_call_count_ = 0; + int wake_up_call_count_ = 0; + CurrentState current_state_ = kUndefined; + + DISALLOW_COPY_AND_ASSIGN(FakeCecServiceClient); +}; + +} // namespace chromeos + +#endif // CHROMEOS_DBUS_FAKE_CEC_SERVICE_CLIENT_H_ diff --git a/extensions/browser/api/BUILD.gn b/extensions/browser/api/BUILD.gn index 691e452964bf3..8045a127f6522 100644 --- a/extensions/browser/api/BUILD.gn +++ b/extensions/browser/api/BUILD.gn @@ -131,6 +131,7 @@ source_set("api") { ] public_deps += [ + "//extensions/browser/api/cec_private", "//extensions/browser/api/clipboard", "//extensions/browser/api/diagnostics", "//extensions/browser/api/networking_config", diff --git a/extensions/browser/api/cec_private/BUILD.gn b/extensions/browser/api/cec_private/BUILD.gn new file mode 100644 index 0000000000000..a2e9299b77349 --- /dev/null +++ b/extensions/browser/api/cec_private/BUILD.gn @@ -0,0 +1,19 @@ +# Copyright 2018 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. + +import("//extensions/buildflags/buildflags.gni") + +assert(enable_extensions, + "Cannot depend on extensions because enable_extensions=false.") + +source_set("cec_private") { + sources = [ + "cec_private_api.cc", + "cec_private_api.h", + ] + + deps = [ + "//extensions/common/api", + ] +} diff --git a/extensions/browser/api/cec_private/cec_private_api.cc b/extensions/browser/api/cec_private/cec_private_api.cc new file mode 100644 index 0000000000000..63a8b7f0cd9cf --- /dev/null +++ b/extensions/browser/api/cec_private/cec_private_api.cc @@ -0,0 +1,54 @@ +// Copyright 2018 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 "extensions/browser/api/cec_private/cec_private_api.h" + +#include "chromeos/dbus/cec_service_client.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "extensions/common/manifest_handlers/kiosk_mode_info.h" + +namespace extensions { + +namespace { + +const char kKioskOnlyError[] = + "Only kiosk enabled extensions are allowed to use this function."; + +} // namespace + +CecPrivateFunction::CecPrivateFunction() = default; + +CecPrivateFunction::~CecPrivateFunction() = default; + +// Only allow calls from kiosk mode extensions. +bool CecPrivateFunction::PreRunValidation(std::string* error) { + if (!UIThreadExtensionFunction::PreRunValidation(error)) + return false; + + if (KioskModeInfo::IsKioskEnabled(extension())) + return true; + + *error = kKioskOnlyError; + return false; +} + +CecPrivateSendStandByFunction::CecPrivateSendStandByFunction() = default; + +CecPrivateSendStandByFunction::~CecPrivateSendStandByFunction() = default; + +ExtensionFunction::ResponseAction CecPrivateSendStandByFunction::Run() { + chromeos::DBusThreadManager::Get()->GetCecServiceClient()->SendStandBy(); + return RespondNow(NoArguments()); +} + +CecPrivateSendWakeUpFunction::CecPrivateSendWakeUpFunction() = default; + +CecPrivateSendWakeUpFunction::~CecPrivateSendWakeUpFunction() = default; + +ExtensionFunction::ResponseAction CecPrivateSendWakeUpFunction::Run() { + chromeos::DBusThreadManager::Get()->GetCecServiceClient()->SendWakeUp(); + return RespondNow(NoArguments()); +} + +} // namespace extensions diff --git a/extensions/browser/api/cec_private/cec_private_api.h b/extensions/browser/api/cec_private/cec_private_api.h new file mode 100644 index 0000000000000..a9c15396c038b --- /dev/null +++ b/extensions/browser/api/cec_private/cec_private_api.h @@ -0,0 +1,53 @@ +// Copyright 2018 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 EXTENSIONS_BROWSER_API_CEC_PRIVATE_CEC_PRIVATE_API_H_ +#define EXTENSIONS_BROWSER_API_CEC_PRIVATE_CEC_PRIVATE_API_H_ + +#include "extensions/browser/extension_function.h" +#include "extensions/browser/extension_function_histogram_value.h" + +namespace extensions { + +class CecPrivateFunction : public UIThreadExtensionFunction { + public: + CecPrivateFunction(); + + protected: + ~CecPrivateFunction() override; + bool PreRunValidation(std::string* error) override; + + private: + DISALLOW_COPY_AND_ASSIGN(CecPrivateFunction); +}; + +class CecPrivateSendStandByFunction : public CecPrivateFunction { + public: + CecPrivateSendStandByFunction(); + DECLARE_EXTENSION_FUNCTION("cecPrivate.sendStandBy", CECPRIVATE_SENDSTANDBY) + + protected: + ~CecPrivateSendStandByFunction() override; + ResponseAction Run() override; + + private: + DISALLOW_COPY_AND_ASSIGN(CecPrivateSendStandByFunction); +}; + +class CecPrivateSendWakeUpFunction : public CecPrivateFunction { + public: + CecPrivateSendWakeUpFunction(); + DECLARE_EXTENSION_FUNCTION("cecPrivate.sendWakeUp", CECPRIVATE_SENDWAKEUP) + + protected: + ~CecPrivateSendWakeUpFunction() override; + ResponseAction Run() override; + + private: + DISALLOW_COPY_AND_ASSIGN(CecPrivateSendWakeUpFunction); +}; + +} // namespace extensions + +#endif // EXTENSIONS_BROWSER_API_CEC_PRIVATE_CEC_PRIVATE_API_H_ diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index a119ce9d737af..fd3ff7cda8879 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h @@ -1302,6 +1302,8 @@ enum HistogramValue { FILEMANAGERPRIVATE_ENSUREFILEDOWNLOADED, FILEMANAGERPRIVATE_OPENSETTINGSSUBPAGE, ENTERPRISEREPORTINGPRIVATE_UPLOADCHROMEDESKTOPREPORT, + CECPRIVATE_SENDSTANDBY, + CECPRIVATE_SENDWAKEUP, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json index 5c57352617aaa..a592fcf8490bf 100644 --- a/extensions/common/api/_api_features.json +++ b/extensions/common/api/_api_features.json @@ -108,6 +108,10 @@ "dependencies": ["manifest:bluetooth"], "contexts": ["blessed_extension"] }, + "cecPrivate": { + "dependencies": ["permission:cecPrivate"], + "contexts": ["blessed_extension"] + }, "clipboard": { "dependencies": ["permission:clipboard"], "contexts": ["blessed_extension"] diff --git a/extensions/common/api/_permission_features.json b/extensions/common/api/_permission_features.json index 923c3ed390aa7..72ff9bac427f6 100644 --- a/extensions/common/api/_permission_features.json +++ b/extensions/common/api/_permission_features.json @@ -158,6 +158,20 @@ "226CF815E39A363090A1E547D53063472B8279FA" // Media Router Stable ] }, + "cecPrivate": { + "channel": "stable", + "extension_types": ["extension", "platform_app"], + "whitelist": [ + "1C93BD3CF875F4A73C0B2A163BB8FBDA8B8B3D80", // http://crbug.com/824667#c15 + "A3BC37E2148AC4E99BE4B16AF9D42DD1E592BBBE", // http://crbug.com/824667#c15 + "307E96539209F95A1A8740C713E6998A73657D96", // http://crbug.com/824667#c15 + "E703483CEF33DEC18B4B6DD84B5C776FB9182BDB", // http://crbug.com/824667#c15 + "4F25792AF1AA7483936DE29C07806F203C7170A0", // http://crbug.com/824667#c15 + "BD8781D757D830FC2E85470A1B6E8A718B7EE0D9", // http://crbug.com/824667#c15 + "4AC2B6C63C6480D150DFDA13E4A5956EB1D0DDBB", // http://crbug.com/824667#c15 + "81986D4F846CEDDDB962643FA501D1780DD441BB" // http://crbug.com/824667#c15 + ] + }, "clipboard": { "channel": "dev", "extension_types": ["platform_app"], diff --git a/extensions/common/api/cec_private.idl b/extensions/common/api/cec_private.idl new file mode 100644 index 0000000000000..25a0bc8ab37f5 --- /dev/null +++ b/extensions/common/api/cec_private.idl @@ -0,0 +1,21 @@ +// Copyright 2018 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. + +// Private API for HDMI CEC functionality. +[platforms=("chromeos")] +namespace cecPrivate { + + interface Functions { + // Attempt to put all HDMI CEC compatible devices in stand-by. + // + // This is not guaranteed to have any effect on the connected displays. + // Displays that do not support HDMI CEC will not be affected. + static void sendStandBy(); + + // Attempt to announce this device as the active input source towards all + // HDMI CEC enabled displays connected, waking them from standby if + // necessary. + static void sendWakeUp(); + }; +}; diff --git a/extensions/common/api/schema.gni b/extensions/common/api/schema.gni index b427b69c2181e..455f8314f952d 100644 --- a/extensions/common/api/schema.gni +++ b/extensions/common/api/schema.gni @@ -14,6 +14,7 @@ extensions_api_schema_files_ = [ "bluetooth_private.idl", "bluetooth_socket.idl", "cast_channel.idl", + "cec_private.idl", "clipboard.idl", "declarative_net_request.idl", "display_source.idl", diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h index 88a581f0c5ea4..1a695b7e7f965 100644 --- a/extensions/common/permissions/api_permission.h +++ b/extensions/common/permissions/api_permission.h @@ -252,6 +252,7 @@ class APIPermission { kDeclarativeNetRequest, kLockWindowFullscreenPrivate, kWebrtcLoggingPrivateAudioDebug, + kCecPrivate, // Last entry: Add new entries above and ensure to update the // "ExtensionPermission3" enum in tools/metrics/histograms/histograms.xml // (by running update_extension_permission.py). diff --git a/extensions/common/permissions/extensions_api_permissions.cc b/extensions/common/permissions/extensions_api_permissions.cc index a625599db1ba0..d9521a370d7dc 100644 --- a/extensions/common/permissions/extensions_api_permissions.cc +++ b/extensions/common/permissions/extensions_api_permissions.cc @@ -43,6 +43,8 @@ ExtensionsAPIPermissions::GetAllPermissions() const { {APIPermission::kAudioCapture, "audioCapture"}, {APIPermission::kBluetoothPrivate, "bluetoothPrivate", APIPermissionInfo::kFlagCannotBeOptional}, + {APIPermission::kCecPrivate, "cecPrivate", + APIPermissionInfo::kFlagCannotBeOptional}, {APIPermission::kClipboard, "clipboard"}, {APIPermission::kClipboardRead, "clipboardRead", APIPermissionInfo::kFlagSupportsContentCapabilities}, diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 52807687a12c8..673db4e3064c2 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml @@ -15198,6 +15198,8 @@ Called by update_net_error_codes.py.--> <int value="1240" label="FILEMANAGERPRIVATE_OPENSETTINGSSUBPAGE"/> <int value="1241" label="ENTERPRISEREPORTINGPRIVATE_UPLOADCHROMEDESKTOPREPORT"/> + <int value="1242" label="CECPRIVATE_SENDSTANDBY"/> + <int value="1243" label="CECPRIVATE_SENDWAKEUP"/> </enum> <enum name="ExtensionIconState"> @@ -15481,7 +15483,7 @@ Called by update_net_error_codes.py.--> <int value="57" label="kEmbeddedExtensionOptions"/> <int value="58" label="kEnterprisePlatformKeys"/> <int value="59" label="kEnterprisePlatformKeysPrivate"/> - <int value="60" label="kExperienceSamplingPrivate"/> + <int value="60" label="kDeleted_ExperienceSamplingPrivate"/> <int value="61" label="kExperimental"/> <int value="62" label="kExtensionView"/> <int value="63" label="kExternallyConnectableAllUrls"/> @@ -15632,6 +15634,7 @@ Called by update_net_error_codes.py.--> <int value="208" label="kLockWindowFullscreenPrivate"/> <int value="209" label="kWebrtcLoggingPrivateAudioDebug"/> <int value="210" label="kEnterpriseReportingPrivate"/> + <int value="211" label="kCecPrivate"/> </enum> <enum name="ExtensionServiceVerifyAllSuccess">