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

Side by Side Diff: webkit/renderer/cpp_variant_unittest.cc

Issue 17208003: Track NPObject ownership by the originating plugins' NPP identifier. [4/6] (Chrome) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove DCHECKs on proxy and stub maps. Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « webkit/plugins/npapi/webplugin_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « webkit/plugins/npapi/webplugin_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698