| 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 |