Chromium Code Reviews| 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 |