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