Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(469)

Side by Side Diff: components/gcm_driver/instance_id/instance_id_android.cc

Issue 1899753002: Make InstanceIDBridge fully async to fix strict mode violations (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@iid3test
Patch Set: Rebase & tweak lifetime comments Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/gcm_driver/instance_id/instance_id_android.h" 5 #include "components/gcm_driver/instance_id/instance_id_android.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 InstanceIDAndroid::~InstanceIDAndroid() { 70 InstanceIDAndroid::~InstanceIDAndroid() {
71 DCHECK(thread_checker_.CalledOnValidThread()); 71 DCHECK(thread_checker_.CalledOnValidThread());
72 72
73 JNIEnv* env = AttachCurrentThread(); 73 JNIEnv* env = AttachCurrentThread();
74 Java_InstanceIDBridge_destroy(env, java_ref_.obj()); 74 Java_InstanceIDBridge_destroy(env, java_ref_.obj());
75 } 75 }
76 76
77 void InstanceIDAndroid::GetID(const GetIDCallback& callback) { 77 void InstanceIDAndroid::GetID(const GetIDCallback& callback) {
78 DCHECK(thread_checker_.CalledOnValidThread()); 78 DCHECK(thread_checker_.CalledOnValidThread());
79 79
80 int32_t request_id = get_id_callbacks_.Add(new GetIDCallback(callback));
81
80 JNIEnv* env = AttachCurrentThread(); 82 JNIEnv* env = AttachCurrentThread();
81 std::string id = ConvertJavaStringToUTF8( 83 Java_InstanceIDBridge_getId(env, java_ref_.obj(), request_id);
82 Java_InstanceIDBridge_getId(env, java_ref_.obj()));
83 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
84 base::Bind(callback, id));
85 } 84 }
86 85
87 void InstanceIDAndroid::GetCreationTime( 86 void InstanceIDAndroid::GetCreationTime(
88 const GetCreationTimeCallback& callback) { 87 const GetCreationTimeCallback& callback) {
89 DCHECK(thread_checker_.CalledOnValidThread()); 88 DCHECK(thread_checker_.CalledOnValidThread());
90 89
90 int32_t request_id =
91 get_creation_time_callbacks_.Add(new GetCreationTimeCallback(callback));
92
91 JNIEnv* env = AttachCurrentThread(); 93 JNIEnv* env = AttachCurrentThread();
92 int64_t creation_time_unix_ms = 94 Java_InstanceIDBridge_getCreationTime(env, java_ref_.obj(), request_id);
93 Java_InstanceIDBridge_getCreationTime(env, java_ref_.obj());
94 base::Time creation_time;
95 // If the InstanceID's getId, getToken and deleteToken methods have never been
96 // called, or deleteInstanceID has cleared it since, creation time will be 0.
97 if (creation_time_unix_ms) {
98 creation_time = base::Time::UnixEpoch() +
99 base::TimeDelta::FromMilliseconds(creation_time_unix_ms);
100 }
101 base::ThreadTaskRunnerHandle::Get()->PostTask(
102 FROM_HERE, base::Bind(callback, creation_time));
103 } 95 }
104 96
105 void InstanceIDAndroid::GetToken( 97 void InstanceIDAndroid::GetToken(
106 const std::string& authorized_entity, 98 const std::string& authorized_entity,
107 const std::string& scope, 99 const std::string& scope,
108 const std::map<std::string, std::string>& options, 100 const std::map<std::string, std::string>& options,
109 const GetTokenCallback& callback) { 101 const GetTokenCallback& callback) {
110 DCHECK(thread_checker_.CalledOnValidThread()); 102 DCHECK(thread_checker_.CalledOnValidThread());
111 103
112 int32_t request_id = get_token_callbacks_.Add(new GetTokenCallback(callback)); 104 int32_t request_id = get_token_callbacks_.Add(new GetTokenCallback(callback));
(...skipping 29 matching lines...) Expand all
142 134
143 void InstanceIDAndroid::DeleteID(const DeleteIDCallback& callback) { 135 void InstanceIDAndroid::DeleteID(const DeleteIDCallback& callback) {
144 DCHECK(thread_checker_.CalledOnValidThread()); 136 DCHECK(thread_checker_.CalledOnValidThread());
145 137
146 int32_t request_id = delete_id_callbacks_.Add(new DeleteIDCallback(callback)); 138 int32_t request_id = delete_id_callbacks_.Add(new DeleteIDCallback(callback));
147 139
148 JNIEnv* env = AttachCurrentThread(); 140 JNIEnv* env = AttachCurrentThread();
149 Java_InstanceIDBridge_deleteInstanceID(env, java_ref_.obj(), request_id); 141 Java_InstanceIDBridge_deleteInstanceID(env, java_ref_.obj(), request_id);
150 } 142 }
151 143
144 void InstanceIDAndroid::DidGetID(
145 JNIEnv* env,
146 const base::android::JavaParamRef<jobject>& obj,
147 jint request_id,
148 const base::android::JavaParamRef<jstring>& jid) {
149 DCHECK(thread_checker_.CalledOnValidThread());
150
151 GetIDCallback* callback = get_id_callbacks_.Lookup(request_id);
152 DCHECK(callback);
153 callback->Run(ConvertJavaStringToUTF8(jid));
154 get_id_callbacks_.Remove(request_id);
155 }
156
157 void InstanceIDAndroid::DidGetCreationTime(
158 JNIEnv* env,
159 const base::android::JavaParamRef<jobject>& obj,
160 jint request_id,
161 jlong creation_time_unix_ms) {
162 DCHECK(thread_checker_.CalledOnValidThread());
163
164 base::Time creation_time;
165 // If the InstanceID's getId, getToken and deleteToken methods have never been
166 // called, or deleteInstanceID has cleared it since, creation time will be 0.
167 if (creation_time_unix_ms) {
168 creation_time = base::Time::UnixEpoch() +
169 base::TimeDelta::FromMilliseconds(creation_time_unix_ms);
170 }
171
172 GetCreationTimeCallback* callback =
173 get_creation_time_callbacks_.Lookup(request_id);
174 DCHECK(callback);
175 callback->Run(creation_time);
176 get_creation_time_callbacks_.Remove(request_id);
177 }
178
152 void InstanceIDAndroid::DidGetToken( 179 void InstanceIDAndroid::DidGetToken(
153 JNIEnv* env, 180 JNIEnv* env,
154 const base::android::JavaParamRef<jobject>& obj, 181 const base::android::JavaParamRef<jobject>& obj,
155 jint request_id, 182 jint request_id,
156 const base::android::JavaParamRef<jstring>& jtoken) { 183 const base::android::JavaParamRef<jstring>& jtoken) {
157 DCHECK(thread_checker_.CalledOnValidThread()); 184 DCHECK(thread_checker_.CalledOnValidThread());
158 185
159 GetTokenCallback* callback = get_token_callbacks_.Lookup(request_id); 186 GetTokenCallback* callback = get_token_callbacks_.Lookup(request_id);
160 DCHECK(callback); 187 DCHECK(callback);
161 std::string token = ConvertJavaStringToUTF8(jtoken); 188 std::string token = ConvertJavaStringToUTF8(jtoken);
(...skipping 15 matching lines...) Expand all
177 delete_token_callbacks_.Remove(request_id); 204 delete_token_callbacks_.Remove(request_id);
178 } 205 }
179 206
180 void InstanceIDAndroid::DidDeleteID( 207 void InstanceIDAndroid::DidDeleteID(
181 JNIEnv* env, 208 JNIEnv* env,
182 const base::android::JavaParamRef<jobject>& obj, 209 const base::android::JavaParamRef<jobject>& obj,
183 jint request_id, 210 jint request_id,
184 jboolean success) { 211 jboolean success) {
185 DCHECK(thread_checker_.CalledOnValidThread()); 212 DCHECK(thread_checker_.CalledOnValidThread());
186 213
187 DeleteIDCallback* callback = delete_id_callbacks_.Lookup(request_id); 214 // Must remove the callback from the IDMap before running it, since running it
215 // may delete this and hence the IDMap (but isn't guaranteed to either).
216 DeleteTokenCallback* callback = delete_id_callbacks_.Lookup(request_id);
188 DCHECK(callback); 217 DCHECK(callback);
189 callback->Run(success ? InstanceID::SUCCESS : InstanceID::UNKNOWN_ERROR); 218 DeleteIDCallback callback_copy = *callback;
190 delete_id_callbacks_.Remove(request_id); 219 delete_id_callbacks_.Remove(request_id);
220 // Now |callback| has been deleted.
221 callback_copy.Run(success ? InstanceID::SUCCESS : InstanceID::UNKNOWN_ERROR);
222 // Now |this| may have been deleted.
191 } 223 }
192 224
193 } // namespace instance_id 225 } // namespace instance_id
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698