OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "content/browser/renderer_host/java/gin_java_method_invocation_helper.h
" | 5 #include "content/browser/renderer_host/java/gin_java_method_invocation_helper.h
" |
6 | 6 |
7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "content/browser/renderer_host/java/jni_helper.h" |
8 #include "content/common/android/gin_java_bridge_value.h" | 9 #include "content/common/android/gin_java_bridge_value.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
10 | 11 |
11 namespace content { | 12 namespace content { |
12 | 13 |
13 namespace { | 14 namespace { |
14 | 15 |
15 class NullObjectDelegate | 16 class NullObjectDelegate |
16 : public GinJavaMethodInvocationHelper::ObjectDelegate { | 17 : public GinJavaMethodInvocationHelper::ObjectDelegate { |
17 public: | 18 public: |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 new GinJavaMethodInvocationHelper( | 148 new GinJavaMethodInvocationHelper( |
148 scoped_ptr<GinJavaMethodInvocationHelper::ObjectDelegate>( | 149 scoped_ptr<GinJavaMethodInvocationHelper::ObjectDelegate>( |
149 new NullObjectDelegate()), | 150 new NullObjectDelegate()), |
150 "foo", | 151 "foo", |
151 objects); | 152 objects); |
152 CountingDispatcherDelegate counter; | 153 CountingDispatcherDelegate counter; |
153 helper->Init(&counter); | 154 helper->Init(&counter); |
154 counter.AssertInvocationsCount(1, 6); | 155 counter.AssertInvocationsCount(1, 6); |
155 } | 156 } |
156 | 157 |
| 158 namespace { |
| 159 |
| 160 class ObjectIsGoneObjectDelegate : public NullObjectDelegate { |
| 161 public: |
| 162 ObjectIsGoneObjectDelegate() : |
| 163 get_local_ref_called_(false) { |
| 164 // We need a Java Method object to create a valid JavaMethod instance. |
| 165 JNIEnv* env = base::android::AttachCurrentThread(); |
| 166 jmethodID method_id = |
| 167 GetMethodIDFromClassName(env, "java/lang/Object", "hashCode", "()I"); |
| 168 EXPECT_TRUE(method_id); |
| 169 base::android::ScopedJavaLocalRef<jobject> method_obj( |
| 170 env, |
| 171 env->ToReflectedMethod( |
| 172 base::android::GetClass(env, "java/lang/Object").obj(), |
| 173 method_id, |
| 174 false)); |
| 175 EXPECT_TRUE(method_obj.obj()); |
| 176 method_.reset(new JavaMethod(method_obj)); |
| 177 } |
| 178 |
| 179 virtual ~ObjectIsGoneObjectDelegate() {} |
| 180 |
| 181 virtual base::android::ScopedJavaLocalRef<jobject> GetLocalRef( |
| 182 JNIEnv* env) OVERRIDE { |
| 183 get_local_ref_called_ = true; |
| 184 return NullObjectDelegate::GetLocalRef(env); |
| 185 } |
| 186 |
| 187 virtual const JavaMethod* FindMethod(const std::string& method_name, |
| 188 size_t num_parameters) OVERRIDE { |
| 189 return method_.get(); |
| 190 } |
| 191 |
| 192 bool get_local_ref_called() { return get_local_ref_called_; } |
| 193 |
| 194 const std::string& get_method_name() { return method_->name(); } |
| 195 |
| 196 protected: |
| 197 scoped_ptr<JavaMethod> method_; |
| 198 bool get_local_ref_called_; |
| 199 |
| 200 private: |
| 201 DISALLOW_COPY_AND_ASSIGN(ObjectIsGoneObjectDelegate); |
| 202 }; |
| 203 |
| 204 } // namespace |
| 205 |
157 TEST_F(GinJavaMethodInvocationHelperTest, HandleObjectIsGone) { | 206 TEST_F(GinJavaMethodInvocationHelperTest, HandleObjectIsGone) { |
158 base::ListValue no_objects; | 207 base::ListValue no_objects; |
| 208 ObjectIsGoneObjectDelegate* object_delegate = |
| 209 new ObjectIsGoneObjectDelegate(); |
159 scoped_refptr<GinJavaMethodInvocationHelper> helper = | 210 scoped_refptr<GinJavaMethodInvocationHelper> helper = |
160 new GinJavaMethodInvocationHelper( | 211 new GinJavaMethodInvocationHelper( |
161 scoped_ptr<GinJavaMethodInvocationHelper::ObjectDelegate>( | 212 scoped_ptr<GinJavaMethodInvocationHelper::ObjectDelegate>( |
162 new NullObjectDelegate()), | 213 object_delegate), |
163 "foo", | 214 object_delegate->get_method_name(), |
164 no_objects); | 215 no_objects); |
165 NullDispatcherDelegate dispatcher; | 216 NullDispatcherDelegate dispatcher; |
166 helper->Init(&dispatcher); | 217 helper->Init(&dispatcher); |
167 EXPECT_TRUE(helper->GetErrorMessage().empty()); | 218 EXPECT_FALSE(object_delegate->get_local_ref_called()); |
| 219 EXPECT_EQ(kGinJavaBridgeNoError, helper->GetInvocationError()); |
168 helper->Invoke(); | 220 helper->Invoke(); |
| 221 EXPECT_TRUE(object_delegate->get_local_ref_called()); |
169 EXPECT_TRUE(helper->HoldsPrimitiveResult()); | 222 EXPECT_TRUE(helper->HoldsPrimitiveResult()); |
170 EXPECT_TRUE(helper->GetPrimitiveResult().empty()); | 223 EXPECT_TRUE(helper->GetPrimitiveResult().empty()); |
171 EXPECT_FALSE(helper->GetErrorMessage().empty()); | 224 EXPECT_EQ(kGinJavaBridgeObjectIsGone, helper->GetInvocationError()); |
172 } | 225 } |
173 | 226 |
174 namespace { | 227 namespace { |
175 | 228 |
176 class MethodNotFoundObjectDelegate : public NullObjectDelegate { | 229 class MethodNotFoundObjectDelegate : public NullObjectDelegate { |
177 public: | 230 public: |
178 MethodNotFoundObjectDelegate() : find_method_called_(false) {} | 231 MethodNotFoundObjectDelegate() : find_method_called_(false) {} |
179 | 232 |
180 virtual ~MethodNotFoundObjectDelegate() {} | 233 virtual ~MethodNotFoundObjectDelegate() {} |
181 | 234 |
(...skipping 26 matching lines...) Expand all Loading... |
208 new MethodNotFoundObjectDelegate(); | 261 new MethodNotFoundObjectDelegate(); |
209 scoped_refptr<GinJavaMethodInvocationHelper> helper = | 262 scoped_refptr<GinJavaMethodInvocationHelper> helper = |
210 new GinJavaMethodInvocationHelper( | 263 new GinJavaMethodInvocationHelper( |
211 scoped_ptr<GinJavaMethodInvocationHelper::ObjectDelegate>( | 264 scoped_ptr<GinJavaMethodInvocationHelper::ObjectDelegate>( |
212 object_delegate), | 265 object_delegate), |
213 "foo", | 266 "foo", |
214 no_objects); | 267 no_objects); |
215 NullDispatcherDelegate dispatcher; | 268 NullDispatcherDelegate dispatcher; |
216 helper->Init(&dispatcher); | 269 helper->Init(&dispatcher); |
217 EXPECT_FALSE(object_delegate->find_method_called()); | 270 EXPECT_FALSE(object_delegate->find_method_called()); |
218 EXPECT_TRUE(helper->GetErrorMessage().empty()); | 271 EXPECT_EQ(kGinJavaBridgeNoError, helper->GetInvocationError()); |
219 helper->Invoke(); | 272 helper->Invoke(); |
220 EXPECT_TRUE(object_delegate->find_method_called()); | 273 EXPECT_TRUE(object_delegate->find_method_called()); |
221 EXPECT_TRUE(helper->HoldsPrimitiveResult()); | 274 EXPECT_TRUE(helper->HoldsPrimitiveResult()); |
222 EXPECT_TRUE(helper->GetPrimitiveResult().empty()); | 275 EXPECT_TRUE(helper->GetPrimitiveResult().empty()); |
223 EXPECT_FALSE(helper->GetErrorMessage().empty()); | 276 EXPECT_EQ(kGinJavaBridgeMethodNotFound, helper->GetInvocationError()); |
224 } | 277 } |
225 | 278 |
226 namespace { | 279 namespace { |
227 | 280 |
228 class GetClassObjectDelegate : public MethodNotFoundObjectDelegate { | 281 class GetClassObjectDelegate : public MethodNotFoundObjectDelegate { |
229 public: | 282 public: |
230 GetClassObjectDelegate() : get_class_called_(false) {} | 283 GetClassObjectDelegate() : get_class_called_(false) {} |
231 | 284 |
232 virtual ~GetClassObjectDelegate() {} | 285 virtual ~GetClassObjectDelegate() {} |
233 | 286 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 scoped_refptr<GinJavaMethodInvocationHelper> helper = | 319 scoped_refptr<GinJavaMethodInvocationHelper> helper = |
267 new GinJavaMethodInvocationHelper( | 320 new GinJavaMethodInvocationHelper( |
268 scoped_ptr<GinJavaMethodInvocationHelper::ObjectDelegate>( | 321 scoped_ptr<GinJavaMethodInvocationHelper::ObjectDelegate>( |
269 object_delegate), | 322 object_delegate), |
270 "foo", | 323 "foo", |
271 no_objects); | 324 no_objects); |
272 NullDispatcherDelegate dispatcher; | 325 NullDispatcherDelegate dispatcher; |
273 helper->Init(&dispatcher); | 326 helper->Init(&dispatcher); |
274 EXPECT_FALSE(object_delegate->find_method_called()); | 327 EXPECT_FALSE(object_delegate->find_method_called()); |
275 EXPECT_FALSE(object_delegate->get_class_called()); | 328 EXPECT_FALSE(object_delegate->get_class_called()); |
276 EXPECT_TRUE(helper->GetErrorMessage().empty()); | 329 EXPECT_EQ(kGinJavaBridgeNoError, helper->GetInvocationError()); |
277 helper->Invoke(); | 330 helper->Invoke(); |
278 EXPECT_TRUE(object_delegate->find_method_called()); | 331 EXPECT_TRUE(object_delegate->find_method_called()); |
279 EXPECT_TRUE(object_delegate->get_class_called()); | 332 EXPECT_TRUE(object_delegate->get_class_called()); |
280 EXPECT_TRUE(helper->HoldsPrimitiveResult()); | 333 EXPECT_TRUE(helper->HoldsPrimitiveResult()); |
281 EXPECT_TRUE(helper->GetPrimitiveResult().empty()); | 334 EXPECT_TRUE(helper->GetPrimitiveResult().empty()); |
282 EXPECT_FALSE(helper->GetErrorMessage().empty()); | 335 EXPECT_EQ(kGinJavaBridgeAccessToObjectGetClassIsBlocked, |
| 336 helper->GetInvocationError()); |
283 } | 337 } |
284 | 338 |
285 } // namespace content | 339 } // namespace content |
OLD | NEW |