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

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

Issue 2143573002: Implement AwPermissionManager::RequestPermissions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git cl format Created 4 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
« no previous file with comments | « android_webview/browser/aw_permission_manager.h ('k') | no next file » | 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 <string> 7 #include <string>
8 8
9 #include "android_webview/browser/aw_browser_permission_request_delegate.h" 9 #include "android_webview/browser/aw_browser_permission_request_delegate.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
11 #include "base/containers/hash_tables.h" 11 #include "base/containers/hash_tables.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "content/public/browser/permission_type.h" 13 #include "content/public/browser/permission_type.h"
14 #include "content/public/browser/render_frame_host.h" 14 #include "content/public/browser/render_frame_host.h"
15 #include "content/public/browser/render_process_host.h" 15 #include "content/public/browser/render_process_host.h"
16 #include "content/public/browser/web_contents.h" 16 #include "content/public/browser/web_contents.h"
17 17
18 using blink::mojom::PermissionStatus; 18 using blink::mojom::PermissionStatus;
19 using content::PermissionType; 19 using content::PermissionType;
20 20
21 using RequestPermissionsCallback =
22 base::Callback<void(const std::vector<PermissionStatus>&)>;
23
21 namespace android_webview { 24 namespace android_webview {
22 25
26 namespace {
27
28 void PermissionRequestResponseCallbackWrapper(
29 const base::Callback<void(PermissionStatus)>& callback,
30 const std::vector<PermissionStatus>& vector) {
31 DCHECK_EQ(vector.size(), 1ul);
32 callback.Run(vector[0]);
33 }
34
35 } // namespace
36
23 class LastRequestResultCache { 37 class LastRequestResultCache {
24 public: 38 public:
25 LastRequestResultCache() = default; 39 LastRequestResultCache() = default;
26 40
27 void SetResult(PermissionType permission, 41 void SetResult(PermissionType permission,
28 const GURL& requesting_origin, 42 const GURL& requesting_origin,
29 const GURL& embedding_origin, 43 const GURL& embedding_origin,
30 PermissionStatus status) { 44 PermissionStatus status) {
31 DCHECK(status == PermissionStatus::GRANTED || 45 DCHECK(status == PermissionStatus::GRANTED ||
32 status == PermissionStatus::DENIED); 46 status == PermissionStatus::DENIED);
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 return std::string(); 138 return std::string();
125 return requesting + "," + embedding; 139 return requesting + "," + embedding;
126 } 140 }
127 141
128 using StatusMap = base::hash_map<std::string, PermissionStatus>; 142 using StatusMap = base::hash_map<std::string, PermissionStatus>;
129 StatusMap pmi_result_cache_; 143 StatusMap pmi_result_cache_;
130 144
131 DISALLOW_COPY_AND_ASSIGN(LastRequestResultCache); 145 DISALLOW_COPY_AND_ASSIGN(LastRequestResultCache);
132 }; 146 };
133 147
134 struct AwPermissionManager::PendingRequest { 148 class AwPermissionManager::PendingRequest {
135 public: 149 public:
136 PendingRequest(PermissionType permission, 150 PendingRequest(const std::vector<PermissionType> permissions,
137 GURL requesting_origin, 151 GURL requesting_origin,
138 GURL embedding_origin, 152 GURL embedding_origin,
139 content::RenderFrameHost* render_frame_host, 153 content::RenderFrameHost* render_frame_host,
140 const base::Callback<void(PermissionStatus)>& callback) 154 const RequestPermissionsCallback callback)
141 : permission(permission), 155 : permissions(permissions),
142 requesting_origin(requesting_origin), 156 requesting_origin(requesting_origin),
143 embedding_origin(embedding_origin), 157 embedding_origin(embedding_origin),
144 render_process_id(render_frame_host->GetProcess()->GetID()), 158 render_process_id(render_frame_host->GetProcess()->GetID()),
145 render_frame_id(render_frame_host->GetRoutingID()), 159 render_frame_id(render_frame_host->GetRoutingID()),
146 callback(callback) { 160 callback(callback),
147 } 161 results(permissions.size(), PermissionStatus::DENIED),
162 remaining_results_(permissions.size()) {}
148 163
149 ~PendingRequest() = default; 164 ~PendingRequest() = default;
150 165
151 PermissionType permission; 166 void SetPermissionStatus(int index, PermissionStatus status) {
167 DCHECK(!IsComplete());
168
169 results[index] = status;
170 --remaining_results_;
171 }
172
173 void SetPermissionStatus(PermissionType type, PermissionStatus status) {
174 for (size_t i = 0; i < permissions.size(); ++i) {
175 if (permissions[i] == type)
176 SetPermissionStatus(i, status);
177 }
178 }
179
180 bool HasPermissionType(PermissionType type) {
181 for (auto permission : permissions) {
182 if (permission == type)
183 return true;
184 }
185 return false;
186 }
187
188 bool IsComplete() const { return remaining_results_ == 0; }
189
190 std::vector<PermissionType> permissions;
152 GURL requesting_origin; 191 GURL requesting_origin;
153 GURL embedding_origin; 192 GURL embedding_origin;
154 int render_process_id; 193 int render_process_id;
155 int render_frame_id; 194 int render_frame_id;
156 base::Callback<void(PermissionStatus)> callback; 195 RequestPermissionsCallback callback;
196 std::vector<PermissionStatus> results;
197
198 private:
199 size_t remaining_results_;
157 }; 200 };
158 201
159 AwPermissionManager::AwPermissionManager() 202 AwPermissionManager::AwPermissionManager()
160 : content::PermissionManager(), 203 : content::PermissionManager(),
161 result_cache_(new LastRequestResultCache), 204 result_cache_(new LastRequestResultCache),
162 weak_ptr_factory_(this) { 205 weak_ptr_factory_(this) {
163 } 206 }
164 207
165 AwPermissionManager::~AwPermissionManager() { 208 AwPermissionManager::~AwPermissionManager() {
209 std::vector<int> request_ids;
210 for (PendingRequestsMap::Iterator<PendingRequest> it(&pending_requests_);
211 !it.IsAtEnd(); it.Advance()) {
212 request_ids.push_back(it.GetCurrentKey());
213 }
214 for (auto request_id : request_ids) {
215 PendingRequest* request = pending_requests_.Lookup(request_id);
216 if (!request)
217 continue;
218 const RequestPermissionsCallback callback = request->callback;
219 std::vector<PermissionStatus> results = request->results;
220 CancelPermissionRequest(request_id);
221 callback.Run(results);
222 }
223 DCHECK(pending_requests_.IsEmpty());
166 } 224 }
167 225
168 int AwPermissionManager::RequestPermission( 226 int AwPermissionManager::RequestPermission(
169 PermissionType permission, 227 PermissionType permission,
170 content::RenderFrameHost* render_frame_host, 228 content::RenderFrameHost* render_frame_host,
171 const GURL& requesting_origin, 229 const GURL& requesting_origin,
172 bool user_gesture, 230 bool user_gesture,
173 const base::Callback<void(PermissionStatus)>& callback) { 231 const base::Callback<void(PermissionStatus)>& callback) {
174 int render_process_id = render_frame_host->GetProcess()->GetID(); 232 return RequestPermissions(
175 int render_frame_id = render_frame_host->GetRoutingID(); 233 std::vector<PermissionType>(1, permission), render_frame_host,
176 AwBrowserPermissionRequestDelegate* delegate = 234 requesting_origin, user_gesture,
177 AwBrowserPermissionRequestDelegate::FromID(render_process_id, 235 base::Bind(&PermissionRequestResponseCallbackWrapper, callback));
178 render_frame_id);
179 if (!delegate) {
180 DVLOG(0) << "Dropping permission request for "
181 << static_cast<int>(permission);
182 callback.Run(PermissionStatus::DENIED);
183 return kNoPendingOperation;
184 }
185
186 // Do not delegate any requests which are already pending.
187 bool should_delegate_request = true;
188 for (PendingRequestsMap::Iterator<PendingRequest> it(&pending_requests_);
189 !it.IsAtEnd(); it.Advance()) {
190 if (permission == it.GetCurrentValue()->permission) {
191 should_delegate_request = false;
192 break;
193 }
194 }
195
196 const GURL& embedding_origin =
197 content::WebContents::FromRenderFrameHost(render_frame_host)
198 ->GetLastCommittedURL().GetOrigin();
199
200 int request_id = kNoPendingOperation;
201 switch (permission) {
202 case PermissionType::GEOLOCATION:
203 request_id = pending_requests_.Add(new PendingRequest(
204 permission, requesting_origin,
205 embedding_origin, render_frame_host,
206 callback));
207 if (should_delegate_request) {
208 delegate->RequestGeolocationPermission(
209 requesting_origin,
210 base::Bind(&OnRequestResponse,
211 weak_ptr_factory_.GetWeakPtr(), request_id,
212 callback));
213 }
214 break;
215 case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
216 request_id = pending_requests_.Add(new PendingRequest(
217 permission, requesting_origin,
218 embedding_origin, render_frame_host,
219 callback));
220 if (should_delegate_request) {
221 delegate->RequestProtectedMediaIdentifierPermission(
222 requesting_origin,
223 base::Bind(&OnRequestResponse,
224 weak_ptr_factory_.GetWeakPtr(), request_id,
225 callback));
226 }
227 break;
228 case PermissionType::MIDI_SYSEX:
229 request_id = pending_requests_.Add(new PendingRequest(
230 permission, requesting_origin,
231 embedding_origin, render_frame_host,
232 callback));
233 if (should_delegate_request) {
234 delegate->RequestMIDISysexPermission(
235 requesting_origin,
236 base::Bind(&OnRequestResponse,
237 weak_ptr_factory_.GetWeakPtr(), request_id,
238 callback));
239 }
240 break;
241 case PermissionType::AUDIO_CAPTURE:
242 case PermissionType::VIDEO_CAPTURE:
243 case PermissionType::NOTIFICATIONS:
244 case PermissionType::PUSH_MESSAGING:
245 case PermissionType::DURABLE_STORAGE:
246 case PermissionType::BACKGROUND_SYNC:
247 NOTIMPLEMENTED() << "RequestPermission is not implemented for "
248 << static_cast<int>(permission);
249 callback.Run(PermissionStatus::DENIED);
250 break;
251 case PermissionType::MIDI:
252 callback.Run(PermissionStatus::GRANTED);
253 break;
254 case PermissionType::NUM:
255 NOTREACHED() << "PermissionType::NUM was not expected here.";
256 callback.Run(PermissionStatus::DENIED);
257 break;
258 }
259 return request_id;
260 } 236 }
261 237
262 int AwPermissionManager::RequestPermissions( 238 int AwPermissionManager::RequestPermissions(
263 const std::vector<PermissionType>& permissions, 239 const std::vector<PermissionType>& permissions,
264 content::RenderFrameHost* render_frame_host, 240 content::RenderFrameHost* render_frame_host,
265 const GURL& requesting_origin, 241 const GURL& requesting_origin,
266 bool user_gesture, 242 bool user_gesture,
267 const base::Callback<void( 243 const base::Callback<void(const std::vector<PermissionStatus>&)>&
268 const std::vector<PermissionStatus>&)>& callback) { 244 callback) {
269 NOTIMPLEMENTED() << "RequestPermissions has not been implemented in WebView"; 245 if (permissions.empty()) {
246 callback.Run(std::vector<PermissionStatus>());
247 return kNoPendingOperation;
248 }
270 249
271 std::vector<PermissionStatus> result(permissions.size()); 250 int render_process_id = render_frame_host->GetProcess()->GetID();
251 int render_frame_id = render_frame_host->GetRoutingID();
252 AwBrowserPermissionRequestDelegate* delegate =
253 AwBrowserPermissionRequestDelegate::FromID(render_process_id,
254 render_frame_id);
255 if (!delegate) {
256 DVLOG(0) << "Dropping permissions request";
257 callback.Run(std::vector<PermissionStatus>(permissions.size(),
258 PermissionStatus::DENIED));
259 return kNoPendingOperation;
260 }
261
272 const GURL& embedding_origin = 262 const GURL& embedding_origin =
273 content::WebContents::FromRenderFrameHost(render_frame_host) 263 content::WebContents::FromRenderFrameHost(render_frame_host)
274 ->GetLastCommittedURL().GetOrigin(); 264 ->GetLastCommittedURL().GetOrigin();
275 265
276 for (PermissionType type : permissions) { 266 PendingRequest* pending_request =
277 result.push_back(GetPermissionStatus( 267 new PendingRequest(permissions, requesting_origin, embedding_origin,
278 type, requesting_origin, embedding_origin)); 268 render_frame_host, callback);
269 std::vector<bool> should_delegate_requests =
270 std::vector<bool>(permissions.size());
271 for (size_t i = 0; i < permissions.size(); ++i) {
Tobias Sargeant 2016/07/13 11:04:27 I think there's another issue here: Imagine you h
Takashi Toyoshima 2016/07/14 06:42:52 Oh, thank you again. That's the case I overlooked.
272 bool should_delegate_request = true;
273 for (PendingRequestsMap::Iterator<PendingRequest> it(&pending_requests_);
274 !it.IsAtEnd(); it.Advance()) {
275 if (it.GetCurrentValue()->HasPermissionType(permissions[i])) {
276 // TODO(toyoshim): Shall we check to match requesting_origin too?
Takashi Toyoshima 2016/07/14 06:42:52 I would like to revisit this TODO now to understan
Tobias Sargeant 2016/07/14 09:24:29 My feeling is that it's more consistent to check t
Torne 2016/07/14 10:02:38 The Java code does pass the requesting origin up,
Takashi Toyoshima 2016/07/14 12:40:49 OK, let me add requesting_origin check here, and o
277 should_delegate_request = false;
278 break;
279 }
280 }
281 should_delegate_requests[i] = should_delegate_request;
279 } 282 }
280 283
281 callback.Run(result); 284 int request_id = pending_requests_.Add(pending_request);
282 return kNoPendingOperation; 285
286 for (size_t i = 0; i < permissions.size(); ++i) {
287 if (!should_delegate_requests[i])
288 continue;
289
290 switch (permissions[i]) {
291 case PermissionType::GEOLOCATION:
292 delegate->RequestGeolocationPermission(
293 requesting_origin,
294 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(),
295 request_id, i));
296 break;
297 case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
298 delegate->RequestProtectedMediaIdentifierPermission(
299 requesting_origin,
300 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(),
301 request_id, i));
302 break;
303 case PermissionType::MIDI_SYSEX:
304 delegate->RequestMIDISysexPermission(
305 requesting_origin,
306 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(),
307 request_id, i));
308 break;
309 case PermissionType::AUDIO_CAPTURE:
310 case PermissionType::VIDEO_CAPTURE:
311 case PermissionType::NOTIFICATIONS:
312 case PermissionType::PUSH_MESSAGING:
313 case PermissionType::DURABLE_STORAGE:
314 case PermissionType::BACKGROUND_SYNC:
315 NOTIMPLEMENTED() << "RequestPermissions is not implemented for "
316 << static_cast<int>(permissions[i]);
317 pending_request->SetPermissionStatus(i, PermissionStatus::DENIED);
318 break;
319 case PermissionType::MIDI:
320 pending_request->SetPermissionStatus(i, PermissionStatus::GRANTED);
321 break;
322 case PermissionType::NUM:
323 NOTREACHED() << "PermissionType::NUM was not expected here.";
324 pending_request->SetPermissionStatus(i, PermissionStatus::DENIED);
325 break;
326 }
327 }
328
329 // If delegate resolve the permission synchronously, all requests could be
330 // already resolved here.
331 if (!pending_requests_.Lookup(request_id))
332 return kNoPendingOperation;
333
334 // If requests are resolved without calling delegate functions, e.g.
335 // PermissionType::MIDI is permitted within the previous for-loop, all
336 // requests could be already resolved, but still in the |pending_requests_|
337 // without invoking the callback.
338 if (pending_request->IsComplete()) {
339 std::vector<PermissionStatus> results = pending_request->results;
340 pending_requests_.Remove(request_id);
341 callback.Run(results);
342 return kNoPendingOperation;
343 }
344
345 return request_id;
283 } 346 }
284 347
285 // static 348 // static
286 void AwPermissionManager::OnRequestResponse( 349 void AwPermissionManager::OnRequestResponse(
287 const base::WeakPtr<AwPermissionManager>& manager, 350 const base::WeakPtr<AwPermissionManager>& manager,
288 int request_id, 351 int request_id,
289 const base::Callback<void(PermissionStatus)>& callback, 352 int request_index,
290 bool allowed) { 353 bool allowed) {
354 if (!manager.get())
Tobias Sargeant 2016/07/13 11:04:27 Previously the callback would be run even if the m
Takashi Toyoshima 2016/07/14 06:42:52 So, how about changing this check to DCHECK with s
Tobias Sargeant 2016/07/14 09:24:30 Good.
355 return;
356
291 PermissionStatus status = 357 PermissionStatus status =
292 allowed ? PermissionStatus::GRANTED : PermissionStatus::DENIED; 358 allowed ? PermissionStatus::GRANTED : PermissionStatus::DENIED;
293 if (manager.get()) { 359 PendingRequest* pending_request =
294 PendingRequest* pending_request = 360 manager->pending_requests_.Lookup(request_id);
295 manager->pending_requests_.Lookup(request_id); 361 PermissionType permission_type = pending_request->permissions[request_index];
296 362
297 for (PendingRequestsMap::Iterator<PendingRequest> it( 363 manager->result_cache_->SetResult(permission_type,
298 &manager->pending_requests_); 364 pending_request->requesting_origin,
299 !it.IsAtEnd(); it.Advance()) { 365 pending_request->embedding_origin, status);
300 if (pending_request->permission == it.GetCurrentValue()->permission && 366
301 it.GetCurrentKey() != request_id) { 367 std::vector<int> complete_request_ids;
302 it.GetCurrentValue()->callback.Run(status); 368 std::vector<std::pair<const RequestPermissionsCallback,
303 manager->pending_requests_.Remove(it.GetCurrentKey()); 369 std::vector<PermissionStatus>>>
304 } 370 complete_request_pairs;
371 for (PendingRequestsMap::Iterator<PendingRequest> it(
372 &manager->pending_requests_);
373 !it.IsAtEnd(); it.Advance()) {
374 it.GetCurrentValue()->SetPermissionStatus(permission_type, status);
375 if (it.GetCurrentValue()->IsComplete()) {
376 complete_request_ids.push_back(it.GetCurrentKey());
377 complete_request_pairs.push_back(std::make_pair(
378 it.GetCurrentValue()->callback, it.GetCurrentValue()->results));
305 } 379 }
306
307 manager->result_cache_->SetResult(
308 pending_request->permission,
309 pending_request->requesting_origin,
310 pending_request->embedding_origin,
311 status);
312 manager->pending_requests_.Remove(request_id);
313 } 380 }
314 callback.Run(status); 381 for (auto id : complete_request_ids)
382 manager->pending_requests_.Remove(id);
383 for (auto pair : complete_request_pairs)
384 pair.first.Run(pair.second);
315 } 385 }
316 386
317 void AwPermissionManager::CancelPermissionRequest(int request_id) { 387 void AwPermissionManager::CancelPermissionRequest(int request_id) {
318 PendingRequest* pending_request = pending_requests_.Lookup(request_id); 388 PendingRequest* pending_request = pending_requests_.Lookup(request_id);
319 if (!pending_request) 389 if (!pending_request)
320 return; 390 return;
321 391
322 content::RenderFrameHost* render_frame_host =
323 content::RenderFrameHost::FromID(pending_request->render_process_id,
324 pending_request->render_frame_id);
325 content::WebContents* web_contents =
326 content::WebContents::FromRenderFrameHost(render_frame_host);
327 DCHECK(web_contents);
328
329 // The caller is canceling (presumably) the most recent request. Assuming the 392 // The caller is canceling (presumably) the most recent request. Assuming the
330 // request did not complete, the user did not respond to the requset. 393 // request did not complete, the user did not respond to the requset.
331 // Thus, assume we do not know the result. 394 // Thus, assume we do not know the result.
332 const GURL& embedding_origin = web_contents 395 const GURL& embedding_origin = pending_request->embedding_origin;
Tobias Sargeant 2016/07/13 11:04:27 Is the change to how embedding_origin is calculate
Takashi Toyoshima 2016/07/14 06:42:51 The original code calculate the embedding_origin f
Tobias Sargeant 2016/07/14 09:24:30 Good point about the cache.
333 ->GetLastCommittedURL().GetOrigin(); 396 const GURL& requesting_origin = pending_request->requesting_origin;
334 result_cache_->ClearResult( 397 for (auto permission : pending_request->permissions) {
335 pending_request->permission, 398 result_cache_->ClearResult(permission, requesting_origin, embedding_origin);
336 pending_request->requesting_origin, 399 }
337 embedding_origin);
338 400
339 AwBrowserPermissionRequestDelegate* delegate = 401 AwBrowserPermissionRequestDelegate* delegate =
340 AwBrowserPermissionRequestDelegate::FromID( 402 AwBrowserPermissionRequestDelegate::FromID(
341 pending_request->render_process_id, 403 pending_request->render_process_id,
342 pending_request->render_frame_id); 404 pending_request->render_frame_id);
343 if (!delegate) { 405 if (!delegate) {
344 pending_requests_.Remove(request_id); 406 pending_requests_.Remove(request_id);
345 return; 407 return;
346 } 408 }
347 409
348 switch (pending_request->permission) { 410 for (auto permission : pending_request->permissions) {
Tobias Sargeant 2016/07/13 11:04:27 Here, you could end up sending a cancel for a requ
Takashi Toyoshima 2016/07/14 06:42:52 Also I notice another issue. We can call the actu
349 case PermissionType::GEOLOCATION: 411 switch (permission) {
350 delegate->CancelGeolocationPermissionRequests( 412 case PermissionType::GEOLOCATION:
351 pending_request->requesting_origin); 413 delegate->CancelGeolocationPermissionRequests(requesting_origin);
352 break; 414 break;
353 case PermissionType::PROTECTED_MEDIA_IDENTIFIER: 415 case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
354 delegate->CancelProtectedMediaIdentifierPermissionRequests( 416 delegate->CancelProtectedMediaIdentifierPermissionRequests(
355 pending_request->requesting_origin); 417 requesting_origin);
356 break; 418 break;
357 case PermissionType::MIDI_SYSEX: 419 case PermissionType::MIDI_SYSEX:
358 delegate->CancelMIDISysexPermissionRequests( 420 delegate->CancelMIDISysexPermissionRequests(requesting_origin);
359 pending_request->requesting_origin); 421 break;
360 break; 422 case PermissionType::NOTIFICATIONS:
361 case PermissionType::NOTIFICATIONS: 423 case PermissionType::PUSH_MESSAGING:
362 case PermissionType::PUSH_MESSAGING: 424 case PermissionType::DURABLE_STORAGE:
363 case PermissionType::DURABLE_STORAGE: 425 case PermissionType::AUDIO_CAPTURE:
364 case PermissionType::AUDIO_CAPTURE: 426 case PermissionType::VIDEO_CAPTURE:
365 case PermissionType::VIDEO_CAPTURE: 427 case PermissionType::BACKGROUND_SYNC:
366 case PermissionType::BACKGROUND_SYNC: 428 NOTIMPLEMENTED() << "CancelPermission not implemented for "
367 NOTIMPLEMENTED() << "CancelPermission not implemented for " 429 << static_cast<int>(permission);
368 << static_cast<int>(pending_request->permission); 430 break;
369 break; 431 case PermissionType::MIDI:
370 case PermissionType::MIDI: 432 // There is nothing to cancel so this is simply ignored.
371 // There is nothing to cancel so this is simply ignored. 433 break;
372 break; 434 case PermissionType::NUM:
373 case PermissionType::NUM: 435 NOTREACHED() << "PermissionType::NUM was not expected here.";
374 NOTREACHED() << "PermissionType::NUM was not expected here."; 436 break;
375 break; 437 }
376 } 438 }
377
378 pending_requests_.Remove(request_id); 439 pending_requests_.Remove(request_id);
379 } 440 }
380 441
381 void AwPermissionManager::ResetPermission(PermissionType permission, 442 void AwPermissionManager::ResetPermission(PermissionType permission,
382 const GURL& requesting_origin, 443 const GURL& requesting_origin,
383 const GURL& embedding_origin) { 444 const GURL& embedding_origin) {
384 result_cache_->ClearResult(permission, requesting_origin, embedding_origin); 445 result_cache_->ClearResult(permission, requesting_origin, embedding_origin);
385 } 446 }
386 447
387 PermissionStatus AwPermissionManager::GetPermissionStatus( 448 PermissionStatus AwPermissionManager::GetPermissionStatus(
(...skipping 23 matching lines...) Expand all
411 const GURL& embedding_origin, 472 const GURL& embedding_origin,
412 const base::Callback<void(PermissionStatus)>& callback) { 473 const base::Callback<void(PermissionStatus)>& callback) {
413 return kNoPendingOperation; 474 return kNoPendingOperation;
414 } 475 }
415 476
416 void AwPermissionManager::UnsubscribePermissionStatusChange( 477 void AwPermissionManager::UnsubscribePermissionStatusChange(
417 int subscription_id) { 478 int subscription_id) {
418 } 479 }
419 480
420 } // namespace android_webview 481 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/browser/aw_permission_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698