15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/bluetooth/bluetooth_manifest_permission.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/stl_util.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/values.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "device/bluetooth/bluetooth_uuid.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/bluetooth/bluetooth_manifest_data.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/extensions_manifest_types.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/error_utils.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/manifest_constants.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/extensions_strings.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_message.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace bluetooth_errors { 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const char kErrorInvalidUuid[] = "Invalid UUID '*'"; 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace errors = bluetooth_errors; 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ParseUuid(BluetoothManifestPermission* permission, 3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& uuid, 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) { 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch device::BluetoothUUID bt_uuid(uuid); 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!bt_uuid.IsValid()) { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *error = ErrorUtils::FormatErrorMessageUTF16( 3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) errors::kErrorInvalidUuid, uuid); 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) permission->AddPermission(uuid); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ParseUuidArray(BluetoothManifestPermission* permission, 4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const scoped_ptr<std::vector<std::string> >& uuids, 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) { 4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for (std::vector<std::string>::const_iterator it = uuids->begin(); 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) it != uuids->end(); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++it) { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ParseUuid(permission, *it, error)) { 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)BluetoothManifestPermission::BluetoothManifestPermission() 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : socket_(false), 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) low_energy_(false) {} 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BluetoothManifestPermission::~BluetoothManifestPermission() {} 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<BluetoothManifestPermission> BluetoothManifestPermission::FromValue( 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Value& value, 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* error) { 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<core_api::extensions_manifest_types::Bluetooth> bluetooth = 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci core_api::extensions_manifest_types::Bluetooth::FromValue(value, error); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!bluetooth) 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<BluetoothManifestPermission>(); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<BluetoothManifestPermission> result( 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new BluetoothManifestPermission()); 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (bluetooth->uuids) { 7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (!ParseUuidArray(result.get(), bluetooth->uuids, error)) { 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<BluetoothManifestPermission>(); 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (bluetooth->socket) { 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result->socket_ = *(bluetooth->socket); 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (bluetooth->low_energy) { 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result->low_energy_ = *(bluetooth->low_energy); 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return result.Pass(); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BluetoothManifestPermission::CheckRequest( 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Extension* extension, 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BluetoothPermissionRequest& request) const { 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch device::BluetoothUUID param_uuid(request.uuid); 9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for (BluetoothUuidSet::const_iterator it = uuids_.begin(); 9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) it != uuids_.end(); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++it) { 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch device::BluetoothUUID uuid(*it); 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (param_uuid == uuid) 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool BluetoothManifestPermission::CheckSocketPermitted( 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension) const { 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return socket_; 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool BluetoothManifestPermission::CheckLowEnergyPermitted( 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Extension* extension) const { 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return low_energy_; 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string BluetoothManifestPermission::name() const { 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return manifest_keys::kBluetooth; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string BluetoothManifestPermission::id() const { return name(); } 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BluetoothManifestPermission::HasMessages() const { return true; } 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PermissionMessages BluetoothManifestPermission::GetMessages() const { 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(HasMessages()); 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PermissionMessages result; 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.push_back(PermissionMessage( 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PermissionMessage::kBluetooth, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH))); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (!uuids_.empty()) { 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.push_back( 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PermissionMessage(PermissionMessage::kBluetoothDevices, 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) l10n_util::GetStringUTF16( 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_DEVICES))); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return result; 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BluetoothManifestPermission::FromValue(const base::Value* value) { 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!value) 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 error; 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<BluetoothManifestPermission> manifest_permission( 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BluetoothManifestPermission::FromValue(*value, &error)); 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!manifest_permission) 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) uuids_ = manifest_permission->uuids_; 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<base::Value> BluetoothManifestPermission::ToValue() const { 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci core_api::extensions_manifest_types::Bluetooth bluetooth; 15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bluetooth.uuids.reset(new std::vector<std::string>(uuids_.begin(), 15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) uuids_.end())); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return bluetooth.ToValue().PassAs<base::Value>(); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ManifestPermission* BluetoothManifestPermission::Diff( 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ManifestPermission* rhs) const { 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BluetoothManifestPermission* other = 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<const BluetoothManifestPermission*>(rhs); 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<BluetoothManifestPermission> result( 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new BluetoothManifestPermission()); 16823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) result->uuids_ = base::STLSetDifference<BluetoothUuidSet>( 16923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) uuids_, other->uuids_); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return result.release(); 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ManifestPermission* BluetoothManifestPermission::Union( 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ManifestPermission* rhs) const { 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BluetoothManifestPermission* other = 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<const BluetoothManifestPermission*>(rhs); 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<BluetoothManifestPermission> result( 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new BluetoothManifestPermission()); 18023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) result->uuids_ = base::STLSetUnion<BluetoothUuidSet>( 18123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) uuids_, other->uuids_); 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return result.release(); 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ManifestPermission* BluetoothManifestPermission::Intersect( 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ManifestPermission* rhs) const { 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BluetoothManifestPermission* other = 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<const BluetoothManifestPermission*>(rhs); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<BluetoothManifestPermission> result( 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new BluetoothManifestPermission()); 19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) result->uuids_ = base::STLSetIntersection<BluetoothUuidSet>( 19323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) uuids_, other->uuids_); 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return result.release(); 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void BluetoothManifestPermission::AddPermission(const std::string& uuid) { 19823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) uuids_.insert(uuid); 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace extensions 202