Chromium Code Reviews| 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 |