aw_permission_request.cc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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
  3. // found in the LICENSE file.
  4. #include "android_webview/browser/permission/aw_permission_request.h"
  5. #include <utility>
  6. #include "android_webview/browser/permission/aw_permission_request_delegate.h"
  7. #include "android_webview/browser_jni_headers/AwPermissionRequest_jni.h"
  8. #include "base/android/jni_string.h"
  9. using base::android::AttachCurrentThread;
  10. using base::android::ConvertUTF8ToJavaString;
  11. using base::android::JavaParamRef;
  12. using base::android::ScopedJavaLocalRef;
  13. namespace android_webview {
  14. // static
  15. base::android::ScopedJavaLocalRef<jobject> AwPermissionRequest::Create(
  16. std::unique_ptr<AwPermissionRequestDelegate> delegate,
  17. base::WeakPtr<AwPermissionRequest>* weak_ptr) {
  18. base::android::ScopedJavaLocalRef<jobject> java_peer;
  19. AwPermissionRequest* permission_request =
  20. new AwPermissionRequest(std::move(delegate), &java_peer);
  21. *weak_ptr = permission_request->weak_factory_.GetWeakPtr();
  22. return java_peer;
  23. }
  24. AwPermissionRequest::AwPermissionRequest(
  25. std::unique_ptr<AwPermissionRequestDelegate> delegate,
  26. ScopedJavaLocalRef<jobject>* java_peer)
  27. : delegate_(std::move(delegate)), processed_(false) {
  28. DCHECK(delegate_.get());
  29. DCHECK(java_peer);
  30. JNIEnv* env = AttachCurrentThread();
  31. *java_peer = Java_AwPermissionRequest_create(
  32. env, reinterpret_cast<jlong>(this),
  33. ConvertUTF8ToJavaString(env, GetOrigin().spec()), GetResources());
  34. java_ref_ = JavaObjectWeakGlobalRef(env, java_peer->obj());
  35. }
  36. AwPermissionRequest::~AwPermissionRequest() {
  37. OnAcceptInternal(false);
  38. }
  39. void AwPermissionRequest::OnAccept(JNIEnv* env,
  40. const JavaParamRef<jobject>& jcaller,
  41. jboolean accept) {
  42. OnAcceptInternal(accept);
  43. }
  44. void AwPermissionRequest::OnAcceptInternal(bool accept) {
  45. if (!processed_) {
  46. delegate_->NotifyRequestResult(accept);
  47. processed_ = true;
  48. }
  49. }
  50. void AwPermissionRequest::DeleteThis() {
  51. ScopedJavaLocalRef<jobject> j_request = GetJavaObject();
  52. if (!j_request)
  53. return;
  54. Java_AwPermissionRequest_destroyNative(AttachCurrentThread(), j_request);
  55. }
  56. void AwPermissionRequest::Destroy(JNIEnv* env) {
  57. delete this;
  58. }
  59. ScopedJavaLocalRef<jobject> AwPermissionRequest::GetJavaObject() {
  60. return java_ref_.get(AttachCurrentThread());
  61. }
  62. const GURL& AwPermissionRequest::GetOrigin() {
  63. return delegate_->GetOrigin();
  64. }
  65. int64_t AwPermissionRequest::GetResources() {
  66. return delegate_->GetResources();
  67. }
  68. void AwPermissionRequest::CancelAndDelete() {
  69. processed_ = true;
  70. DeleteThis();
  71. }
  72. } // namespace android_webview