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

Side by Side Diff: android_webview/browser/aw_permission_manager.cc

Issue 2480293004: Mandate unique_ptr for base::IDMap in IDMapOwnPointer mode. (Closed)
Patch Set: Make changes requested by danakj, fix a few more headers Created 4 years 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
« no previous file with comments | « no previous file | android_webview/native/aw_contents_client_bridge.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "android_webview/browser/aw_permission_manager.h" 5 #include "android_webview/browser/aw_permission_manager.h"
6 6
7 #include <memory>
7 #include <string> 8 #include <string>
9 #include <utility>
8 10
9 #include "android_webview/browser/aw_browser_permission_request_delegate.h" 11 #include "android_webview/browser/aw_browser_permission_request_delegate.h"
10 #include "base/callback.h" 12 #include "base/callback.h"
11 #include "base/containers/hash_tables.h" 13 #include "base/containers/hash_tables.h"
12 #include "base/logging.h" 14 #include "base/logging.h"
13 #include "content/public/browser/permission_type.h" 15 #include "content/public/browser/permission_type.h"
14 #include "content/public/browser/render_frame_host.h" 16 #include "content/public/browser/render_frame_host.h"
15 #include "content/public/browser/render_process_host.h" 17 #include "content/public/browser/render_process_host.h"
16 #include "content/public/browser/web_contents.h" 18 #include "content/public/browser/web_contents.h"
17 19
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 bool user_gesture, 248 bool user_gesture,
247 const base::Callback<void(const std::vector<PermissionStatus>&)>& 249 const base::Callback<void(const std::vector<PermissionStatus>&)>&
248 callback) { 250 callback) {
249 if (permissions.empty()) { 251 if (permissions.empty()) {
250 callback.Run(std::vector<PermissionStatus>()); 252 callback.Run(std::vector<PermissionStatus>());
251 return kNoPendingOperation; 253 return kNoPendingOperation;
252 } 254 }
253 255
254 const GURL& embedding_origin = LastCommittedOrigin(render_frame_host); 256 const GURL& embedding_origin = LastCommittedOrigin(render_frame_host);
255 257
256 PendingRequest* pending_request = 258 auto pending_request = base::MakeUnique<PendingRequest>(
257 new PendingRequest(permissions, requesting_origin, embedding_origin, 259 permissions, requesting_origin, embedding_origin,
258 GetRenderProcessID(render_frame_host), 260 GetRenderProcessID(render_frame_host),
259 GetRenderFrameID(render_frame_host), callback); 261 GetRenderFrameID(render_frame_host), callback);
260 std::vector<bool> should_delegate_requests = 262 std::vector<bool> should_delegate_requests =
261 std::vector<bool>(permissions.size(), true); 263 std::vector<bool>(permissions.size(), true);
262 for (size_t i = 0; i < permissions.size(); ++i) { 264 for (size_t i = 0; i < permissions.size(); ++i) {
263 for (PendingRequestsMap::Iterator<PendingRequest> it(&pending_requests_); 265 for (PendingRequestsMap::Iterator<PendingRequest> it(&pending_requests_);
264 !it.IsAtEnd(); it.Advance()) { 266 !it.IsAtEnd(); it.Advance()) {
265 if (it.GetCurrentValue()->HasPermissionType(permissions[i]) && 267 if (it.GetCurrentValue()->HasPermissionType(permissions[i]) &&
266 it.GetCurrentValue()->requesting_origin == requesting_origin) { 268 it.GetCurrentValue()->requesting_origin == requesting_origin) {
267 if (it.GetCurrentValue()->IsCompleted(permissions[i])) { 269 if (it.GetCurrentValue()->IsCompleted(permissions[i])) {
268 pending_request->SetPermissionStatus( 270 pending_request->SetPermissionStatus(
269 permissions[i], 271 permissions[i],
270 it.GetCurrentValue()->GetPermissionStatus(permissions[i])); 272 it.GetCurrentValue()->GetPermissionStatus(permissions[i]));
271 } 273 }
272 should_delegate_requests[i] = false; 274 should_delegate_requests[i] = false;
273 break; 275 break;
274 } 276 }
275 } 277 }
276 } 278 }
277 279
278 int request_id = pending_requests_.Add(pending_request); 280 // Keep copy of pointer for performing further operations after ownership is
281 // transferred to pending_requests_
282 PendingRequest* pending_request_raw = pending_request.get();
283 int request_id = pending_requests_.Add(std::move(pending_request));
279 284
280 AwBrowserPermissionRequestDelegate* delegate = GetDelegate( 285 AwBrowserPermissionRequestDelegate* delegate =
281 pending_request->render_process_id, pending_request->render_frame_id); 286 GetDelegate(pending_request_raw->render_process_id,
287 pending_request_raw->render_frame_id);
282 288
283 for (size_t i = 0; i < permissions.size(); ++i) { 289 for (size_t i = 0; i < permissions.size(); ++i) {
284 if (!should_delegate_requests[i]) 290 if (!should_delegate_requests[i])
285 continue; 291 continue;
286 292
287 if (!delegate) { 293 if (!delegate) {
288 DVLOG(0) << "Dropping permissions request for " 294 DVLOG(0) << "Dropping permissions request for "
289 << static_cast<int>(permissions[i]); 295 << static_cast<int>(permissions[i]);
290 pending_request->SetPermissionStatus(permissions[i], 296 pending_request_raw->SetPermissionStatus(permissions[i],
291 PermissionStatus::DENIED); 297 PermissionStatus::DENIED);
292 continue; 298 continue;
293 } 299 }
294 300
295 switch (permissions[i]) { 301 switch (permissions[i]) {
296 case PermissionType::GEOLOCATION: 302 case PermissionType::GEOLOCATION:
297 delegate->RequestGeolocationPermission( 303 delegate->RequestGeolocationPermission(
298 pending_request->requesting_origin, 304 pending_request_raw->requesting_origin,
299 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), 305 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(),
300 request_id, permissions[i])); 306 request_id, permissions[i]));
301 break; 307 break;
302 case PermissionType::PROTECTED_MEDIA_IDENTIFIER: 308 case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
303 delegate->RequestProtectedMediaIdentifierPermission( 309 delegate->RequestProtectedMediaIdentifierPermission(
304 pending_request->requesting_origin, 310 pending_request_raw->requesting_origin,
305 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), 311 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(),
306 request_id, permissions[i])); 312 request_id, permissions[i]));
307 break; 313 break;
308 case PermissionType::MIDI_SYSEX: 314 case PermissionType::MIDI_SYSEX:
309 delegate->RequestMIDISysexPermission( 315 delegate->RequestMIDISysexPermission(
310 pending_request->requesting_origin, 316 pending_request_raw->requesting_origin,
311 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), 317 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(),
312 request_id, permissions[i])); 318 request_id, permissions[i]));
313 break; 319 break;
314 case PermissionType::AUDIO_CAPTURE: 320 case PermissionType::AUDIO_CAPTURE:
315 case PermissionType::VIDEO_CAPTURE: 321 case PermissionType::VIDEO_CAPTURE:
316 case PermissionType::NOTIFICATIONS: 322 case PermissionType::NOTIFICATIONS:
317 case PermissionType::PUSH_MESSAGING: 323 case PermissionType::PUSH_MESSAGING:
318 case PermissionType::DURABLE_STORAGE: 324 case PermissionType::DURABLE_STORAGE:
319 case PermissionType::BACKGROUND_SYNC: 325 case PermissionType::BACKGROUND_SYNC:
320 case PermissionType::FLASH: 326 case PermissionType::FLASH:
321 NOTIMPLEMENTED() << "RequestPermissions is not implemented for " 327 NOTIMPLEMENTED() << "RequestPermissions is not implemented for "
322 << static_cast<int>(permissions[i]); 328 << static_cast<int>(permissions[i]);
323 pending_request->SetPermissionStatus(permissions[i], 329 pending_request_raw->SetPermissionStatus(permissions[i],
324 PermissionStatus::DENIED); 330 PermissionStatus::DENIED);
325 break; 331 break;
326 case PermissionType::MIDI: 332 case PermissionType::MIDI:
327 pending_request->SetPermissionStatus(permissions[i], 333 pending_request_raw->SetPermissionStatus(permissions[i],
328 PermissionStatus::GRANTED); 334 PermissionStatus::GRANTED);
329 break; 335 break;
330 case PermissionType::NUM: 336 case PermissionType::NUM:
331 NOTREACHED() << "PermissionType::NUM was not expected here."; 337 NOTREACHED() << "PermissionType::NUM was not expected here.";
332 pending_request->SetPermissionStatus(permissions[i], 338 pending_request_raw->SetPermissionStatus(permissions[i],
333 PermissionStatus::DENIED); 339 PermissionStatus::DENIED);
334 break; 340 break;
335 } 341 }
336 } 342 }
337 343
338 // If delegate resolve the permission synchronously, all requests could be 344 // If delegate resolve the permission synchronously, all requests could be
339 // already resolved here. 345 // already resolved here.
340 if (!pending_requests_.Lookup(request_id)) 346 if (!pending_requests_.Lookup(request_id))
341 return kNoPendingOperation; 347 return kNoPendingOperation;
342 348
343 // If requests are resolved without calling delegate functions, e.g. 349 // If requests are resolved without calling delegate functions, e.g.
344 // PermissionType::MIDI is permitted within the previous for-loop, all 350 // PermissionType::MIDI is permitted within the previous for-loop, all
345 // requests could be already resolved, but still in the |pending_requests_| 351 // requests could be already resolved, but still in the |pending_requests_|
346 // without invoking the callback. 352 // without invoking the callback.
347 if (pending_request->IsCompleted()) { 353 if (pending_request_raw->IsCompleted()) {
348 std::vector<PermissionStatus> results = pending_request->results; 354 std::vector<PermissionStatus> results = pending_request_raw->results;
349 pending_requests_.Remove(request_id); 355 pending_requests_.Remove(request_id);
350 callback.Run(results); 356 callback.Run(results);
351 return kNoPendingOperation; 357 return kNoPendingOperation;
352 } 358 }
353 359
354 return request_id; 360 return request_id;
355 } 361 }
356 362
357 // static 363 // static
358 void AwPermissionManager::OnRequestResponse( 364 void AwPermissionManager::OnRequestResponse(
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 ->GetLastCommittedURL().GetOrigin(); 548 ->GetLastCommittedURL().GetOrigin();
543 } 549 }
544 550
545 AwBrowserPermissionRequestDelegate* AwPermissionManager::GetDelegate( 551 AwBrowserPermissionRequestDelegate* AwPermissionManager::GetDelegate(
546 int render_process_id, int render_frame_id) { 552 int render_process_id, int render_frame_id) {
547 return AwBrowserPermissionRequestDelegate::FromID(render_process_id, 553 return AwBrowserPermissionRequestDelegate::FromID(render_process_id,
548 render_frame_id); 554 render_frame_id);
549 } 555 }
550 556
551 } // namespace android_webview 557 } // namespace android_webview
OLDNEW
« no previous file with comments | « no previous file | android_webview/native/aw_contents_client_bridge.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698