| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "third_party/WebKit/public/web/WebBindings.h" | 11 #include "third_party/WebKit/public/web/WebBindings.h" |
| 11 #include "webkit/renderer/cpp_variant.h" | 12 #include "webkit/renderer/cpp_variant.h" |
| 12 | 13 |
| 13 using WebKit::WebBindings; | 14 using WebKit::WebBindings; |
| 14 using webkit_glue::CppVariant; | 15 using webkit_glue::CppVariant; |
| 15 | 16 |
| 16 // Creates a std::string from an NPVariant of string type. If the NPVariant | 17 // Creates a std::string from an NPVariant of string type. If the NPVariant |
| 17 // is not a string, empties the std::string. | 18 // is not a string, empties the std::string. |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 | 70 |
| 70 ++g_deallocate_call_count; | 71 ++g_deallocate_call_count; |
| 71 free(npobj); | 72 free(npobj); |
| 72 } | 73 } |
| 73 | 74 |
| 74 static NPClass void_class = { NP_CLASS_STRUCT_VERSION, | 75 static NPClass void_class = { NP_CLASS_STRUCT_VERSION, |
| 75 MockNPAllocate, | 76 MockNPAllocate, |
| 76 MockNPDeallocate, | 77 MockNPDeallocate, |
| 77 0, 0, 0, 0, 0, 0, 0, 0, 0 }; | 78 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
| 78 | 79 |
| 79 NPObject* MakeVoidObject() { | 80 class CppVariantTest : public testing::Test { |
| 80 g_allocate_call_count = 0; | 81 public: |
| 81 g_deallocate_call_count = 0; | 82 CppVariantTest() : npp_(new struct _NPP) {} |
| 82 return WebBindings::createObject(NULL, &void_class); | 83 virtual ~CppVariantTest() {} |
| 83 } | |
| 84 | 84 |
| 85 TEST(CppVariantTest, NewVariantHasNullType) { | 85 virtual void SetUp() OVERRIDE { |
| 86 WebBindings::registerObjectOwner(npp_.get()); |
| 87 } |
| 88 |
| 89 virtual void TearDown() OVERRIDE { |
| 90 WebBindings::unregisterObjectOwner(npp_.get()); |
| 91 } |
| 92 |
| 93 struct _NPP* npp() { return npp_.get(); } |
| 94 |
| 95 NPObject* MakeVoidObject() { |
| 96 g_allocate_call_count = 0; |
| 97 g_deallocate_call_count = 0; |
| 98 return WebBindings::createObject(npp_.get(), &void_class); |
| 99 } |
| 100 |
| 101 private: |
| 102 scoped_ptr<struct _NPP> npp_; |
| 103 }; |
| 104 |
| 105 TEST_F(CppVariantTest, NewVariantHasNullType) { |
| 86 CppVariant value; | 106 CppVariant value; |
| 87 EXPECT_EQ(NPVariantType_Null, value.type); | 107 EXPECT_EQ(NPVariantType_Null, value.type); |
| 88 } | 108 } |
| 89 | 109 |
| 90 TEST(CppVariantTest, SetNullSetsType) { | 110 TEST_F(CppVariantTest, SetNullSetsType) { |
| 91 CppVariant value; | 111 CppVariant value; |
| 92 value.Set(17); | 112 value.Set(17); |
| 93 value.SetNull(); | 113 value.SetNull(); |
| 94 EXPECT_EQ(NPVariantType_Null, value.type); | 114 EXPECT_EQ(NPVariantType_Null, value.type); |
| 95 } | 115 } |
| 96 | 116 |
| 97 TEST(CppVariantTest, CopyConstructorDoesDeepCopy) { | 117 TEST_F(CppVariantTest, CopyConstructorDoesDeepCopy) { |
| 98 CppVariant source; | 118 CppVariant source; |
| 99 source.Set("test string"); | 119 source.Set("test string"); |
| 100 CppVariant dest = source; | 120 CppVariant dest = source; |
| 101 EXPECT_EQ(NPVariantType_String, dest.type); | 121 EXPECT_EQ(NPVariantType_String, dest.type); |
| 102 EXPECT_EQ(NPVariantType_String, source.type); | 122 EXPECT_EQ(NPVariantType_String, source.type); |
| 103 | 123 |
| 104 // Ensure that the string was copied, not just the pointer. | 124 // Ensure that the string was copied, not just the pointer. |
| 105 EXPECT_NE(source.value.stringValue.UTF8Characters, | 125 EXPECT_NE(source.value.stringValue.UTF8Characters, |
| 106 dest.value.stringValue.UTF8Characters); | 126 dest.value.stringValue.UTF8Characters); |
| 107 | 127 |
| 108 CheckString(source, dest); | 128 CheckString(source, dest); |
| 109 } | 129 } |
| 110 | 130 |
| 111 TEST(CppVariantTest, CopyConstructorIncrementsRefCount) { | 131 TEST_F(CppVariantTest, CopyConstructorIncrementsRefCount) { |
| 112 CppVariant source; | 132 CppVariant source; |
| 113 NPObject *object = MakeVoidObject(); | 133 NPObject *object = MakeVoidObject(); |
| 114 source.Set(object); | 134 source.Set(object); |
| 115 // 2 references so far. | 135 // 2 references so far. |
| 116 EXPECT_EQ(2U, source.value.objectValue->referenceCount); | 136 EXPECT_EQ(2U, source.value.objectValue->referenceCount); |
| 117 | 137 |
| 118 CppVariant dest = source; | 138 CppVariant dest = source; |
| 119 EXPECT_EQ(3U, dest.value.objectValue->referenceCount); | 139 EXPECT_EQ(3U, dest.value.objectValue->referenceCount); |
| 120 EXPECT_EQ(1, g_allocate_call_count); | 140 EXPECT_EQ(1, g_allocate_call_count); |
| 121 WebBindings::releaseObject(object); | 141 WebBindings::releaseObject(object); |
| 122 source.SetNull(); | 142 source.SetNull(); |
| 123 CheckObject(dest); | 143 CheckObject(dest); |
| 124 } | 144 } |
| 125 | 145 |
| 126 TEST(CppVariantTest, AssignmentDoesDeepCopy) { | 146 TEST_F(CppVariantTest, AssignmentDoesDeepCopy) { |
| 127 CppVariant source; | 147 CppVariant source; |
| 128 source.Set("test string"); | 148 source.Set("test string"); |
| 129 CppVariant dest; | 149 CppVariant dest; |
| 130 dest = source; | 150 dest = source; |
| 131 EXPECT_EQ(NPVariantType_String, dest.type); | 151 EXPECT_EQ(NPVariantType_String, dest.type); |
| 132 EXPECT_EQ(NPVariantType_String, source.type); | 152 EXPECT_EQ(NPVariantType_String, source.type); |
| 133 | 153 |
| 134 // Ensure that the string was copied, not just the pointer. | 154 // Ensure that the string was copied, not just the pointer. |
| 135 EXPECT_NE(source.value.stringValue.UTF8Characters, | 155 EXPECT_NE(source.value.stringValue.UTF8Characters, |
| 136 dest.value.stringValue.UTF8Characters); | 156 dest.value.stringValue.UTF8Characters); |
| 137 | 157 |
| 138 CheckString(source, dest); | 158 CheckString(source, dest); |
| 139 } | 159 } |
| 140 | 160 |
| 141 TEST(CppVariantTest, AssignmentIncrementsRefCount) { | 161 TEST_F(CppVariantTest, AssignmentIncrementsRefCount) { |
| 142 CppVariant source; | 162 CppVariant source; |
| 143 NPObject *object = MakeVoidObject(); | 163 NPObject *object = MakeVoidObject(); |
| 144 source.Set(object); | 164 source.Set(object); |
| 145 // 2 references so far. | 165 // 2 references so far. |
| 146 EXPECT_EQ(2U, source.value.objectValue->referenceCount); | 166 EXPECT_EQ(2U, source.value.objectValue->referenceCount); |
| 147 | 167 |
| 148 CppVariant dest; | 168 CppVariant dest; |
| 149 dest = source; | 169 dest = source; |
| 150 EXPECT_EQ(3U, dest.value.objectValue->referenceCount); | 170 EXPECT_EQ(3U, dest.value.objectValue->referenceCount); |
| 151 EXPECT_EQ(1, g_allocate_call_count); | 171 EXPECT_EQ(1, g_allocate_call_count); |
| 152 | 172 |
| 153 WebBindings::releaseObject(object); | 173 WebBindings::releaseObject(object); |
| 154 source.SetNull(); | 174 source.SetNull(); |
| 155 CheckObject(dest); | 175 CheckObject(dest); |
| 156 } | 176 } |
| 157 | 177 |
| 158 TEST(CppVariantTest, DestroyingCopyDoesNotCorruptSource) { | 178 TEST_F(CppVariantTest, DestroyingCopyDoesNotCorruptSource) { |
| 159 CppVariant source; | 179 CppVariant source; |
| 160 source.Set("test string"); | 180 source.Set("test string"); |
| 161 std::string before; | 181 std::string before; |
| 162 MakeStdString(source, &before); | 182 MakeStdString(source, &before); |
| 163 { | 183 { |
| 164 CppVariant dest = source; | 184 CppVariant dest = source; |
| 165 } | 185 } |
| 166 CheckString(before, source); | 186 CheckString(before, source); |
| 167 | 187 |
| 168 NPObject *object = MakeVoidObject(); | 188 NPObject *object = MakeVoidObject(); |
| 169 source.Set(object); | 189 source.Set(object); |
| 170 { | 190 { |
| 171 CppVariant dest2 = source; | 191 CppVariant dest2 = source; |
| 172 } | 192 } |
| 173 WebBindings::releaseObject(object); | 193 WebBindings::releaseObject(object); |
| 174 CheckObject(source); | 194 CheckObject(source); |
| 175 } | 195 } |
| 176 | 196 |
| 177 TEST(CppVariantTest, CopiesTypeAndValueToNPVariant) { | 197 TEST_F(CppVariantTest, CopiesTypeAndValueToNPVariant) { |
| 178 NPVariant np; | 198 NPVariant np; |
| 179 CppVariant cpp; | 199 CppVariant cpp; |
| 180 | 200 |
| 181 cpp.Set(true); | 201 cpp.Set(true); |
| 182 cpp.CopyToNPVariant(&np); | 202 cpp.CopyToNPVariant(&np); |
| 183 EXPECT_EQ(cpp.type, np.type); | 203 EXPECT_EQ(cpp.type, np.type); |
| 184 EXPECT_EQ(cpp.value.boolValue, np.value.boolValue); | 204 EXPECT_EQ(cpp.value.boolValue, np.value.boolValue); |
| 185 WebBindings::releaseVariantValue(&np); | 205 WebBindings::releaseVariantValue(&np); |
| 186 | 206 |
| 187 cpp.Set(17); | 207 cpp.Set(17); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 208 | 228 |
| 209 NPObject *object = MakeVoidObject(); | 229 NPObject *object = MakeVoidObject(); |
| 210 cpp.Set(object); | 230 cpp.Set(object); |
| 211 cpp.CopyToNPVariant(&np); | 231 cpp.CopyToNPVariant(&np); |
| 212 WebBindings::releaseObject(object); | 232 WebBindings::releaseObject(object); |
| 213 cpp.SetNull(); | 233 cpp.SetNull(); |
| 214 CheckObject(np); | 234 CheckObject(np); |
| 215 WebBindings::releaseVariantValue(&np); | 235 WebBindings::releaseVariantValue(&np); |
| 216 } | 236 } |
| 217 | 237 |
| 218 TEST(CppVariantTest, SetsTypeAndValueFromNPVariant) { | 238 TEST_F(CppVariantTest, SetsTypeAndValueFromNPVariant) { |
| 219 NPVariant np; | 239 NPVariant np; |
| 220 CppVariant cpp; | 240 CppVariant cpp; |
| 221 | 241 |
| 222 VOID_TO_NPVARIANT(np); | 242 VOID_TO_NPVARIANT(np); |
| 223 cpp.Set(np); | 243 cpp.Set(np); |
| 224 EXPECT_EQ(np.type, cpp.type); | 244 EXPECT_EQ(np.type, cpp.type); |
| 225 WebBindings::releaseVariantValue(&np); | 245 WebBindings::releaseVariantValue(&np); |
| 226 | 246 |
| 227 NULL_TO_NPVARIANT(np); | 247 NULL_TO_NPVARIANT(np); |
| 228 cpp.Set(np); | 248 cpp.Set(np); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 WebBindings::releaseVariantValue(&np); | 286 WebBindings::releaseVariantValue(&np); |
| 267 | 287 |
| 268 NPObject *obj = MakeVoidObject(); | 288 NPObject *obj = MakeVoidObject(); |
| 269 OBJECT_TO_NPVARIANT(obj, np); // Doesn't make a copy. | 289 OBJECT_TO_NPVARIANT(obj, np); // Doesn't make a copy. |
| 270 cpp.Set(np); | 290 cpp.Set(np); |
| 271 // Use this or WebBindings::releaseObject but NOT both. | 291 // Use this or WebBindings::releaseObject but NOT both. |
| 272 WebBindings::releaseVariantValue(&np); | 292 WebBindings::releaseVariantValue(&np); |
| 273 CheckObject(cpp); | 293 CheckObject(cpp); |
| 274 } | 294 } |
| 275 | 295 |
| 276 TEST(CppVariantTest, SetsSimpleTypesAndValues) { | 296 TEST_F(CppVariantTest, SetsSimpleTypesAndValues) { |
| 277 CppVariant cpp; | 297 CppVariant cpp; |
| 278 cpp.Set(true); | 298 cpp.Set(true); |
| 279 EXPECT_EQ(NPVariantType_Bool, cpp.type); | 299 EXPECT_EQ(NPVariantType_Bool, cpp.type); |
| 280 EXPECT_TRUE(cpp.value.boolValue); | 300 EXPECT_TRUE(cpp.value.boolValue); |
| 281 | 301 |
| 282 cpp.Set(5); | 302 cpp.Set(5); |
| 283 EXPECT_EQ(NPVariantType_Int32, cpp.type); | 303 EXPECT_EQ(NPVariantType_Int32, cpp.type); |
| 284 EXPECT_EQ(5, cpp.value.intValue); | 304 EXPECT_EQ(5, cpp.value.intValue); |
| 285 | 305 |
| 286 cpp.Set(1.234); | 306 cpp.Set(1.234); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 312 cpp.Set(np_intl_str); | 332 cpp.Set(np_intl_str); |
| 313 expected = std::string("\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84"); | 333 expected = std::string("\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84"); |
| 314 CheckString(expected, cpp); | 334 CheckString(expected, cpp); |
| 315 | 335 |
| 316 NPObject* obj = MakeVoidObject(); | 336 NPObject* obj = MakeVoidObject(); |
| 317 cpp.Set(obj); | 337 cpp.Set(obj); |
| 318 WebBindings::releaseObject(obj); | 338 WebBindings::releaseObject(obj); |
| 319 CheckObject(cpp); | 339 CheckObject(cpp); |
| 320 } | 340 } |
| 321 | 341 |
| 322 TEST(CppVariantTest, FreeDataSetsToVoid) { | 342 TEST_F(CppVariantTest, FreeDataSetsToVoid) { |
| 323 CppVariant cpp; | 343 CppVariant cpp; |
| 324 EXPECT_EQ(NPVariantType_Null, cpp.type); | 344 EXPECT_EQ(NPVariantType_Null, cpp.type); |
| 325 cpp.Set(12); | 345 cpp.Set(12); |
| 326 EXPECT_EQ(NPVariantType_Int32, cpp.type); | 346 EXPECT_EQ(NPVariantType_Int32, cpp.type); |
| 327 cpp.FreeData(); | 347 cpp.FreeData(); |
| 328 EXPECT_EQ(NPVariantType_Void, cpp.type); | 348 EXPECT_EQ(NPVariantType_Void, cpp.type); |
| 329 } | 349 } |
| 330 | 350 |
| 331 TEST(CppVariantTest, FreeDataReleasesObject) { | 351 TEST_F(CppVariantTest, FreeDataReleasesObject) { |
| 332 CppVariant cpp; | 352 CppVariant cpp; |
| 333 NPObject* object = MakeVoidObject(); | 353 NPObject* object = MakeVoidObject(); |
| 334 cpp.Set(object); | 354 cpp.Set(object); |
| 335 EXPECT_EQ(2U, object->referenceCount); | 355 EXPECT_EQ(2U, object->referenceCount); |
| 336 cpp.FreeData(); | 356 cpp.FreeData(); |
| 337 EXPECT_EQ(1U, object->referenceCount); | 357 EXPECT_EQ(1U, object->referenceCount); |
| 338 EXPECT_EQ(0, g_deallocate_call_count); | 358 EXPECT_EQ(0, g_deallocate_call_count); |
| 339 | 359 |
| 340 cpp.Set(object); | 360 cpp.Set(object); |
| 341 WebBindings::releaseObject(object); | 361 WebBindings::releaseObject(object); |
| 342 EXPECT_EQ(0, g_deallocate_call_count); | 362 EXPECT_EQ(0, g_deallocate_call_count); |
| 343 cpp.FreeData(); | 363 cpp.FreeData(); |
| 344 EXPECT_EQ(1, g_deallocate_call_count); | 364 EXPECT_EQ(1, g_deallocate_call_count); |
| 345 } | 365 } |
| 346 | 366 |
| 347 TEST(CppVariantTest, IsTypeFunctionsWork) { | 367 TEST_F(CppVariantTest, IsTypeFunctionsWork) { |
| 348 CppVariant cpp; | 368 CppVariant cpp; |
| 349 // These should not happen in practice, since voids are not supported | 369 // These should not happen in practice, since voids are not supported |
| 350 // This test must be first since it just clobbers internal data without | 370 // This test must be first since it just clobbers internal data without |
| 351 // releasing. | 371 // releasing. |
| 352 VOID_TO_NPVARIANT(cpp); | 372 VOID_TO_NPVARIANT(cpp); |
| 353 EXPECT_FALSE(cpp.isBool()); | 373 EXPECT_FALSE(cpp.isBool()); |
| 354 EXPECT_FALSE(cpp.isInt32()); | 374 EXPECT_FALSE(cpp.isInt32()); |
| 355 EXPECT_FALSE(cpp.isDouble()); | 375 EXPECT_FALSE(cpp.isDouble()); |
| 356 EXPECT_FALSE(cpp.isNumber()); | 376 EXPECT_FALSE(cpp.isNumber()); |
| 357 EXPECT_FALSE(cpp.isString()); | 377 EXPECT_FALSE(cpp.isString()); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 const char* s = "string"; | 467 const char* s = "string"; |
| 448 size_t length = strlen(s); | 468 size_t length = strlen(s); |
| 449 char* mem = static_cast<char*>(malloc(length + 1)); | 469 char* mem = static_cast<char*>(malloc(length + 1)); |
| 450 base::strlcpy(mem, s, length + 1); | 470 base::strlcpy(mem, s, length + 1); |
| 451 STRINGZ_TO_NPVARIANT(mem, *result); | 471 STRINGZ_TO_NPVARIANT(mem, *result); |
| 452 } | 472 } |
| 453 | 473 |
| 454 return true; | 474 return true; |
| 455 } | 475 } |
| 456 | 476 |
| 457 TEST(CppVariantTest, ToVector) { | 477 TEST_F(CppVariantTest, ToVector) { |
| 458 NPClass array_like_class = { | 478 NPClass array_like_class = { |
| 459 NP_CLASS_STRUCT_VERSION, | 479 NP_CLASS_STRUCT_VERSION, |
| 460 0, // NPAllocateFunctionPtr allocate; | 480 0, // NPAllocateFunctionPtr allocate; |
| 461 0, // NPDeallocateFunctionPtr deallocate; | 481 0, // NPDeallocateFunctionPtr deallocate; |
| 462 0, // NPInvalidateFunctionPtr invalidate; | 482 0, // NPInvalidateFunctionPtr invalidate; |
| 463 0, // NPHasMethodFunctionPtr hasMethod; | 483 0, // NPHasMethodFunctionPtr hasMethod; |
| 464 0, // NPInvokeFunctionPtr invoke; | 484 0, // NPInvokeFunctionPtr invoke; |
| 465 0, // NPInvokeDefaultFunctionPtr invokeDefault; | 485 0, // NPInvokeDefaultFunctionPtr invokeDefault; |
| 466 MockNPHasPropertyFunction, // NPHasPropertyFunctionPtr hasProperty; | 486 MockNPHasPropertyFunction, // NPHasPropertyFunctionPtr hasProperty; |
| 467 MockNPGetPropertyFunction, // NPGetPropertyFunctionPtr getProperty; | 487 MockNPGetPropertyFunction, // NPGetPropertyFunctionPtr getProperty; |
| 468 0, // NPSetPropertyFunctionPtr setProperty; | 488 0, // NPSetPropertyFunctionPtr setProperty; |
| 469 0, // NPRemovePropertyFunctionPtr removeProperty; | 489 0, // NPRemovePropertyFunctionPtr removeProperty; |
| 470 0, // NPEnumerationFunctionPtr enumerate; | 490 0, // NPEnumerationFunctionPtr enumerate; |
| 471 0 // NPConstructFunctionPtr construct; | 491 0 // NPConstructFunctionPtr construct; |
| 472 }; | 492 }; |
| 473 | 493 |
| 474 NPObject* obj = WebBindings::createObject(NULL, &array_like_class); | 494 NPObject* obj = WebBindings::createObject(npp(), &array_like_class); |
| 475 | 495 |
| 476 CppVariant cpp; | 496 CppVariant cpp; |
| 477 cpp.Set(obj); | 497 cpp.Set(obj); |
| 478 | 498 |
| 479 std::vector<CppVariant> cpp_vector = cpp.ToVector(); | 499 std::vector<CppVariant> cpp_vector = cpp.ToVector(); |
| 480 EXPECT_EQ(4u, cpp_vector.size()); | 500 EXPECT_EQ(4u, cpp_vector.size()); |
| 481 | 501 |
| 482 EXPECT_TRUE(cpp_vector[0].isDouble()); | 502 EXPECT_TRUE(cpp_vector[0].isDouble()); |
| 483 EXPECT_EQ(0, cpp_vector[0].ToDouble()); | 503 EXPECT_EQ(0, cpp_vector[0].ToDouble()); |
| 484 | 504 |
| 485 EXPECT_TRUE(cpp_vector[1].isBool()); | 505 EXPECT_TRUE(cpp_vector[1].isBool()); |
| 486 EXPECT_EQ(true, cpp_vector[1].ToBoolean()); | 506 EXPECT_EQ(true, cpp_vector[1].ToBoolean()); |
| 487 | 507 |
| 488 EXPECT_TRUE(cpp_vector[2].isNull()); | 508 EXPECT_TRUE(cpp_vector[2].isNull()); |
| 489 | 509 |
| 490 EXPECT_TRUE(cpp_vector[3].isString()); | 510 EXPECT_TRUE(cpp_vector[3].isString()); |
| 491 CheckString("string", cpp_vector[3]); | 511 CheckString("string", cpp_vector[3]); |
| 492 | 512 |
| 493 WebBindings::releaseObject(obj); | 513 WebBindings::releaseObject(obj); |
| 494 } | 514 } |
| OLD | NEW |