| Index: device/bluetooth/public/interfaces/bluetooth_uuid_struct_traits.h
|
| diff --git a/device/bluetooth/public/interfaces/bluetooth_uuid_struct_traits.h b/device/bluetooth/public/interfaces/bluetooth_uuid_struct_traits.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..dc9f45f391057b91557db27cb8f49746864697bf
|
| --- /dev/null
|
| +++ b/device/bluetooth/public/interfaces/bluetooth_uuid_struct_traits.h
|
| @@ -0,0 +1,50 @@
|
| +// Copyright 2016 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 DEVICE_BLUETOOTH_PUBLIC_INTERFACES_BLUETOOTH_UUID_STRUCT_TRAITS_H_
|
| +#define DEVICE_BLUETOOTH_PUBLIC_INTERFACES_BLUETOOTH_UUID_STRUCT_TRAITS_H_
|
| +
|
| +#include "base/strings/string_piece.h"
|
| +#include "device/bluetooth/bluetooth_uuid.h"
|
| +#include "device/bluetooth/public/interfaces/bluetooth_uuid.mojom.h"
|
| +
|
| +namespace mojo {
|
| +
|
| +template <>
|
| +struct StructTraits<device::mojom::BluetoothUUID,
|
| + std::unique_ptr<device::BluetoothUUID>> {
|
| + static bool IsNull(const std::unique_ptr<device::BluetoothUUID>& uuid) {
|
| + return !uuid;
|
| + }
|
| +
|
| + static void SetToNull(std::unique_ptr<device::BluetoothUUID>* output) {
|
| + output->reset();
|
| + }
|
| +
|
| + static base::StringPiece uuid(
|
| + const std::unique_ptr<device::BluetoothUUID>& uuid) {
|
| + DCHECK(uuid);
|
| + return base::StringPiece(uuid->canonical_value().c_str(),
|
| + uuid->canonical_value().length());
|
| + }
|
| +
|
| + static bool Read(device::mojom::BluetoothUUIDDataView input,
|
| + std::unique_ptr<device::BluetoothUUID>* output) {
|
| + base::StringPiece result;
|
| + if (!input.ReadUuid(&result))
|
| + return false;
|
| + *output = base::WrapUnique(new device::BluetoothUUID(result.as_string()));
|
| +
|
| + // If the format isn't 128-bit, .value() would return a different answer
|
| + // than .canonical_value(). Then if browser-side code accidentally checks
|
| + // .value() against a 128-bit string literal, a hostile renderer could use
|
| + // the 16- or 32-bit format and evade the check.
|
| + return (*output)->IsValid() &&
|
| + (*output)->format() == device::BluetoothUUID::kFormat128Bit;
|
| + }
|
| +};
|
| +
|
| +} // namespace mojo
|
| +
|
| +#endif // DEVICE_BLUETOOTH_PUBLIC_INTERFACES_BLUETOOTH_UUID_STRUCT_TRAITS_H_
|
|
|