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 } | |
michaelbai
2014/05/06 23:09:50
Note, the all resources will passed to permission
| |
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()) | |
mkosiba (inactive)
2014/05/07 17:25:50
ok, so if we get here the user managed to create a
michaelbai
2014/05/07 19:22:25
Done.
| |
60 return; | |
61 | |
62 preauthorized_permission_[key] |= resources; | |
benm (inactive)
2014/05/07 17:01:21
I think you need to initialise this mapped value i
michaelbai
2014/05/07 19:22:25
In this case, the default value is 0, we can use i
| |
63 } | |
64 | |
48 PermissionRequestHandler::RequestIterator | 65 PermissionRequestHandler::RequestIterator |
49 PermissionRequestHandler::FindRequest(const GURL& origin, | 66 PermissionRequestHandler::FindRequest(const GURL& origin, |
50 int64 resources) { | 67 int64 resources) { |
51 RequestIterator i; | 68 RequestIterator i; |
52 for (i = requests_.begin(); i != requests_.end(); ++i) { | 69 for (i = requests_.begin(); i != requests_.end(); ++i) { |
53 if (i->get() && i->get()->GetOrigin() == origin && | 70 if (i->get() && i->get()->GetOrigin() == origin && |
54 i->get()->GetResources() == resources) { | 71 i->get()->GetResources() == resources) { |
55 break; | 72 break; |
56 } | 73 } |
57 } | 74 } |
(...skipping 12 matching lines...) Expand all Loading... | |
70 | 87 |
71 void PermissionRequestHandler::PruneRequests() { | 88 void PermissionRequestHandler::PruneRequests() { |
72 for (RequestIterator i = requests_.begin(); i != requests_.end();) { | 89 for (RequestIterator i = requests_.begin(); i != requests_.end();) { |
73 if (!i->get()) | 90 if (!i->get()) |
74 i = requests_.erase(i); | 91 i = requests_.erase(i); |
75 else | 92 else |
76 ++i; | 93 ++i; |
77 } | 94 } |
78 } | 95 } |
79 | 96 |
97 bool PermissionRequestHandler::Preauthorized(const GURL& origin, | |
98 int64 resources) { | |
99 std::map<std::string, int64>::iterator i = | |
100 preauthorized_permission_.find(origin.GetOrigin().spec()); | |
mkosiba (inactive)
2014/05/07 17:25:50
I'm paranoid so I'd suggest doing the same thing y
michaelbai
2014/05/07 19:22:25
I would like to make you happy, but I need to chec
| |
101 return (resources & i->second) == resources; | |
mkosiba (inactive)
2014/05/07 17:25:50
what if we don't find the origin in the map? you'l
michaelbai
2014/05/07 19:22:25
Oops, I were checking it there, it was removed wit
| |
102 } | |
103 | |
80 } // namespace android_webivew | 104 } // namespace android_webivew |
OLD | NEW |