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

Side by Side Diff: content/renderer/media/media_permission_dispatcher.cc

Issue 2931513003: Recreate MediaPermissionDispatcher's service connection on navigation (Closed)
Patch Set: Created 3 years, 6 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
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 "content/renderer/media/media_permission_dispatcher.h" 5 #include "content/renderer/media/media_permission_dispatcher.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 task_runner_(base::ThreadTaskRunnerHandle::Get()), 48 task_runner_(base::ThreadTaskRunnerHandle::Get()),
49 next_request_id_(0), 49 next_request_id_(0),
50 weak_factory_(this) { 50 weak_factory_(this) {
51 DCHECK(!connect_to_service_cb_.is_null()); 51 DCHECK(!connect_to_service_cb_.is_null());
52 weak_ptr_ = weak_factory_.GetWeakPtr(); 52 weak_ptr_ = weak_factory_.GetWeakPtr();
53 } 53 }
54 54
55 MediaPermissionDispatcher::~MediaPermissionDispatcher() { 55 MediaPermissionDispatcher::~MediaPermissionDispatcher() {
56 DCHECK(task_runner_->RunsTasksInCurrentSequence()); 56 DCHECK(task_runner_->RunsTasksInCurrentSequence());
57 57
58 // Fire all pending callbacks with |false|. 58 // Clean up pending requests.
59 for (auto& request : requests_) 59 OnConnectionError();
60 request.second.Run(false); 60 }
61
62 void MediaPermissionDispatcher::OnNavigation() {
63 // Behave as if there were a connection error. The browser process will be
64 // closing the connection imminently.
65 OnConnectionError();
61 } 66 }
62 67
63 void MediaPermissionDispatcher::HasPermission( 68 void MediaPermissionDispatcher::HasPermission(
64 Type type, 69 Type type,
65 const GURL& security_origin, 70 const GURL& security_origin,
66 const PermissionStatusCB& permission_status_cb) { 71 const PermissionStatusCB& permission_status_cb) {
67 if (!task_runner_->RunsTasksInCurrentSequence()) { 72 if (!task_runner_->RunsTasksInCurrentSequence()) {
68 task_runner_->PostTask( 73 task_runner_->PostTask(
69 FROM_HERE, base::Bind(&MediaPermissionDispatcher::HasPermission, 74 FROM_HERE, base::Bind(&MediaPermissionDispatcher::HasPermission,
70 weak_ptr_, type, security_origin, 75 weak_ptr_, type, security_origin,
71 media::BindToCurrentLoop(permission_status_cb))); 76 media::BindToCurrentLoop(permission_status_cb)));
72 return; 77 return;
73 } 78 }
74 79
75 DCHECK(task_runner_->RunsTasksInCurrentSequence()); 80 DCHECK(task_runner_->RunsTasksInCurrentSequence());
76 81
77 if (!permission_service_)
78 connect_to_service_cb_.Run(mojo::MakeRequest(&permission_service_));
79
80 int request_id = RegisterCallback(permission_status_cb); 82 int request_id = RegisterCallback(permission_status_cb);
81 DVLOG(2) << __func__ << ": request ID " << request_id; 83 DVLOG(2) << __func__ << ": request ID " << request_id;
82 84
83 permission_service_->HasPermission( 85 GetPermissionService()->HasPermission(
84 MediaPermissionTypeToPermissionDescriptor(type), 86 MediaPermissionTypeToPermissionDescriptor(type),
85 url::Origin(security_origin), 87 url::Origin(security_origin),
86 base::Bind(&MediaPermissionDispatcher::OnPermissionStatus, weak_ptr_, 88 base::Bind(&MediaPermissionDispatcher::OnPermissionStatus, weak_ptr_,
87 request_id)); 89 request_id));
88 } 90 }
89 91
90 void MediaPermissionDispatcher::RequestPermission( 92 void MediaPermissionDispatcher::RequestPermission(
91 Type type, 93 Type type,
92 const GURL& security_origin, 94 const GURL& security_origin,
93 const PermissionStatusCB& permission_status_cb) { 95 const PermissionStatusCB& permission_status_cb) {
94 if (!task_runner_->RunsTasksInCurrentSequence()) { 96 if (!task_runner_->RunsTasksInCurrentSequence()) {
95 task_runner_->PostTask( 97 task_runner_->PostTask(
96 FROM_HERE, base::Bind(&MediaPermissionDispatcher::RequestPermission, 98 FROM_HERE, base::Bind(&MediaPermissionDispatcher::RequestPermission,
97 weak_ptr_, type, security_origin, 99 weak_ptr_, type, security_origin,
98 media::BindToCurrentLoop(permission_status_cb))); 100 media::BindToCurrentLoop(permission_status_cb)));
99 return; 101 return;
100 } 102 }
101 103
102 DCHECK(task_runner_->RunsTasksInCurrentSequence()); 104 DCHECK(task_runner_->RunsTasksInCurrentSequence());
103 105
104 if (!permission_service_)
105 connect_to_service_cb_.Run(mojo::MakeRequest(&permission_service_));
106
107 int request_id = RegisterCallback(permission_status_cb); 106 int request_id = RegisterCallback(permission_status_cb);
108 DVLOG(2) << __func__ << ": request ID " << request_id; 107 DVLOG(2) << __func__ << ": request ID " << request_id;
109 108
110 permission_service_->RequestPermission( 109 GetPermissionService()->RequestPermission(
111 MediaPermissionTypeToPermissionDescriptor(type), 110 MediaPermissionTypeToPermissionDescriptor(type),
112 url::Origin(security_origin), 111 url::Origin(security_origin),
113 blink::WebUserGestureIndicator::IsProcessingUserGesture(), 112 blink::WebUserGestureIndicator::IsProcessingUserGesture(),
114 base::Bind(&MediaPermissionDispatcher::OnPermissionStatus, weak_ptr_, 113 base::Bind(&MediaPermissionDispatcher::OnPermissionStatus, weak_ptr_,
115 request_id)); 114 request_id));
116 } 115 }
117 116
118 uint32_t MediaPermissionDispatcher::RegisterCallback( 117 uint32_t MediaPermissionDispatcher::RegisterCallback(
119 const PermissionStatusCB& permission_status_cb) { 118 const PermissionStatusCB& permission_status_cb) {
120 DCHECK(task_runner_->RunsTasksInCurrentSequence()); 119 DCHECK(task_runner_->RunsTasksInCurrentSequence());
121 120
122 uint32_t request_id = next_request_id_++; 121 uint32_t request_id = next_request_id_++;
123 DCHECK(!requests_.count(request_id)); 122 DCHECK(!requests_.count(request_id));
124 requests_[request_id] = permission_status_cb; 123 requests_[request_id] = permission_status_cb;
125 124
126 return request_id; 125 return request_id;
127 } 126 }
128 127
128 blink::mojom::PermissionService*
129 MediaPermissionDispatcher::GetPermissionService() {
130 if (!permission_service_) {
131 connect_to_service_cb_.Run(mojo::MakeRequest(&permission_service_));
132 permission_service_.set_connection_error_handler(base::Bind(
133 &MediaPermissionDispatcher::OnConnectionError, base::Unretained(this)));
134 }
135
136 return permission_service_.get();
137 }
138
129 void MediaPermissionDispatcher::OnPermissionStatus( 139 void MediaPermissionDispatcher::OnPermissionStatus(
130 uint32_t request_id, 140 uint32_t request_id,
131 blink::mojom::PermissionStatus status) { 141 blink::mojom::PermissionStatus status) {
132 DVLOG(2) << __func__ << ": (" << request_id << ", " << status << ")"; 142 DVLOG(2) << __func__ << ": (" << request_id << ", " << status << ")";
133 DCHECK(task_runner_->RunsTasksInCurrentSequence()); 143 DCHECK(task_runner_->RunsTasksInCurrentSequence());
134 144
135 RequestMap::iterator iter = requests_.find(request_id); 145 RequestMap::iterator iter = requests_.find(request_id);
136 DCHECK(iter != requests_.end()) << "Request not found."; 146 DCHECK(iter != requests_.end()) << "Request not found.";
137 147
138 PermissionStatusCB permission_status_cb = iter->second; 148 PermissionStatusCB permission_status_cb = iter->second;
139 requests_.erase(iter); 149 requests_.erase(iter);
140 150
141 permission_status_cb.Run(status == blink::mojom::PermissionStatus::GRANTED); 151 permission_status_cb.Run(status == blink::mojom::PermissionStatus::GRANTED);
142 } 152 }
143 153
154 void MediaPermissionDispatcher::OnConnectionError() {
155 permission_service_.reset();
156
157 // Fire all pending callbacks with |false|.
158 RequestMap requests;
159 requests.swap(requests_);
160 for (auto& request : requests)
161 request.second.Run(false);
162 }
163
144 } // namespace content 164 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/media_permission_dispatcher.h ('k') | content/renderer/render_frame_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698