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

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: 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 {
Tobias Sargeant 2016/07/12 12:43:23 I understand the desire to clean up, but this clas
Takashi Toyoshima 2016/07/13 06:00:10 My intention was to minimize difference between th
135 public: 149 public:
136 PendingRequest(PermissionType permission, 150 PendingRequest(content::RenderFrameHost* render_frame_host,
151 const std::vector<PermissionType> permissions,
137 GURL requesting_origin, 152 GURL requesting_origin,
138 GURL embedding_origin, 153 GURL embedding_origin,
139 content::RenderFrameHost* render_frame_host, 154 const RequestPermissionsCallback callback)
140 const base::Callback<void(PermissionStatus)>& callback) 155 : render_process_id_(render_frame_host->GetProcess()->GetID()),
141 : permission(permission), 156 render_frame_id_(render_frame_host->GetRoutingID()),
142 requesting_origin(requesting_origin), 157 callback_(callback),
143 embedding_origin(embedding_origin), 158 permissions_(permissions),
144 render_process_id(render_frame_host->GetProcess()->GetID()), 159 results_(permissions.size(), PermissionStatus::DENIED),
145 render_frame_id(render_frame_host->GetRoutingID()), 160 remaining_results_(permissions.size()),
146 callback(callback) { 161 requesting_origin_(requesting_origin),
147 } 162 embedding_origin_(embedding_origin) {}
148 163
149 ~PendingRequest() = default; 164 ~PendingRequest() = default;
150 165
151 PermissionType permission; 166 void SetPermissionStatus(int index, PermissionStatus status) {
152 GURL requesting_origin; 167 DCHECK(!IsComplete());
153 GURL embedding_origin; 168
154 int render_process_id; 169 results_[index] = status;
155 int render_frame_id; 170 --remaining_results_;
156 base::Callback<void(PermissionStatus)> callback; 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 results_[i] = status;
Tobias Sargeant 2016/07/12 12:43:23 Call SetPermissionStatus(i, status) here.
Takashi Toyoshima 2016/07/13 06:00:10 Done.
177 --remaining_results_;
178 }
179 }
180 }
181
182 bool HasPermissionType(PermissionType type) {
183 for (auto permission : permissions_) {
184 if (permission == type)
185 return true;
186 }
187 return false;
188 }
189
190 bool IsComplete() const {
191 return remaining_results_ == 0;
192 }
193
194 int render_process_id() const { return render_process_id_; }
195 int render_frame_id() const { return render_frame_id_; }
196
197 const RequestPermissionsCallback callback() const { return callback_; }
198
199 std::vector<PermissionType> permissions() const {
200 return permissions_;
201 }
202
203 std::vector<PermissionStatus> results() const {
204 return results_;
205 }
206
207 const GURL& requesting_origin() const {
208 return requesting_origin_;
209 }
210
211 const GURL& embedding_origin() const {
212 return embedding_origin_;
213 }
214
215 private:
216 int render_process_id_;
217 int render_frame_id_;
218 RequestPermissionsCallback callback_;
219 std::vector<PermissionType> permissions_;
220 std::vector<PermissionStatus> results_;
221 size_t remaining_results_;
222 GURL requesting_origin_;
223 GURL embedding_origin_;
157 }; 224 };
158 225
159 AwPermissionManager::AwPermissionManager() 226 AwPermissionManager::AwPermissionManager()
160 : content::PermissionManager(), 227 : content::PermissionManager(),
161 result_cache_(new LastRequestResultCache), 228 result_cache_(new LastRequestResultCache),
162 weak_ptr_factory_(this) { 229 weak_ptr_factory_(this) {
163 } 230 }
164 231
165 AwPermissionManager::~AwPermissionManager() { 232 AwPermissionManager::~AwPermissionManager() {
233 for (PendingRequestsMap::Iterator<PendingRequest> it(&pending_requests_);
Takashi Toyoshima 2016/07/13 06:00:11 Should I call CancelPermissionRequest too?
234 !it.IsAtEnd(); it.Advance()) {
235 it.GetCurrentValue()->callback().Run(it.GetCurrentValue()->results());
236 }
166 } 237 }
167 238
168 int AwPermissionManager::RequestPermission( 239 int AwPermissionManager::RequestPermission(
169 PermissionType permission, 240 PermissionType permission,
170 content::RenderFrameHost* render_frame_host, 241 content::RenderFrameHost* render_frame_host,
171 const GURL& requesting_origin, 242 const GURL& requesting_origin,
172 bool user_gesture, 243 bool user_gesture,
173 const base::Callback<void(PermissionStatus)>& callback) { 244 const base::Callback<void(PermissionStatus)>& callback) {
174 int render_process_id = render_frame_host->GetProcess()->GetID(); 245 return RequestPermissions(
175 int render_frame_id = render_frame_host->GetRoutingID(); 246 std::vector<PermissionType>(1, permission),
176 AwBrowserPermissionRequestDelegate* delegate = 247 render_frame_host,
177 AwBrowserPermissionRequestDelegate::FromID(render_process_id, 248 requesting_origin,
178 render_frame_id); 249 user_gesture,
179 if (!delegate) { 250 base::Bind(&PermissionRequestResponseCallbackWrapper, callback));
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 } 251 }
261 252
262 int AwPermissionManager::RequestPermissions( 253 int AwPermissionManager::RequestPermissions(
263 const std::vector<PermissionType>& permissions, 254 const std::vector<PermissionType>& permissions,
264 content::RenderFrameHost* render_frame_host, 255 content::RenderFrameHost* render_frame_host,
265 const GURL& requesting_origin, 256 const GURL& requesting_origin,
266 bool user_gesture, 257 bool user_gesture,
267 const base::Callback<void( 258 const base::Callback<void(
268 const std::vector<PermissionStatus>&)>& callback) { 259 const std::vector<PermissionStatus>&)>& callback) {
269 NOTIMPLEMENTED() << "RequestPermissions has not been implemented in WebView"; 260 if (permissions.empty()) {
261 callback.Run(std::vector<PermissionStatus>());
262 return kNoPendingOperation;
263 }
270 264
271 std::vector<PermissionStatus> result(permissions.size()); 265 int render_process_id = render_frame_host->GetProcess()->GetID();
266 int render_frame_id = render_frame_host->GetRoutingID();
267 AwBrowserPermissionRequestDelegate* delegate =
268 AwBrowserPermissionRequestDelegate::FromID(render_process_id,
269 render_frame_id);
270 if (!delegate) {
271 DVLOG(0) << "Dropping permissions request";
272 callback.Run(std::vector<PermissionStatus>(
273 permissions.size(), PermissionStatus::DENIED));
274 return kNoPendingOperation;
275 }
276
272 const GURL& embedding_origin = 277 const GURL& embedding_origin =
273 content::WebContents::FromRenderFrameHost(render_frame_host) 278 content::WebContents::FromRenderFrameHost(render_frame_host)
274 ->GetLastCommittedURL().GetOrigin(); 279 ->GetLastCommittedURL().GetOrigin();
275 280
276 for (PermissionType type : permissions) { 281 PendingRequest* pending_request = new PendingRequest(
277 result.push_back(GetPermissionStatus( 282 render_frame_host,
278 type, requesting_origin, embedding_origin)); 283 permissions,
284 requesting_origin,
285 embedding_origin,
286 callback);
287 std::vector<bool> should_delegate_requests =
288 std::vector<bool>(permissions.size());
289 for (size_t i = 0; i < permissions.size(); ++i) {
290 bool should_delegate_request = true;
291 for (PendingRequestsMap::Iterator<PendingRequest> it(&pending_requests_);
292 !it.IsAtEnd(); it.Advance()) {
293 if (it.GetCurrentValue()->HasPermissionType(permissions[i])) {
294 // TODO(toyoshim): Shall we check to match requesting_origin too?
295 should_delegate_request = false;
296 break;
297 }
298 }
299 should_delegate_requests[i] = should_delegate_request;
279 } 300 }
280 301
281 callback.Run(result); 302 int request_id = pending_requests_.Add(pending_request);
282 return kNoPendingOperation; 303
304 for (size_t i = 0; i < permissions.size(); ++i) {
305 if (!should_delegate_requests[i])
306 continue;
307
308 switch (permissions[i]) {
309 case PermissionType::GEOLOCATION:
310 delegate->RequestGeolocationPermission(
311 requesting_origin,
312 base::Bind(&OnRequestResponse,
313 weak_ptr_factory_.GetWeakPtr(), request_id, i));
314 break;
315 case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
316 delegate->RequestProtectedMediaIdentifierPermission(
317 requesting_origin,
318 base::Bind(&OnRequestResponse,
319 weak_ptr_factory_.GetWeakPtr(), request_id, i));
320 break;
321 case PermissionType::MIDI_SYSEX:
322 delegate->RequestMIDISysexPermission(
323 requesting_origin,
324 base::Bind(&OnRequestResponse,
325 weak_ptr_factory_.GetWeakPtr(), request_id, i));
326 break;
327 case PermissionType::AUDIO_CAPTURE:
328 case PermissionType::VIDEO_CAPTURE:
329 case PermissionType::NOTIFICATIONS:
330 case PermissionType::PUSH_MESSAGING:
331 case PermissionType::DURABLE_STORAGE:
332 case PermissionType::BACKGROUND_SYNC:
Tobias Sargeant 2016/07/12 12:43:23 After your change, |callback| will not be called u
Takashi Toyoshima 2016/07/13 06:00:10 Thank you for catching this bug. request_id is ne
333 NOTIMPLEMENTED() << "RequestPermissions is not implemented for "
334 << static_cast<int>(permissions[i]);
335 pending_request->SetPermissionStatus(i, PermissionStatus::DENIED);
336 break;
337 case PermissionType::MIDI:
338 pending_request->SetPermissionStatus(i, PermissionStatus::GRANTED);
339 break;
340 case PermissionType::NUM:
341 NOTREACHED() << "PermissionType::NUM was not expected here.";
342 pending_request->SetPermissionStatus(i, PermissionStatus::DENIED);
343 break;
344 }
345 }
346 return request_id;
283 } 347 }
284 348
285 // static 349 // static
286 void AwPermissionManager::OnRequestResponse( 350 void AwPermissionManager::OnRequestResponse(
287 const base::WeakPtr<AwPermissionManager>& manager, 351 const base::WeakPtr<AwPermissionManager>& manager,
288 int request_id, 352 int request_id,
289 const base::Callback<void(PermissionStatus)>& callback, 353 int request_index,
290 bool allowed) { 354 bool allowed) {
355 if (!manager.get())
356 return;
357
291 PermissionStatus status = 358 PermissionStatus status =
292 allowed ? PermissionStatus::GRANTED : PermissionStatus::DENIED; 359 allowed ? PermissionStatus::GRANTED : PermissionStatus::DENIED;
293 if (manager.get()) { 360 PendingRequest* pending_request =
294 PendingRequest* pending_request = 361 manager->pending_requests_.Lookup(request_id);
295 manager->pending_requests_.Lookup(request_id); 362 PermissionType permission_type =
363 pending_request->permissions()[request_index];
296 364
297 for (PendingRequestsMap::Iterator<PendingRequest> it( 365 manager->result_cache_->SetResult(
298 &manager->pending_requests_); 366 permission_type,
299 !it.IsAtEnd(); it.Advance()) { 367 pending_request->requesting_origin(),
300 if (pending_request->permission == it.GetCurrentValue()->permission && 368 pending_request->embedding_origin(),
301 it.GetCurrentKey() != request_id) { 369 status);
302 it.GetCurrentValue()->callback.Run(status); 370
303 manager->pending_requests_.Remove(it.GetCurrentKey()); 371 std::vector<int> complete_request_ids;
304 } 372 std::vector<std::pair<const RequestPermissionsCallback,
373 std::vector<PermissionStatus>>> complete_request_pairs;
374 for (PendingRequestsMap::Iterator<PendingRequest> it(
375 &manager->pending_requests_);
376 !it.IsAtEnd(); it.Advance()) {
377 it.GetCurrentValue()->SetPermissionStatus(permission_type, status);
378 if (it.GetCurrentValue()->IsComplete()) {
379 complete_request_ids.push_back(it.GetCurrentKey());
380 complete_request_pairs.push_back(
381 std::make_pair(it.GetCurrentValue()->callback(),
382 it.GetCurrentValue()->results()));
305 } 383 }
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 } 384 }
314 callback.Run(status); 385 for (auto id : complete_request_ids)
386 manager->pending_requests_.Remove(id);
387 for (auto pair : complete_request_pairs)
388 pair.first.Run(pair.second);
315 } 389 }
316 390
317 void AwPermissionManager::CancelPermissionRequest(int request_id) { 391 void AwPermissionManager::CancelPermissionRequest(int request_id) {
318 PendingRequest* pending_request = pending_requests_.Lookup(request_id); 392 PendingRequest* pending_request = pending_requests_.Lookup(request_id);
319 if (!pending_request) 393 if (!pending_request)
320 return; 394 return;
321 395
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 396 // The caller is canceling (presumably) the most recent request. Assuming the
330 // request did not complete, the user did not respond to the requset. 397 // request did not complete, the user did not respond to the requset.
331 // Thus, assume we do not know the result. 398 // Thus, assume we do not know the result.
332 const GURL& embedding_origin = web_contents 399 const GURL& embedding_origin = pending_request->embedding_origin();
333 ->GetLastCommittedURL().GetOrigin(); 400 const GURL& requesting_origin = pending_request->requesting_origin();
334 result_cache_->ClearResult( 401 for (auto permission : pending_request->permissions()) {
335 pending_request->permission, 402 result_cache_->ClearResult(
336 pending_request->requesting_origin, 403 permission,
337 embedding_origin); 404 requesting_origin,
405 embedding_origin);
406 }
338 407
339 AwBrowserPermissionRequestDelegate* delegate = 408 AwBrowserPermissionRequestDelegate* delegate =
340 AwBrowserPermissionRequestDelegate::FromID( 409 AwBrowserPermissionRequestDelegate::FromID(
341 pending_request->render_process_id, 410 pending_request->render_process_id(),
342 pending_request->render_frame_id); 411 pending_request->render_frame_id());
343 if (!delegate) { 412 if (!delegate) {
344 pending_requests_.Remove(request_id); 413 pending_requests_.Remove(request_id);
345 return; 414 return;
346 } 415 }
347 416
348 switch (pending_request->permission) { 417 for (auto permission : pending_request->permissions()) {
349 case PermissionType::GEOLOCATION: 418 switch (permission) {
350 delegate->CancelGeolocationPermissionRequests( 419 case PermissionType::GEOLOCATION:
351 pending_request->requesting_origin); 420 delegate->CancelGeolocationPermissionRequests(
352 break; 421 requesting_origin);
353 case PermissionType::PROTECTED_MEDIA_IDENTIFIER: 422 break;
354 delegate->CancelProtectedMediaIdentifierPermissionRequests( 423 case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
355 pending_request->requesting_origin); 424 delegate->CancelProtectedMediaIdentifierPermissionRequests(
356 break; 425 requesting_origin);
357 case PermissionType::MIDI_SYSEX: 426 break;
358 delegate->CancelMIDISysexPermissionRequests( 427 case PermissionType::MIDI_SYSEX:
359 pending_request->requesting_origin); 428 delegate->CancelMIDISysexPermissionRequests(
360 break; 429 requesting_origin);
361 case PermissionType::NOTIFICATIONS: 430 break;
362 case PermissionType::PUSH_MESSAGING: 431 case PermissionType::NOTIFICATIONS:
363 case PermissionType::DURABLE_STORAGE: 432 case PermissionType::PUSH_MESSAGING:
364 case PermissionType::AUDIO_CAPTURE: 433 case PermissionType::DURABLE_STORAGE:
365 case PermissionType::VIDEO_CAPTURE: 434 case PermissionType::AUDIO_CAPTURE:
366 case PermissionType::BACKGROUND_SYNC: 435 case PermissionType::VIDEO_CAPTURE:
367 NOTIMPLEMENTED() << "CancelPermission not implemented for " 436 case PermissionType::BACKGROUND_SYNC:
368 << static_cast<int>(pending_request->permission); 437 NOTIMPLEMENTED() << "CancelPermission not implemented for "
369 break; 438 << static_cast<int>(permission);
370 case PermissionType::MIDI: 439 break;
371 // There is nothing to cancel so this is simply ignored. 440 case PermissionType::MIDI:
372 break; 441 // There is nothing to cancel so this is simply ignored.
373 case PermissionType::NUM: 442 break;
374 NOTREACHED() << "PermissionType::NUM was not expected here."; 443 case PermissionType::NUM:
375 break; 444 NOTREACHED() << "PermissionType::NUM was not expected here.";
445 break;
446 }
447 pending_requests_.Remove(request_id);
Tobias Sargeant 2016/07/12 12:43:23 Should this call be outside the loop?
Takashi Toyoshima 2016/07/13 06:00:10 Right. Thank you for catching this bug too.
376 } 448 }
377
378 pending_requests_.Remove(request_id);
379 } 449 }
380 450
381 void AwPermissionManager::ResetPermission(PermissionType permission, 451 void AwPermissionManager::ResetPermission(PermissionType permission,
382 const GURL& requesting_origin, 452 const GURL& requesting_origin,
383 const GURL& embedding_origin) { 453 const GURL& embedding_origin) {
384 result_cache_->ClearResult(permission, requesting_origin, embedding_origin); 454 result_cache_->ClearResult(permission, requesting_origin, embedding_origin);
385 } 455 }
386 456
387 PermissionStatus AwPermissionManager::GetPermissionStatus( 457 PermissionStatus AwPermissionManager::GetPermissionStatus(
388 PermissionType permission, 458 PermissionType permission,
(...skipping 22 matching lines...) Expand all
411 const GURL& embedding_origin, 481 const GURL& embedding_origin,
412 const base::Callback<void(PermissionStatus)>& callback) { 482 const base::Callback<void(PermissionStatus)>& callback) {
413 return kNoPendingOperation; 483 return kNoPendingOperation;
414 } 484 }
415 485
416 void AwPermissionManager::UnsubscribePermissionStatusChange( 486 void AwPermissionManager::UnsubscribePermissionStatusChange(
417 int subscription_id) { 487 int subscription_id) {
418 } 488 }
419 489
420 } // namespace android_webview 490 } // 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