Avi Drissman | e4622aa | 2022-09-08 20:36:06 | [diff] [blame] | 1 | // Copyright 2014 The Chromium Authors |
[email protected] | a08029b4 | 2012-04-25 03:18:46 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. | ||||
4 | |||||
[email protected] | 6a718ab | 2014-04-23 20:01:20 | [diff] [blame] | 5 | #include "base/android/jni_weak_ref.h" |
[email protected] | a08029b4 | 2012-04-25 03:18:46 | [diff] [blame] | 6 | |
torne | c6bc15d | 2016-08-25 15:42:57 | [diff] [blame] | 7 | #include <utility> |
8 | |||||
[email protected] | a08029b4 | 2012-04-25 03:18:46 | [diff] [blame] | 9 | #include "base/android/jni_android.h" |
[email protected] | a08029b4 | 2012-04-25 03:18:46 | [diff] [blame] | 10 | |
11 | using base::android::AttachCurrentThread; | ||||
12 | |||||
torne | c6bc15d | 2016-08-25 15:42:57 | [diff] [blame] | 13 | JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(nullptr) {} |
[email protected] | ad52295 | 2012-09-19 11:08:26 | [diff] [blame] | 14 | |
15 | JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef( | ||||
[email protected] | 7d0e0d2 | 2013-01-14 22:54:17 | [diff] [blame] | 16 | const JavaObjectWeakGlobalRef& orig) |
torne | c6bc15d | 2016-08-25 15:42:57 | [diff] [blame] | 17 | : obj_(nullptr) { |
[email protected] | ad52295 | 2012-09-19 11:08:26 | [diff] [blame] | 18 | Assign(orig); |
19 | } | ||||
20 | |||||
brettw | f78cc27 | 2017-03-24 16:36:42 | [diff] [blame] | 21 | JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef( |
22 | JavaObjectWeakGlobalRef&& orig) noexcept | ||||
torne | c6bc15d | 2016-08-25 15:42:57 | [diff] [blame] | 23 | : obj_(orig.obj_) { |
24 | orig.obj_ = nullptr; | ||||
25 | } | ||||
26 | |||||
[email protected] | a08029b4 | 2012-04-25 03:18:46 | [diff] [blame] | 27 | JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj) |
28 | : obj_(env->NewWeakGlobalRef(obj)) { | ||||
[email protected] | a08029b4 | 2012-04-25 03:18:46 | [diff] [blame] | 29 | } |
30 | |||||
torne | c6bc15d | 2016-08-25 15:42:57 | [diff] [blame] | 31 | JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef( |
32 | JNIEnv* env, | ||||
33 | const base::android::JavaRef<jobject>& obj) | ||||
34 | : obj_(env->NewWeakGlobalRef(obj.obj())) { | ||||
torne | c6bc15d | 2016-08-25 15:42:57 | [diff] [blame] | 35 | } |
36 | |||||
[email protected] | a08029b4 | 2012-04-25 03:18:46 | [diff] [blame] | 37 | JavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() { |
[email protected] | a70cb232 | 2012-08-02 02:59:57 | [diff] [blame] | 38 | reset(); |
39 | } | ||||
40 | |||||
[email protected] | ad52295 | 2012-09-19 11:08:26 | [diff] [blame] | 41 | void JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) { |
42 | Assign(rhs); | ||||
43 | } | ||||
44 | |||||
torne | c6bc15d | 2016-08-25 15:42:57 | [diff] [blame] | 45 | void JavaObjectWeakGlobalRef::operator=(JavaObjectWeakGlobalRef&& rhs) { |
46 | std::swap(obj_, rhs.obj_); | ||||
47 | } | ||||
48 | |||||
[email protected] | a70cb232 | 2012-08-02 02:59:57 | [diff] [blame] | 49 | void JavaObjectWeakGlobalRef::reset() { |
50 | if (obj_) { | ||||
51 | AttachCurrentThread()->DeleteWeakGlobalRef(obj_); | ||||
torne | c6bc15d | 2016-08-25 15:42:57 | [diff] [blame] | 52 | obj_ = nullptr; |
[email protected] | a70cb232 | 2012-08-02 02:59:57 | [diff] [blame] | 53 | } |
[email protected] | a08029b4 | 2012-04-25 03:18:46 | [diff] [blame] | 54 | } |
55 | |||||
56 | base::android::ScopedJavaLocalRef<jobject> | ||||
57 | JavaObjectWeakGlobalRef::get(JNIEnv* env) const { | ||||
58 | return GetRealObject(env, obj_); | ||||
59 | } | ||||
60 | |||||
61 | base::android::ScopedJavaLocalRef<jobject> GetRealObject( | ||||
[email protected] | a70cb232 | 2012-08-02 02:59:57 | [diff] [blame] | 62 | JNIEnv* env, jweak obj) { |
torne | c6bc15d | 2016-08-25 15:42:57 | [diff] [blame] | 63 | jobject real = nullptr; |
sievers | 78e532c | 2015-12-01 19:54:51 | [diff] [blame] | 64 | if (obj) |
[email protected] | a70cb232 | 2012-08-02 02:59:57 | [diff] [blame] | 65 | real = env->NewLocalRef(obj); |
[email protected] | a08029b4 | 2012-04-25 03:18:46 | [diff] [blame] | 66 | return base::android::ScopedJavaLocalRef<jobject>(env, real); |
67 | } | ||||
[email protected] | ad52295 | 2012-09-19 11:08:26 | [diff] [blame] | 68 | |
69 | void JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) { | ||||
[email protected] | 7d0e0d2 | 2013-01-14 22:54:17 | [diff] [blame] | 70 | if (&other == this) |
71 | return; | ||||
72 | |||||
[email protected] | ad52295 | 2012-09-19 11:08:26 | [diff] [blame] | 73 | JNIEnv* env = AttachCurrentThread(); |
[email protected] | 7d0e0d2 | 2013-01-14 22:54:17 | [diff] [blame] | 74 | if (obj_) |
75 | env->DeleteWeakGlobalRef(obj_); | ||||
76 | |||||
torne | c6bc15d | 2016-08-25 15:42:57 | [diff] [blame] | 77 | obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : nullptr; |
[email protected] | ad52295 | 2012-09-19 11:08:26 | [diff] [blame] | 78 | } |