OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/permissions/permission_service_impl.h" | 5 #include "content/browser/permissions/permission_service_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "content/public/browser/browser_context.h" | 8 #include "content/public/browser/browser_context.h" |
9 #include "content/public/browser/permission_manager.h" | 9 #include "content/public/browser/permission_manager.h" |
10 #include "content/public/browser/permission_type.h" | 10 #include "content/public/browser/permission_type.h" |
(...skipping 21 matching lines...) Expand all Loading... | |
32 case PERMISSION_NAME_AUDIO_CAPTURE: | 32 case PERMISSION_NAME_AUDIO_CAPTURE: |
33 return PermissionType::AUDIO_CAPTURE; | 33 return PermissionType::AUDIO_CAPTURE; |
34 case PERMISSION_NAME_VIDEO_CAPTURE: | 34 case PERMISSION_NAME_VIDEO_CAPTURE: |
35 return PermissionType::VIDEO_CAPTURE; | 35 return PermissionType::VIDEO_CAPTURE; |
36 } | 36 } |
37 | 37 |
38 NOTREACHED(); | 38 NOTREACHED(); |
39 return PermissionType::NUM; | 39 return PermissionType::NUM; |
40 } | 40 } |
41 | 41 |
42 void PermissionRequestResponseCallbackWrapper( | |
mlamouri (slow - plz ping)
2015/09/16 15:08:09
Could you add a comment explaining why you need th
Lalit Maganti
2015/09/16 17:21:18
Done.
| |
43 const mojo::Callback<void(PermissionStatus)>& callback, | |
44 const mojo::Array<PermissionStatus>& vector) { | |
45 DCHECK(vector.size() == 1); | |
46 callback.Run(vector[0]); | |
47 } | |
48 | |
42 } // anonymous namespace | 49 } // anonymous namespace |
43 | 50 |
44 PermissionServiceImpl::PendingRequest::PendingRequest( | 51 PermissionServiceImpl::PendingRequest::PendingRequest( |
45 PermissionType permission, | 52 const PermissionsStatusCallback& callback, |
46 const GURL& origin, | 53 int request_count) |
47 const PermissionStatusCallback& callback) | 54 : callback(callback), |
48 : permission(permission), | 55 request_count(request_count) { |
49 origin(origin), | |
50 callback(callback) { | |
51 } | 56 } |
52 | 57 |
53 PermissionServiceImpl::PendingRequest::~PendingRequest() { | 58 PermissionServiceImpl::PendingRequest::~PendingRequest() { |
54 if (!callback.is_null()) | 59 if (!callback.is_null()) { |
55 callback.Run(PERMISSION_STATUS_ASK); | 60 mojo::Array<PermissionStatus> result = |
61 mojo::Array<PermissionStatus>::New(request_count); | |
62 for (int i = 0; i < request_count; ++i) | |
63 result[i] = PERMISSION_STATUS_DENIED; | |
64 callback.Run(result.Pass()); | |
65 } | |
56 } | 66 } |
57 | 67 |
58 PermissionServiceImpl::PendingSubscription::PendingSubscription( | 68 PermissionServiceImpl::PendingSubscription::PendingSubscription( |
59 PermissionType permission, | 69 PermissionType permission, |
60 const GURL& origin, | 70 const GURL& origin, |
61 const PermissionStatusCallback& callback) | 71 const PermissionStatusCallback& callback) |
62 : id(-1), | 72 : id(-1), |
63 permission(permission), | 73 permission(permission), |
64 origin(origin), | 74 origin(origin), |
65 callback(callback) { | 75 callback(callback) { |
(...skipping 22 matching lines...) Expand all Loading... | |
88 void PermissionServiceImpl::OnConnectionError() { | 98 void PermissionServiceImpl::OnConnectionError() { |
89 context_->ServiceHadConnectionError(this); | 99 context_->ServiceHadConnectionError(this); |
90 // After that call, |this| will be deleted. | 100 // After that call, |this| will be deleted. |
91 } | 101 } |
92 | 102 |
93 void PermissionServiceImpl::RequestPermission( | 103 void PermissionServiceImpl::RequestPermission( |
94 PermissionName permission, | 104 PermissionName permission, |
95 const mojo::String& origin, | 105 const mojo::String& origin, |
96 bool user_gesture, | 106 bool user_gesture, |
97 const PermissionStatusCallback& callback) { | 107 const PermissionStatusCallback& callback) { |
108 mojo::Array<PermissionName> permissions(1); | |
109 permissions[0] = permission; | |
110 RequestPermissionsInternal( | |
111 permissions.Pass(), | |
112 origin, | |
113 user_gesture, | |
114 base::Bind(&PermissionRequestResponseCallbackWrapper, | |
mlamouri (slow - plz ping)
2015/09/16 15:08:09
Can you add a comment explaining why you are doing
Lalit Maganti
2015/09/16 17:21:18
Done.
| |
115 callback)); | |
116 } | |
117 | |
118 void PermissionServiceImpl::RequestPermissions( | |
119 mojo::Array<PermissionName> permissions, | |
120 const mojo::String& origin, | |
121 bool user_gesture, | |
122 const PermissionsStatusCallback& callback) { | |
123 RequestPermissionsInternal( | |
124 permissions.Pass(), origin, user_gesture, callback); | |
125 } | |
126 | |
127 void PermissionServiceImpl::RequestPermissionsInternal( | |
128 mojo::Array<PermissionName> permissions, | |
129 const mojo::String& origin, | |
130 bool user_gesture, | |
131 const PermissionsStatusCallback& callback) { | |
132 if (permissions.is_null()) { | |
133 callback.Run(mojo::Array<PermissionStatus>()); | |
mlamouri (slow - plz ping)
2015/09/16 15:08:09
Is that even possible?
Lalit Maganti
2015/09/16 17:21:18
A rouge renderer I guess?
| |
134 return; | |
135 } | |
136 | |
98 // This condition is valid if the call is coming from a ChildThread instead of | 137 // This condition is valid if the call is coming from a ChildThread instead of |
99 // a RenderFrame. Some consumers of the service run in Workers and some in | 138 // a RenderFrame. Some consumers of the service run in Workers and some in |
100 // Frames. In the context of a Worker, it is not possible to show a | 139 // Frames. In the context of a Worker, it is not possible to show a |
101 // permission prompt because there is no tab. In the context of a Frame, we | 140 // permission prompt because there is no tab. In the context of a Frame, we |
102 // can. Even if the call comes from a context where it is not possible to show | 141 // can. Even if the call comes from a context where it is not possible to show |
103 // any UI, we want to still return something relevant so the current | 142 // any UI, we want to still return something relevant so the current |
104 // permission status is returned. | 143 // permission status is returned for each permission. |
105 if (!context_->render_frame_host()) { | 144 if (!context_->render_frame_host()) { |
106 // There is no way to show a UI so the call will simply return the current | 145 mojo::Array<PermissionStatus> result(permissions.size()); |
107 // permission. | 146 for (size_t i = 0; i < permissions.size(); ++i) |
108 HasPermission(permission, origin, callback); | 147 result[i] = GetPermissionStatusFromName(permissions[i], GURL(origin)); |
148 callback.Run(result.Pass()); | |
109 return; | 149 return; |
110 } | 150 } |
111 | 151 |
112 BrowserContext* browser_context = context_->GetBrowserContext(); | 152 BrowserContext* browser_context = context_->GetBrowserContext(); |
113 DCHECK(browser_context); | 153 DCHECK(browser_context); |
114 if (!browser_context->GetPermissionManager()) { | 154 if (!browser_context->GetPermissionManager()) { |
115 callback.Run(content::PERMISSION_STATUS_DENIED); | 155 mojo::Array<PermissionStatus> result(permissions.size()); |
156 for (size_t i = 0; i < permissions.size(); ++i) | |
157 result[i] = PERMISSION_STATUS_DENIED; | |
158 callback.Run(result.Pass()); | |
116 return; | 159 return; |
117 } | 160 } |
118 | 161 |
119 PermissionType permission_type = PermissionNameToPermissionType(permission); | 162 std::vector<PermissionType> types(permissions.size()); |
163 for (size_t i = 0; i < types.size(); ++i) | |
164 types[i] = PermissionNameToPermissionType(permissions[i]); | |
165 | |
120 int request_id = pending_requests_.Add( | 166 int request_id = pending_requests_.Add( |
121 new PendingRequest(permission_type, GURL(origin), callback)); | 167 new PendingRequest(callback, permissions.size())); |
122 int manager_id = browser_context->GetPermissionManager()->RequestPermission( | 168 int manager_id = browser_context->GetPermissionManager()->RequestPermissions( |
123 permission_type, | 169 types, |
124 context_->render_frame_host(), | 170 context_->render_frame_host(), |
125 GURL(origin), | 171 GURL(origin), |
126 user_gesture, // TODO(mlamouri): should be removed (crbug.com/423770) | 172 user_gesture, // TODO(mlamouri): should be removed (crbug.com/423770) |
127 base::Bind(&PermissionServiceImpl::OnRequestPermissionResponse, | 173 base::Bind(&PermissionServiceImpl::OnRequestPermissionsResponse, |
128 weak_factory_.GetWeakPtr(), | 174 weak_factory_.GetWeakPtr(), |
129 request_id)); | 175 request_id)); |
130 | 176 |
131 // Check if the request still exists. It may have been removed by the | 177 // Check if the request still exists. It may have been removed by the |
132 // the response callback. | 178 // the response callback. |
133 PendingRequest* pending_request = pending_requests_.Lookup(request_id); | 179 PendingRequest* pending_request = pending_requests_.Lookup(request_id); |
134 if (!pending_request) | 180 if (!pending_request) |
135 return; | 181 return; |
136 pending_request->manager_id = manager_id; | 182 pending_request->manager_id = manager_id; |
137 } | 183 } |
138 | 184 |
139 void PermissionServiceImpl::RequestPermissions( | 185 void PermissionServiceImpl::OnRequestPermissionsResponse( |
140 mojo::Array<PermissionName> permissions, | |
141 const mojo::String& origin, | |
142 bool user_gesture, | |
143 const PermissionsStatusCallback& callback) { | |
144 NOTIMPLEMENTED(); | |
145 | |
146 // TODO(lalitm,mlamouri): this is returning the current permission statuses | |
147 // in order for the call to successfully return. It will be changed later. | |
148 // See https://crbug.com/516626 | |
149 mojo::Array<PermissionStatus> result(permissions.size()); | |
150 for (size_t i = 0; i < permissions.size(); ++i) | |
151 result[i] = GetPermissionStatusFromName(permissions[i], GURL(origin)); | |
152 callback.Run(result.Pass()); | |
153 } | |
154 | |
155 void PermissionServiceImpl::OnRequestPermissionResponse( | |
156 int request_id, | 186 int request_id, |
157 PermissionStatus status) { | 187 const std::vector<PermissionStatus>& result) { |
158 PendingRequest* request = pending_requests_.Lookup(request_id); | 188 PendingRequest* request = pending_requests_.Lookup(request_id); |
159 PermissionStatusCallback callback(request->callback); | 189 PermissionsStatusCallback callback(request->callback); |
160 request->callback.reset(); | 190 request->callback.reset(); |
161 pending_requests_.Remove(request_id); | 191 pending_requests_.Remove(request_id); |
162 callback.Run(status); | 192 callback.Run(mojo::Array<PermissionStatus>::From(result)); |
163 } | 193 } |
164 | 194 |
165 void PermissionServiceImpl::CancelPendingOperations() { | 195 void PermissionServiceImpl::CancelPendingOperations() { |
166 DCHECK(context_->render_frame_host()); | 196 DCHECK(context_->render_frame_host()); |
167 DCHECK(context_->GetBrowserContext()); | 197 DCHECK(context_->GetBrowserContext()); |
168 | 198 |
169 PermissionManager* permission_manager = | 199 PermissionManager* permission_manager = |
170 context_->GetBrowserContext()->GetPermissionManager(); | 200 context_->GetBrowserContext()->GetPermissionManager(); |
171 if (!permission_manager) | 201 if (!permission_manager) |
172 return; | 202 return; |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
308 | 338 |
309 PermissionStatusCallback callback = subscription->callback; | 339 PermissionStatusCallback callback = subscription->callback; |
310 | 340 |
311 subscription->callback.reset(); | 341 subscription->callback.reset(); |
312 pending_subscriptions_.Remove(pending_subscription_id); | 342 pending_subscriptions_.Remove(pending_subscription_id); |
313 | 343 |
314 callback.Run(status); | 344 callback.Run(status); |
315 } | 345 } |
316 | 346 |
317 } // namespace content | 347 } // namespace content |
OLD | NEW |