Index: android_webview/native/permission/permission_request_handler.cc |
diff --git a/android_webview/native/permission/permission_request_handler.cc b/android_webview/native/permission/permission_request_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cf2aae56f5111b40bde48c15d81946b1ddeddee9 |
--- /dev/null |
+++ b/android_webview/native/permission/permission_request_handler.cc |
@@ -0,0 +1,72 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "android_webview/native/permission/permission_request_handler.h" |
+ |
+#include "base/android/scoped_java_ref.h" |
+#include "base/bind.h" |
+ |
+using base::android::ScopedJavaLocalRef; |
+ |
+namespace android_webview { |
+ |
+PermissionRequestHandler::PermissionRequestHandler( |
+ PermissionRequestHandlerClient* client) |
+ : client_(client) { |
+} |
+ |
+PermissionRequestHandler::~PermissionRequestHandler() { |
+ for (RequestIterator i = requests_.begin(); i != requests_.end(); ++i) |
+ CancelRequest(i); |
+} |
+ |
+void PermissionRequestHandler::SendRequest( |
+ const scoped_refptr<AwPermissionRequest>& request) { |
+ ScopedJavaLocalRef<jobject> java_ref = request->CreateJavaPeer( |
+ base::Bind(&PermissionRequestHandler::NotifyRequestProcessed, |
+ base::Unretained(this))); |
+ if (!java_ref.is_null()) { |
+ requests_.push_back(request); |
+ client_->OnPermissionRequest(request); |
+ } |
+} |
+ |
+void PermissionRequestHandler::CancelRequest(const GURL& origin, |
+ int64 resources) { |
+ // The request list might have multiple requests with same origin and |
+ // resources. |
+ RequestIterator i = FindRequest(origin, resources); |
+ while (i != requests_.end()) { |
+ CancelRequest(i); |
+ requests_.erase(i); |
+ i = FindRequest(origin, resources); |
+ } |
+} |
+ |
+void PermissionRequestHandler::NotifyRequestProcessed( |
+ scoped_refptr<AwPermissionRequest> request) { |
+ RequestIterator i = |
+ FindRequest(request->GetOrigin(), request->GetResources()); |
+ if (i != requests_.end()) |
+ requests_.erase(i); |
+} |
+ |
+PermissionRequestHandler::RequestIterator |
+PermissionRequestHandler::FindRequest(const GURL& origin, |
+ int64 resources) { |
+ RequestIterator i; |
+ for (i = requests_.begin(); i != requests_.end(); ++i) { |
+ if (i->get()->GetOrigin() == origin && |
+ i->get()->GetResources() == resources) { |
+ break; |
+ } |
+ } |
+ return i; |
+} |
+ |
+void PermissionRequestHandler::CancelRequest(RequestIterator i) { |
+ client_->OnPermissionRequestCanceled(*i); |
+} |
+ |
+} // namespace android_webivew |