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

Side by Side Diff: content/child/permissions/permission_dispatcher.cc

Issue 1238673002: content: permissions: add plumbing to revoke permissions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update entire histograms file Created 5 years, 5 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/child/permissions/permission_dispatcher.h" 5 #include "content/child/permissions/permission_dispatcher.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "content/child/worker_task_runner.h" 8 #include "content/child/worker_task_runner.h"
9 #include "content/public/common/service_registry.h" 9 #include "content/public/common/service_registry.h"
10 #include "third_party/WebKit/public/platform/WebURL.h" 10 #include "third_party/WebKit/public/platform/WebURL.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 68
69 // static 69 // static
70 bool PermissionDispatcher::IsObservable(blink::WebPermissionType type) { 70 bool PermissionDispatcher::IsObservable(blink::WebPermissionType type) {
71 return type == blink::WebPermissionTypeGeolocation || 71 return type == blink::WebPermissionTypeGeolocation ||
72 type == blink::WebPermissionTypeNotifications || 72 type == blink::WebPermissionTypeNotifications ||
73 type == blink::WebPermissionTypePushNotifications || 73 type == blink::WebPermissionTypePushNotifications ||
74 type == blink::WebPermissionTypeMidiSysEx; 74 type == blink::WebPermissionTypeMidiSysEx;
75 } 75 }
76 76
77 PermissionDispatcher::CallbackInformation::CallbackInformation( 77 PermissionDispatcher::CallbackInformation::CallbackInformation(
78 blink::WebPermissionQueryCallback* callback, 78 blink::WebPermissionCallback* callback,
79 int worker_thread_id) 79 int worker_thread_id)
80 : callback_(callback), 80 : callback_(callback),
81 worker_thread_id_(worker_thread_id) { 81 worker_thread_id_(worker_thread_id) {
82 } 82 }
83 83
84 blink::WebPermissionQueryCallback* 84 blink::WebPermissionCallback*
85 PermissionDispatcher::CallbackInformation::callback() const { 85 PermissionDispatcher::CallbackInformation::callback() const {
86 return callback_.get(); 86 return callback_.get();
87 } 87 }
88 88
89 int PermissionDispatcher::CallbackInformation::worker_thread_id() const { 89 int PermissionDispatcher::CallbackInformation::worker_thread_id() const {
90 return worker_thread_id_; 90 return worker_thread_id_;
91 } 91 }
92 92
93 blink::WebPermissionQueryCallback* 93 blink::WebPermissionCallback*
94 PermissionDispatcher::CallbackInformation::ReleaseCallback() { 94 PermissionDispatcher::CallbackInformation::ReleaseCallback() {
95 return callback_.release(); 95 return callback_.release();
96 } 96 }
97 97
98 PermissionDispatcher::CallbackInformation::~CallbackInformation() { 98 PermissionDispatcher::CallbackInformation::~CallbackInformation() {
99 } 99 }
100 100
101 PermissionDispatcher::PermissionDispatcher(ServiceRegistry* service_registry) 101 PermissionDispatcher::PermissionDispatcher(ServiceRegistry* service_registry)
102 : service_registry_(service_registry) { 102 : service_registry_(service_registry) {
103 } 103 }
104 104
105 PermissionDispatcher::~PermissionDispatcher() { 105 PermissionDispatcher::~PermissionDispatcher() {
106 } 106 }
107 107
108 void PermissionDispatcher::queryPermission( 108 void PermissionDispatcher::queryPermission(
109 blink::WebPermissionType type, 109 blink::WebPermissionType type,
110 const blink::WebURL& origin, 110 const blink::WebURL& origin,
111 blink::WebPermissionQueryCallback* callback) { 111 blink::WebPermissionCallback* callback) {
112 QueryPermissionInternal( 112 QueryPermissionInternal(
113 type, origin.string().utf8(), callback, kNoWorkerThread); 113 type, origin.string().utf8(), callback, kNoWorkerThread);
114 } 114 }
115 115
116 void PermissionDispatcher::revokePermission(
117 blink::WebPermissionType type,
118 const blink::WebURL& origin,
119 blink::WebPermissionCallback* callback) {
120 RevokePermissionInternal(
121 type, origin.string().utf8(), callback, kNoWorkerThread);
122 }
123
116 void PermissionDispatcher::startListening( 124 void PermissionDispatcher::startListening(
117 blink::WebPermissionType type, 125 blink::WebPermissionType type,
118 const blink::WebURL& origin, 126 const blink::WebURL& origin,
119 WebPermissionObserver* observer) { 127 WebPermissionObserver* observer) {
120 if (!IsObservable(type)) 128 if (!IsObservable(type))
121 return; 129 return;
122 130
123 RegisterObserver(observer); 131 RegisterObserver(observer);
124 132
125 GetNextPermissionChange(type, 133 GetNextPermissionChange(type,
126 origin.string().utf8(), 134 origin.string().utf8(),
127 observer, 135 observer,
128 // We initialize with an arbitrary value because the 136 // We initialize with an arbitrary value because the
129 // mojo service wants a value. Worst case, the 137 // mojo service wants a value. Worst case, the
130 // observer will get notified about a non-change which 138 // observer will get notified about a non-change which
131 // should be a no-op. After the first notification, 139 // should be a no-op. After the first notification,
132 // GetNextPermissionChange will be called with the 140 // GetNextPermissionChange will be called with the
133 // latest known value. 141 // latest known value.
134 PERMISSION_STATUS_ASK); 142 PERMISSION_STATUS_ASK);
135 } 143 }
136 144
137 void PermissionDispatcher::stopListening(WebPermissionObserver* observer) { 145 void PermissionDispatcher::stopListening(WebPermissionObserver* observer) {
138 UnregisterObserver(observer); 146 UnregisterObserver(observer);
139 } 147 }
140 148
141 void PermissionDispatcher::QueryPermissionForWorker( 149 void PermissionDispatcher::QueryPermissionForWorker(
142 blink::WebPermissionType type, 150 blink::WebPermissionType type,
143 const std::string& origin, 151 const std::string& origin,
144 blink::WebPermissionQueryCallback* callback, 152 blink::WebPermissionCallback* callback,
145 int worker_thread_id) { 153 int worker_thread_id) {
146 QueryPermissionInternal(type, origin, callback, worker_thread_id); 154 QueryPermissionInternal(type, origin, callback, worker_thread_id);
147 } 155 }
148 156
157 void PermissionDispatcher::RevokePermissionForWorker(
158 blink::WebPermissionType type,
159 const std::string& origin,
160 blink::WebPermissionCallback* callback,
161 int worker_thread_id) {
162 RevokePermissionInternal(type, origin, callback, worker_thread_id);
163 }
164
149 void PermissionDispatcher::StartListeningForWorker( 165 void PermissionDispatcher::StartListeningForWorker(
150 blink::WebPermissionType type, 166 blink::WebPermissionType type,
151 const std::string& origin, 167 const std::string& origin,
152 int worker_thread_id, 168 int worker_thread_id,
153 const base::Callback<void(blink::WebPermissionStatus)>& callback) { 169 const base::Callback<void(blink::WebPermissionStatus)>& callback) {
154 GetPermissionServicePtr()->GetNextPermissionChange( 170 GetPermissionServicePtr()->GetNextPermissionChange(
155 GetPermissionName(type), 171 GetPermissionName(type),
156 origin, 172 origin,
157 // We initialize with an arbitrary value because the mojo service wants a 173 // We initialize with an arbitrary value because the mojo service wants a
158 // value. Worst case, the observer will get notified about a non-change 174 // value. Worst case, the observer will get notified about a non-change
(...skipping 17 matching lines...) Expand all
176 origin, 192 origin,
177 GetPermissionStatus(status), 193 GetPermissionStatus(status),
178 base::Bind(&PermissionDispatcher::OnPermissionChangedForWorker, 194 base::Bind(&PermissionDispatcher::OnPermissionChangedForWorker,
179 base::Unretained(this), 195 base::Unretained(this),
180 worker_thread_id, 196 worker_thread_id,
181 callback)); 197 callback));
182 } 198 }
183 199
184 // static 200 // static
185 void PermissionDispatcher::RunCallbackOnWorkerThread( 201 void PermissionDispatcher::RunCallbackOnWorkerThread(
186 blink::WebPermissionQueryCallback* callback, 202 blink::WebPermissionCallback* callback,
187 scoped_ptr<blink::WebPermissionStatus> status) { 203 scoped_ptr<blink::WebPermissionStatus> status) {
188 callback->onSuccess(status.release()); 204 callback->onSuccess(status.release());
189 delete callback; 205 delete callback;
190 } 206 }
191 207
192 PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { 208 PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() {
193 if (!permission_service_.get()) { 209 if (!permission_service_.get()) {
194 service_registry_->ConnectToRemoteService( 210 service_registry_->ConnectToRemoteService(
195 mojo::GetProxy(&permission_service_)); 211 mojo::GetProxy(&permission_service_));
196 } 212 }
197 return permission_service_; 213 return permission_service_;
198 } 214 }
199 215
200 void PermissionDispatcher::QueryPermissionInternal( 216 void PermissionDispatcher::QueryPermissionInternal(
201 blink::WebPermissionType type, 217 blink::WebPermissionType type,
202 const std::string& origin, 218 const std::string& origin,
203 blink::WebPermissionQueryCallback* callback, 219 blink::WebPermissionCallback* callback,
204 int worker_thread_id) { 220 int worker_thread_id) {
205 // We need to save the |callback| in an IDMap so if |this| gets deleted, the 221 // We need to save the |callback| in an IDMap so if |this| gets deleted, the
206 // callback will not leak. In the case of |this| gets deleted, the 222 // callback will not leak. In the case of |this| gets deleted, the
207 // |permission_service_| pipe will be destroyed too so OnQueryPermission will 223 // |permission_service_| pipe will be destroyed too so OnQueryPermission will
208 // not be called. 224 // not be called.
209 int request_id = pending_callbacks_.Add( 225 int request_id = pending_callbacks_.Add(
210 new CallbackInformation(callback, worker_thread_id)); 226 new CallbackInformation(callback, worker_thread_id));
211 GetPermissionServicePtr()->HasPermission( 227 GetPermissionServicePtr()->HasPermission(
212 GetPermissionName(type), 228 GetPermissionName(type),
213 origin, 229 origin,
214 base::Bind(&PermissionDispatcher::OnQueryPermission, 230 base::Bind(&PermissionDispatcher::OnPermissionResponse,
215 base::Unretained(this), 231 base::Unretained(this),
216 request_id)); 232 request_id));
217 } 233 }
218 234
219 void PermissionDispatcher::OnQueryPermission(int request_id, 235 void PermissionDispatcher::RevokePermissionInternal(
220 PermissionStatus result) { 236 blink::WebPermissionType type,
237 const std::string& origin,
238 blink::WebPermissionCallback* callback,
239 int worker_thread_id) {
240 // We need to save the |callback| in an IDMap so if |this| gets deleted, the
241 // callback will not leak. In the case of |this| gets deleted, the
242 // |permission_service_| pipe will be destroyed too so OnQueryPermission will
243 // not be called.
244 int request_id = pending_callbacks_.Add(
245 new CallbackInformation(callback, worker_thread_id));
246 GetPermissionServicePtr()->RevokePermission(
247 GetPermissionName(type),
248 origin,
249 base::Bind(&PermissionDispatcher::OnPermissionResponse,
250 base::Unretained(this),
251 request_id));
252 }
253
254 void PermissionDispatcher::OnPermissionResponse(int request_id,
255 PermissionStatus result) {
221 CallbackInformation* callback_information = 256 CallbackInformation* callback_information =
222 pending_callbacks_.Lookup(request_id); 257 pending_callbacks_.Lookup(request_id);
223 DCHECK(callback_information && callback_information->callback()); 258 DCHECK(callback_information && callback_information->callback());
224 scoped_ptr<blink::WebPermissionStatus> status( 259 scoped_ptr<blink::WebPermissionStatus> status(
225 new blink::WebPermissionStatus(GetWebPermissionStatus(result))); 260 new blink::WebPermissionStatus(GetWebPermissionStatus(result)));
226 261
227 if (callback_information->worker_thread_id() != kNoWorkerThread) { 262 if (callback_information->worker_thread_id() != kNoWorkerThread) {
228 blink::WebPermissionQueryCallback* callback = 263 blink::WebPermissionCallback* callback =
229 callback_information->ReleaseCallback(); 264 callback_information->ReleaseCallback();
230 int worker_thread_id = callback_information->worker_thread_id(); 265 int worker_thread_id = callback_information->worker_thread_id();
231 pending_callbacks_.Remove(request_id); 266 pending_callbacks_.Remove(request_id);
232 267
233 // If the worker is no longer running, ::PostTask() will return false and 268 // If the worker is no longer running, ::PostTask() will return false and
234 // gracefully fail, destroying the callback too. 269 // gracefully fail, destroying the callback too.
235 WorkerTaskRunner::Instance()->PostTask( 270 WorkerTaskRunner::Instance()->PostTask(
236 worker_thread_id, 271 worker_thread_id,
237 base::Bind(&PermissionDispatcher::RunCallbackOnWorkerThread, 272 base::Bind(&PermissionDispatcher::RunCallbackOnWorkerThread,
238 base::Unretained(callback), 273 base::Unretained(callback),
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 origin, 312 origin,
278 current_status, 313 current_status,
279 base::Bind(&PermissionDispatcher::OnPermissionChanged, 314 base::Bind(&PermissionDispatcher::OnPermissionChanged,
280 base::Unretained(this), 315 base::Unretained(this),
281 type, 316 type,
282 origin, 317 origin,
283 base::Unretained(observer))); 318 base::Unretained(observer)));
284 } 319 }
285 320
286 } // namespace content 321 } // namespace content
OLDNEW
« no previous file with comments | « content/child/permissions/permission_dispatcher.h ('k') | content/child/permissions/permission_dispatcher_thread_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698