Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: chrome/browser/ui/bluetooth/bluetooth_permission_context.cc

Issue 1560263002: Store Bluetooth permissions in website settings (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: modified ChooserPermissionManager to take url::Origin as parameter Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/bluetooth/bluetooth_permission_context.h"
6
7 #include <utility>
8
9 #include "base/bind.h"
10 #include "base/values.h"
11 #include "device/bluetooth/bluetooth_adapter.h"
12 #include "device/bluetooth/bluetooth_adapter_factory.h"
13 #include "device/bluetooth/bluetooth_device.h"
14 #include "device/bluetooth/bluetooth_uuid.h"
15 #include "url/gurl.h"
16 #include "url/origin.h"
17
18 namespace {
19
20 const char kDeviceAddressKey[] = "device-address";
21 const char kDeviceNameKey[] = "device-name";
22 const char kDeviceUUIDsKey[] = "device-uuids";
23
24 const base::DictionaryValue* FindForDevice(
25 const std::vector<scoped_ptr<base::DictionaryValue>>& device_list,
26 const std::string& device_address) {
27 for (const scoped_ptr<base::DictionaryValue>& device_dict : device_list) {
28 std::string tmp_device_address;
29 if (device_dict->GetString(kDeviceAddressKey, &tmp_device_address) &&
30 tmp_device_address == device_address) {
31 return device_dict.get();
32 }
33 }
34 return nullptr;
35 }
36
37 } // namespace
38
39 BluetoothPermissionContext::BluetoothPermissionContext(Profile* profile)
40 : ChooserContextBase(profile, CONTENT_SETTINGS_TYPE_BLUETOOTH_CHOOSER_DATA),
41 weak_ptr_factory_(this) {
42 device::BluetoothAdapterFactory::GetAdapter(
43 base::Bind(&BluetoothPermissionContext::OnGetAdapter,
44 weak_ptr_factory_.GetWeakPtr()));
45 }
46
47 BluetoothPermissionContext::~BluetoothPermissionContext() {}
48
49 void BluetoothPermissionContext::GrantDevicePermission(
50 const url::Origin& requesting_origin,
51 const url::Origin& embedding_origin,
52 const std::string& device_address) {
53 scoped_ptr<base::DictionaryValue> device_dict(new base::DictionaryValue());
54 device_dict->SetString(kDeviceAddressKey, device_address);
55 device::BluetoothDevice* device = adapter_->GetDevice(device_address);
56 DCHECK(device);
57 device_dict->SetString(kDeviceNameKey, device->GetName());
58 scoped_ptr<base::ListValue> device_uuids_list(new base::ListValue());
Jeffrey Yasskin 2016/01/21 00:32:30 Please break up functions like this a little more
juncai 2016/01/25 18:53:32 Done.
59 device::BluetoothDevice::UUIDList uuid_list = device->GetUUIDs();
Jeffrey Yasskin 2016/01/21 00:32:30 The domain doesn't automatically get permission to
juncai 2016/01/25 18:53:32 Done.
60 for (const auto& uuid : uuid_list)
61 device_uuids_list->AppendString(uuid.value());
62 device_dict->Set(kDeviceUUIDsKey, std::move(device_uuids_list));
63
64 GrantObjectPermission(GURL(requesting_origin.Serialize()),
65 GURL(embedding_origin.Serialize()),
66 std::move(device_dict));
67 }
68
69 void BluetoothPermissionContext::RevokeDevicePermission(
70 const url::Origin& requesting_origin,
71 const url::Origin& embedding_origin,
72 const std::string& device_address) {
73 std::vector<scoped_ptr<base::DictionaryValue>> device_list =
74 GetGrantedObjects(GURL(requesting_origin.Serialize()),
75 GURL(embedding_origin.Serialize()));
76 const base::DictionaryValue* entry =
77 FindForDevice(device_list, device_address);
78 if (entry)
79 RevokeObjectPermission(GURL(requesting_origin.Serialize()),
80 GURL(embedding_origin.Serialize()), *entry);
81 }
82
83 std::vector<std::string> BluetoothPermissionContext::HasDevicePermission(
84 const url::Origin& requesting_origin,
85 const url::Origin& embedding_origin,
86 const std::string& device_address) {
87 std::vector<scoped_ptr<base::DictionaryValue>> device_list =
88 GetGrantedObjects(GURL(requesting_origin.Serialize()),
89 GURL(embedding_origin.Serialize()));
90 std::vector<std::string> uuids;
91 const base::DictionaryValue* device_dict =
92 FindForDevice(device_list, device_address);
93 if (device_dict) {
94 const base::ListValue* uuid_list = nullptr;
95 device_dict->GetList(kDeviceUUIDsKey, &uuid_list);
96 size_t length = uuid_list->GetSize();
97 for (size_t i = 0; i < length; ++i) {
98 std::string uuid;
99 uuid_list->GetString(i, &uuid);
100 uuids.push_back(uuid);
101 }
102 }
103 return uuids;
104 }
105
106 void BluetoothPermissionContext::OnGetAdapter(
107 scoped_refptr<device::BluetoothAdapter> adapter) {
108 DCHECK(!adapter_.get());
109 adapter_ = adapter;
110 DCHECK(adapter_.get());
111 }
112
113 bool BluetoothPermissionContext::IsValidObject(
114 const base::DictionaryValue& object) {
115 std::string device_address, device_name;
116 const base::ListValue* device_uuids = nullptr;
117 return object.size() == 3 && object.HasKey(kDeviceAddressKey) &&
Jeffrey Yasskin 2016/01/21 00:32:30 Could you comment that this check needs to be back
juncai 2016/01/25 18:53:32 Done.
118 object.GetString(kDeviceAddressKey, &device_address) &&
Jeffrey Yasskin 2016/01/21 00:32:30 Pass nullptr as the second argument to GetString o
juncai 2016/01/25 18:53:32 Done.
119 object.HasKey(kDeviceNameKey) &&
120 object.GetString(kDeviceNameKey, &device_name) &&
121 object.HasKey(kDeviceUUIDsKey) &&
122 object.GetList(kDeviceUUIDsKey, &device_uuids);
123 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698