1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2014 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_weak_ref.h"
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_android.h"
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/logging.h"
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezusing base::android::AttachCurrentThread;
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef()
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  : obj_(NULL) {
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    const JavaObjectWeakGlobalRef& orig)
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    : obj_(NULL) {
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  Assign(orig);
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezJavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj)
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    : obj_(env->NewWeakGlobalRef(obj)) {
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  DCHECK(obj_);
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezJavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() {
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  reset();
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) {
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  Assign(rhs);
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid JavaObjectWeakGlobalRef::reset() {
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  if (obj_) {
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    AttachCurrentThread()->DeleteWeakGlobalRef(obj_);
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    obj_ = NULL;
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbase::android::ScopedJavaLocalRef<jobject>
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    JavaObjectWeakGlobalRef::get(JNIEnv* env) const {
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  return GetRealObject(env, obj_);
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbase::android::ScopedJavaLocalRef<jobject> GetRealObject(
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    JNIEnv* env, jweak obj) {
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  jobject real = NULL;
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  if (obj)
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    real = env->NewLocalRef(obj);
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  return base::android::ScopedJavaLocalRef<jobject>(env, real);
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) {
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  if (&other == this)
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return;
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  JNIEnv* env = AttachCurrentThread();
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  if (obj_)
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    env->DeleteWeakGlobalRef(obj_);
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : NULL;
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
65