OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/native/permission/permission_request_handler.h" | 5 #include "android_webview/native/permission/permission_request_handler.h" |
6 | 6 |
7 #include "android_webview/native/permission/aw_permission_request.h" | 7 #include "android_webview/native/permission/aw_permission_request.h" |
8 #include "android_webview/native/permission/aw_permission_request_delegate.h" | 8 #include "android_webview/native/permission/aw_permission_request_delegate.h" |
9 #include "android_webview/native/permission/permission_request_handler_client.h" | 9 #include "android_webview/native/permission/permission_request_handler_client.h" |
10 #include "base/android/scoped_java_ref.h" | 10 #include "base/android/scoped_java_ref.h" |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 | 12 |
13 using base::android::ScopedJavaLocalRef; | 13 using base::android::ScopedJavaLocalRef; |
14 | 14 |
15 namespace android_webview { | 15 namespace android_webview { |
16 | 16 |
17 PermissionRequestHandler::PermissionRequestHandler( | 17 PermissionRequestHandler::PermissionRequestHandler( |
18 PermissionRequestHandlerClient* client) | 18 PermissionRequestHandlerClient* client) |
19 : client_(client) { | 19 : client_(client) { |
20 } | 20 } |
21 | 21 |
22 PermissionRequestHandler::~PermissionRequestHandler() { | 22 PermissionRequestHandler::~PermissionRequestHandler() { |
23 for (RequestIterator i = requests_.begin(); i != requests_.end(); ++i) | 23 for (RequestIterator i = requests_.begin(); i != requests_.end(); ++i) |
24 CancelRequest(i); | 24 CancelRequest(i); |
25 } | 25 } |
26 | 26 |
27 void PermissionRequestHandler::SendRequest( | 27 void PermissionRequestHandler::SendRequest( |
28 scoped_ptr<AwPermissionRequestDelegate> request) { | 28 scoped_ptr<AwPermissionRequestDelegate> request) { |
| 29 if (Preauthorized(request->GetOrigin(), request->GetResources())) { |
| 30 request->NotifyRequestResult(true); |
| 31 return; |
| 32 } |
| 33 |
29 AwPermissionRequest* aw_request = new AwPermissionRequest(request.Pass()); | 34 AwPermissionRequest* aw_request = new AwPermissionRequest(request.Pass()); |
30 requests_.push_back( | 35 requests_.push_back( |
31 base::WeakPtr<AwPermissionRequest>(aw_request->GetWeakPtr())); | 36 base::WeakPtr<AwPermissionRequest>(aw_request->GetWeakPtr())); |
32 client_->OnPermissionRequest(aw_request); | 37 client_->OnPermissionRequest(aw_request); |
33 PruneRequests(); | 38 PruneRequests(); |
34 } | 39 } |
35 | 40 |
36 void PermissionRequestHandler::CancelRequest(const GURL& origin, | 41 void PermissionRequestHandler::CancelRequest(const GURL& origin, |
37 int64 resources) { | 42 int64 resources) { |
38 // The request list might have multiple requests with same origin and | 43 // The request list might have multiple requests with same origin and |
39 // resources. | 44 // resources. |
40 RequestIterator i = FindRequest(origin, resources); | 45 RequestIterator i = FindRequest(origin, resources); |
41 while (i != requests_.end()) { | 46 while (i != requests_.end()) { |
42 CancelRequest(i); | 47 CancelRequest(i); |
43 requests_.erase(i); | 48 requests_.erase(i); |
44 i = FindRequest(origin, resources); | 49 i = FindRequest(origin, resources); |
45 } | 50 } |
46 } | 51 } |
47 | 52 |
| 53 void PermissionRequestHandler::PreauthorizePermission(const GURL& origin, |
| 54 int64 resources) { |
| 55 if (!resources) |
| 56 return; |
| 57 |
| 58 std::string key = origin.GetOrigin().spec(); |
| 59 if (key.empty()) { |
| 60 LOG(ERROR) << "The origin of preauthorization is empty, ignore it."; |
| 61 return; |
| 62 } |
| 63 |
| 64 preauthorized_permission_[key] |= resources; |
| 65 } |
| 66 |
48 PermissionRequestHandler::RequestIterator | 67 PermissionRequestHandler::RequestIterator |
49 PermissionRequestHandler::FindRequest(const GURL& origin, | 68 PermissionRequestHandler::FindRequest(const GURL& origin, |
50 int64 resources) { | 69 int64 resources) { |
51 RequestIterator i; | 70 RequestIterator i; |
52 for (i = requests_.begin(); i != requests_.end(); ++i) { | 71 for (i = requests_.begin(); i != requests_.end(); ++i) { |
53 if (i->get() && i->get()->GetOrigin() == origin && | 72 if (i->get() && i->get()->GetOrigin() == origin && |
54 i->get()->GetResources() == resources) { | 73 i->get()->GetResources() == resources) { |
55 break; | 74 break; |
56 } | 75 } |
57 } | 76 } |
(...skipping 12 matching lines...) Expand all Loading... |
70 | 89 |
71 void PermissionRequestHandler::PruneRequests() { | 90 void PermissionRequestHandler::PruneRequests() { |
72 for (RequestIterator i = requests_.begin(); i != requests_.end();) { | 91 for (RequestIterator i = requests_.begin(); i != requests_.end();) { |
73 if (!i->get()) | 92 if (!i->get()) |
74 i = requests_.erase(i); | 93 i = requests_.erase(i); |
75 else | 94 else |
76 ++i; | 95 ++i; |
77 } | 96 } |
78 } | 97 } |
79 | 98 |
| 99 bool PermissionRequestHandler::Preauthorized(const GURL& origin, |
| 100 int64 resources) { |
| 101 std::map<std::string, int64>::iterator i = |
| 102 preauthorized_permission_.find(origin.GetOrigin().spec()); |
| 103 |
| 104 return i != preauthorized_permission_.end() && |
| 105 (resources & i->second) == resources; |
| 106 } |
| 107 |
80 } // namespace android_webivew | 108 } // namespace android_webivew |
OLD | NEW |