| Index: content/browser/permissions/permission_service_impl.cc
|
| diff --git a/content/browser/permissions/permission_service_impl.cc b/content/browser/permissions/permission_service_impl.cc
|
| index 23bf0981c4b12940354476927567553a8690b584..503571e500a40ac9e8f63b8a0a9f0dcf0216855e 100644
|
| --- a/content/browser/permissions/permission_service_impl.cc
|
| +++ b/content/browser/permissions/permission_service_impl.cc
|
| @@ -45,7 +45,8 @@ PermissionServiceImpl::PendingRequest::PendingRequest(
|
| PermissionType permission,
|
| const GURL& origin,
|
| const PermissionStatusCallback& callback)
|
| - : permission(permission),
|
| + : id(PermissionManager::kNoPendingOperation),
|
| + permission(permission),
|
| origin(origin),
|
| callback(callback) {
|
| }
|
| @@ -117,18 +118,25 @@ void PermissionServiceImpl::RequestPermission(
|
| }
|
|
|
| PermissionType permission_type = PermissionNameToPermissionType(permission);
|
| - int request_id = pending_requests_.Add(
|
| + int pending_request_id = pending_requests_.Add(
|
| new PendingRequest(permission_type, GURL(origin), callback));
|
|
|
| - browser_context->GetPermissionManager()->RequestPermission(
|
| + int id = browser_context->GetPermissionManager()->RequestPermission(
|
| permission_type,
|
| context_->render_frame_host(),
|
| - request_id,
|
| GURL(origin),
|
| user_gesture, // TODO(mlamouri): should be removed (crbug.com/423770)
|
| base::Bind(&PermissionServiceImpl::OnRequestPermissionResponse,
|
| weak_factory_.GetWeakPtr(),
|
| - request_id));
|
| + pending_request_id));
|
| +
|
| + // Check if the request still exists. It may have been removed by the
|
| + // callback if it was run synchronously.
|
| + PendingRequest* pending_request = pending_requests_.Lookup(
|
| + pending_request_id);
|
| + if (!pending_request)
|
| + return;
|
| + pending_request->id = id;
|
| }
|
|
|
| void PermissionServiceImpl::RequestPermissions(
|
| @@ -158,7 +166,6 @@ void PermissionServiceImpl::OnRequestPermissionResponse(
|
| }
|
|
|
| void PermissionServiceImpl::CancelPendingOperations() {
|
| - DCHECK(context_->render_frame_host());
|
| DCHECK(context_->GetBrowserContext());
|
|
|
| PermissionManager* permission_manager =
|
| @@ -170,10 +177,7 @@ void PermissionServiceImpl::CancelPendingOperations() {
|
| for (RequestsMap::Iterator<PendingRequest> it(&pending_requests_);
|
| !it.IsAtEnd(); it.Advance()) {
|
| permission_manager->CancelPermissionRequest(
|
| - it.GetCurrentValue()->permission,
|
| - context_->render_frame_host(),
|
| - it.GetCurrentKey(),
|
| - it.GetCurrentValue()->origin);
|
| + it.GetCurrentValue()->id);
|
| }
|
| pending_requests_.Clear();
|
|
|
|
|