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