blob: 4244fcfcbac0072e25a3f8417c9e14edea9e4b70 [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2014 The Chromium Authors
[email protected]a08029b42012-04-25 03:18:462// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]6a718ab2014-04-23 20:01:205#include "base/android/jni_weak_ref.h"
[email protected]a08029b42012-04-25 03:18:466
tornec6bc15d2016-08-25 15:42:577#include <utility>
8
[email protected]a08029b42012-04-25 03:18:469#include "base/android/jni_android.h"
[email protected]a08029b42012-04-25 03:18:4610
11using base::android::AttachCurrentThread;
12
tornec6bc15d2016-08-25 15:42:5713JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(nullptr) {}
[email protected]ad522952012-09-19 11:08:2614
15JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
[email protected]7d0e0d22013-01-14 22:54:1716 const JavaObjectWeakGlobalRef& orig)
tornec6bc15d2016-08-25 15:42:5717 : obj_(nullptr) {
[email protected]ad522952012-09-19 11:08:2618 Assign(orig);
19}
20
brettwf78cc272017-03-24 16:36:4221JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
22 JavaObjectWeakGlobalRef&& orig) noexcept
tornec6bc15d2016-08-25 15:42:5723 : obj_(orig.obj_) {
24 orig.obj_ = nullptr;
25}
26
[email protected]a08029b42012-04-25 03:18:4627JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj)
28 : obj_(env->NewWeakGlobalRef(obj)) {
[email protected]a08029b42012-04-25 03:18:4629}
30
tornec6bc15d2016-08-25 15:42:5731JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
32 JNIEnv* env,
33 const base::android::JavaRef<jobject>& obj)
34 : obj_(env->NewWeakGlobalRef(obj.obj())) {
tornec6bc15d2016-08-25 15:42:5735}
36
[email protected]a08029b42012-04-25 03:18:4637JavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() {
[email protected]a70cb2322012-08-02 02:59:5738 reset();
39}
40
[email protected]ad522952012-09-19 11:08:2641void JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) {
42 Assign(rhs);
43}
44
tornec6bc15d2016-08-25 15:42:5745void JavaObjectWeakGlobalRef::operator=(JavaObjectWeakGlobalRef&& rhs) {
46 std::swap(obj_, rhs.obj_);
47}
48
[email protected]a70cb2322012-08-02 02:59:5749void JavaObjectWeakGlobalRef::reset() {
50 if (obj_) {
51 AttachCurrentThread()->DeleteWeakGlobalRef(obj_);
tornec6bc15d2016-08-25 15:42:5752 obj_ = nullptr;
[email protected]a70cb2322012-08-02 02:59:5753 }
[email protected]a08029b42012-04-25 03:18:4654}
55
56base::android::ScopedJavaLocalRef<jobject>
57 JavaObjectWeakGlobalRef::get(JNIEnv* env) const {
58 return GetRealObject(env, obj_);
59}
60
61base::android::ScopedJavaLocalRef<jobject> GetRealObject(
[email protected]a70cb2322012-08-02 02:59:5762 JNIEnv* env, jweak obj) {
tornec6bc15d2016-08-25 15:42:5763 jobject real = nullptr;
sievers78e532c2015-12-01 19:54:5164 if (obj)
[email protected]a70cb2322012-08-02 02:59:5765 real = env->NewLocalRef(obj);
[email protected]a08029b42012-04-25 03:18:4666 return base::android::ScopedJavaLocalRef<jobject>(env, real);
67}
[email protected]ad522952012-09-19 11:08:2668
69void JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) {
[email protected]7d0e0d22013-01-14 22:54:1770 if (&other == this)
71 return;
72
[email protected]ad522952012-09-19 11:08:2673 JNIEnv* env = AttachCurrentThread();
[email protected]7d0e0d22013-01-14 22:54:1774 if (obj_)
75 env->DeleteWeakGlobalRef(obj_);
76
tornec6bc15d2016-08-25 15:42:5777 obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : nullptr;
[email protected]ad522952012-09-19 11:08:2678}