| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "base/file_path.h" | 5 #include "base/file_path.h" |
| 6 #include "base/file_util.h" | 6 #include "base/file_util.h" |
| 7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
| 8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
| 9 #include "chrome/common/chrome_paths.h" | 9 #include "chrome/common/chrome_paths.h" |
| 10 #include "chrome/common/extensions/extension.h" | 10 #include "chrome/common/extensions/extension.h" |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 #else | 270 #else |
| 271 FilePath path(StringPrintf("/extension")); | 271 FilePath path(StringPrintf("/extension")); |
| 272 #endif | 272 #endif |
| 273 Extension extension(path); | 273 Extension extension(path); |
| 274 std::string error_msg; | 274 std::string error_msg; |
| 275 scoped_ptr<ExtensionAction> action; | 275 scoped_ptr<ExtensionAction> action; |
| 276 DictionaryValue input; | 276 DictionaryValue input; |
| 277 | 277 |
| 278 // First try with an empty dictionary. We should get nothing back. | 278 // First try with an empty dictionary. We should get nothing back. |
| 279 ASSERT_TRUE(extension.LoadExtensionActionHelper( | 279 ASSERT_TRUE(extension.LoadExtensionActionHelper( |
| 280 &input, 0, &error_msg, ExtensionAction::PAGE_ACTION) == NULL); | 280 &input, &error_msg, ExtensionAction::PAGE_ACTION) == NULL); |
| 281 ASSERT_STRNE("", error_msg.c_str()); | 281 ASSERT_STRNE("", error_msg.c_str()); |
| 282 error_msg = ""; | 282 error_msg = ""; |
| 283 | 283 |
| 284 // Now try the same, but as a browser action. Ensure same results. | 284 // Now try the same, but as a browser action. Ensure same results. |
| 285 ASSERT_TRUE(extension.LoadExtensionActionHelper( | 285 ASSERT_TRUE(extension.LoadExtensionActionHelper( |
| 286 &input, 0, &error_msg, ExtensionAction::BROWSER_ACTION) == NULL); | 286 &input, &error_msg, ExtensionAction::BROWSER_ACTION) == NULL); |
| 287 ASSERT_STRNE("", error_msg.c_str()); | 287 ASSERT_STRNE("", error_msg.c_str()); |
| 288 error_msg = ""; | 288 error_msg = ""; |
| 289 | 289 |
| 290 // Now setup some values to use in the page action. | 290 // Now setup some values to use in the page action. |
| 291 const std::string id("MyExtensionActionId"); | 291 const std::string id("MyExtensionActionId"); |
| 292 const std::string name("MyExtensionActionName"); | 292 const std::string name("MyExtensionActionName"); |
| 293 std::string img1("image1.png"); | 293 std::string img1("image1.png"); |
| 294 std::string img2("image2.png"); | 294 std::string img2("image2.png"); |
| 295 | 295 |
| 296 // Add the dictionary for the contextual action. | 296 // Add the dictionary for the contextual action. |
| 297 input.SetString(keys::kPageActionId, id); | 297 input.SetString(keys::kPageActionId, id); |
| 298 input.SetString(keys::kName, name); | 298 input.SetString(keys::kName, name); |
| 299 ListValue* icons = new ListValue; | 299 ListValue* icons = new ListValue; |
| 300 icons->Set(0, Value::CreateStringValue(img1)); | 300 icons->Set(0, Value::CreateStringValue(img1)); |
| 301 icons->Set(1, Value::CreateStringValue(img2)); | 301 icons->Set(1, Value::CreateStringValue(img2)); |
| 302 input.Set(keys::kPageActionIcons, icons); | 302 input.Set(keys::kPageActionIcons, icons); |
| 303 | 303 |
| 304 // Parse as page action and read back the values from the object. | 304 // Parse as page action and read back the values from the object. |
| 305 action.reset(extension.LoadExtensionActionHelper( | 305 action.reset(extension.LoadExtensionActionHelper( |
| 306 &input, 0, &error_msg, ExtensionAction::PAGE_ACTION)); | 306 &input, &error_msg, ExtensionAction::PAGE_ACTION)); |
| 307 ASSERT_TRUE(NULL != action.get()); | 307 ASSERT_TRUE(NULL != action.get()); |
| 308 ASSERT_STREQ("", error_msg.c_str()); | 308 ASSERT_STREQ("", error_msg.c_str()); |
| 309 ASSERT_STREQ(id.c_str(), action->id().c_str()); | 309 ASSERT_STREQ(id.c_str(), action->id().c_str()); |
| 310 ASSERT_STREQ(name.c_str(), action->name().c_str()); | 310 ASSERT_STREQ(name.c_str(), action->title().c_str()); |
| 311 ASSERT_EQ(2u, action->icon_paths().size()); | 311 ASSERT_EQ(2u, action->icon_paths().size()); |
| 312 ASSERT_STREQ(img1.c_str(), action->icon_paths()[0].c_str()); | 312 ASSERT_STREQ(img1.c_str(), action->icon_paths()[0].c_str()); |
| 313 ASSERT_STREQ(img2.c_str(), action->icon_paths()[1].c_str()); | 313 ASSERT_STREQ(img2.c_str(), action->icon_paths()[1].c_str()); |
| 314 ASSERT_EQ(ExtensionAction::PAGE_ACTION, action->type()); | 314 ASSERT_EQ(ExtensionAction::PAGE_ACTION, action->type()); |
| 315 | 315 |
| 316 // Now try the same, but as a browser action. | 316 // Now try the same, but as a browser action. |
| 317 action.reset(extension.LoadExtensionActionHelper( | 317 action.reset(extension.LoadExtensionActionHelper( |
| 318 &input, 0, &error_msg, ExtensionAction::BROWSER_ACTION)); | 318 &input, &error_msg, ExtensionAction::BROWSER_ACTION)); |
| 319 ASSERT_TRUE(NULL != action.get()); | 319 ASSERT_TRUE(NULL != action.get()); |
| 320 ASSERT_STREQ("", error_msg.c_str()); | 320 ASSERT_STREQ("", error_msg.c_str()); |
| 321 // Browser actions don't have an id, page actions do. | 321 // Browser actions don't have an id, page actions do. |
| 322 ASSERT_STREQ("", action->id().c_str()); | 322 ASSERT_STREQ("", action->id().c_str()); |
| 323 ASSERT_STREQ(name.c_str(), action->name().c_str()); | 323 ASSERT_STREQ(name.c_str(), action->title().c_str()); |
| 324 ASSERT_EQ(2u, action->icon_paths().size()); | 324 ASSERT_EQ(2u, action->icon_paths().size()); |
| 325 ASSERT_STREQ(img1.c_str(), action->icon_paths()[0].c_str()); | 325 ASSERT_STREQ(img1.c_str(), action->icon_paths()[0].c_str()); |
| 326 ASSERT_STREQ(img2.c_str(), action->icon_paths()[1].c_str()); | 326 ASSERT_STREQ(img2.c_str(), action->icon_paths()[1].c_str()); |
| 327 ASSERT_EQ(ExtensionAction::BROWSER_ACTION, action->type()); | 327 ASSERT_EQ(ExtensionAction::BROWSER_ACTION, action->type()); |
| 328 | 328 |
| 329 // Explicitly set the same type and parse again. | 329 // Explicitly set the same type and parse again. |
| 330 input.SetString(keys::kType, values::kPageActionTypeTab); | 330 input.SetString(keys::kType, values::kPageActionTypeTab); |
| 331 action.reset(extension.LoadExtensionActionHelper( | 331 action.reset(extension.LoadExtensionActionHelper( |
| 332 &input, 0, &error_msg, ExtensionAction::BROWSER_ACTION)); | 332 &input, &error_msg, ExtensionAction::BROWSER_ACTION)); |
| 333 ASSERT_TRUE(NULL != action.get()); | 333 ASSERT_TRUE(NULL != action.get()); |
| 334 ASSERT_STREQ("", error_msg.c_str()); | 334 ASSERT_STREQ("", error_msg.c_str()); |
| 335 ASSERT_EQ(ExtensionAction::BROWSER_ACTION, action->type()); | 335 ASSERT_EQ(ExtensionAction::BROWSER_ACTION, action->type()); |
| 336 | 336 |
| 337 // Explicitly set the PAGE_ACTION type and parse again. | 337 // Explicitly set the PAGE_ACTION type and parse again. |
| 338 input.SetString(keys::kType, values::kPageActionTypePermanent); | 338 input.SetString(keys::kType, values::kPageActionTypePermanent); |
| 339 action.reset(extension.LoadExtensionActionHelper( | 339 action.reset(extension.LoadExtensionActionHelper( |
| 340 &input, 0, &error_msg, ExtensionAction::PAGE_ACTION)); | 340 &input, &error_msg, ExtensionAction::PAGE_ACTION)); |
| 341 ASSERT_TRUE(NULL != action.get()); | 341 ASSERT_TRUE(NULL != action.get()); |
| 342 ASSERT_STREQ("", error_msg.c_str()); | 342 ASSERT_STREQ("", error_msg.c_str()); |
| 343 ASSERT_EQ(ExtensionAction::PAGE_ACTION, action->type()); | 343 ASSERT_EQ(ExtensionAction::PAGE_ACTION, action->type()); |
| 344 | 344 |
| 345 // Make a deep copy of the input and remove one key at a time and see if we | 345 // Make a deep copy of the input and remove one key at a time and see if we |
| 346 // get the right error. | 346 // get the right error. |
| 347 scoped_ptr<DictionaryValue> copy; | 347 scoped_ptr<DictionaryValue> copy; |
| 348 | 348 |
| 349 // First remove id key. | 349 // First remove id key. |
| 350 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); | 350 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); |
| 351 copy->Remove(keys::kPageActionId, NULL); | 351 copy->Remove(keys::kPageActionId, NULL); |
| 352 action.reset(extension.LoadExtensionActionHelper( | 352 action.reset(extension.LoadExtensionActionHelper( |
| 353 copy.get(), 0, &error_msg, ExtensionAction::PAGE_ACTION)); | 353 copy.get(), &error_msg, ExtensionAction::PAGE_ACTION)); |
| 354 ASSERT_TRUE(NULL == action.get()); | 354 ASSERT_TRUE(NULL != action.get()); |
| 355 ASSERT_TRUE(MatchPattern(error_msg.c_str(), | 355 ASSERT_STREQ("", error_msg.c_str()); |
| 356 errors::kInvalidPageActionId)); | |
| 357 error_msg = ""; | 356 error_msg = ""; |
| 358 | 357 |
| 359 // Same test (id key), but with browser action. | 358 // Same test (id key), but with browser action. |
| 360 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); | 359 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); |
| 361 copy->Remove(keys::kPageActionId, NULL); | 360 copy->Remove(keys::kPageActionId, NULL); |
| 362 action.reset(extension.LoadExtensionActionHelper( | 361 action.reset(extension.LoadExtensionActionHelper( |
| 363 copy.get(), 0, &error_msg, ExtensionAction::BROWSER_ACTION)); | 362 copy.get(), &error_msg, ExtensionAction::BROWSER_ACTION)); |
| 364 // Having no id is valid for browser actions. | 363 // Having no id is valid for browser actions. |
| 365 ASSERT_TRUE(NULL != action.get()); | 364 ASSERT_TRUE(NULL != action.get()); |
| 366 ASSERT_STREQ("", error_msg.c_str()); | 365 ASSERT_STREQ("", error_msg.c_str()); |
| 367 error_msg = ""; | 366 error_msg = ""; |
| 368 | 367 |
| 369 // Then remove the name key. | 368 // Then remove the name key. |
| 370 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); | 369 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); |
| 371 copy->Remove(keys::kName, NULL); | 370 copy->Remove(keys::kName, NULL); |
| 372 action.reset(extension.LoadExtensionActionHelper( | 371 action.reset(extension.LoadExtensionActionHelper( |
| 373 copy.get(), 0, &error_msg, ExtensionAction::PAGE_ACTION)); | 372 copy.get(), &error_msg, ExtensionAction::PAGE_ACTION)); |
| 374 ASSERT_TRUE(NULL == action.get()); | 373 ASSERT_TRUE(NULL == action.get()); |
| 375 ASSERT_TRUE(MatchPattern(error_msg.c_str(), | 374 ASSERT_TRUE(MatchPattern(error_msg.c_str(), |
| 376 errors::kInvalidName)); | 375 errors::kInvalidPageActionDefaultTitle)); |
| 377 error_msg = ""; | 376 error_msg = ""; |
| 378 | 377 |
| 379 // Same test (name key), but with browser action. | 378 // Same test (name key), but with browser action. |
| 380 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); | 379 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); |
| 381 copy->Remove(keys::kName, NULL); | 380 copy->Remove(keys::kName, NULL); |
| 382 action.reset(extension.LoadExtensionActionHelper( | 381 action.reset(extension.LoadExtensionActionHelper( |
| 383 copy.get(), 0, &error_msg, ExtensionAction::BROWSER_ACTION)); | 382 copy.get(), &error_msg, ExtensionAction::BROWSER_ACTION)); |
| 384 ASSERT_TRUE(NULL == action.get()); | 383 ASSERT_TRUE(NULL == action.get()); |
| 385 ASSERT_TRUE(MatchPattern(error_msg.c_str(), | 384 ASSERT_TRUE(MatchPattern(error_msg.c_str(), |
| 386 errors::kInvalidName)); | 385 errors::kInvalidPageActionDefaultTitle)); |
| 387 error_msg = ""; | 386 error_msg = ""; |
| 388 | 387 |
| 389 // Then remove the icon paths key. | 388 // Then remove the icon paths key. |
| 390 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); | 389 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); |
| 391 copy->Remove(keys::kPageActionIcons, NULL); | 390 copy->Remove(keys::kPageActionIcons, NULL); |
| 392 action.reset(extension.LoadExtensionActionHelper( | 391 action.reset(extension.LoadExtensionActionHelper( |
| 393 copy.get(), 0, &error_msg, ExtensionAction::PAGE_ACTION)); | 392 copy.get(), &error_msg, ExtensionAction::PAGE_ACTION)); |
| 394 ASSERT_TRUE(NULL == action.get()); | 393 ASSERT_TRUE(NULL != action.get()); |
| 395 ASSERT_TRUE(MatchPattern(error_msg.c_str(), | |
| 396 errors::kInvalidPageActionIconPaths)); | |
| 397 error_msg = ""; | 394 error_msg = ""; |
| 398 | 395 |
| 399 // Same test (name key), but with browser action (icons are not required for | 396 // Same test (name key), but with browser action. |
| 400 // browser actions). | |
| 401 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); | 397 copy.reset(static_cast<DictionaryValue*>(input.DeepCopy())); |
| 402 copy->Remove(keys::kPageActionIcons, NULL); | 398 copy->Remove(keys::kPageActionIcons, NULL); |
| 403 action.reset(extension.LoadExtensionActionHelper( | 399 action.reset(extension.LoadExtensionActionHelper( |
| 404 copy.get(), 0, &error_msg, ExtensionAction::BROWSER_ACTION)); | 400 copy.get(), &error_msg, ExtensionAction::BROWSER_ACTION)); |
| 405 ASSERT_TRUE(NULL != action.get()); | 401 ASSERT_TRUE(NULL != action.get()); |
| 402 |
| 403 // Now test that we can parse the new format for page actions. |
| 404 |
| 405 // Now setup some values to use in the page action. |
| 406 const std::string kTitle("MyExtensionActionTitle"); |
| 407 const std::string kIcon("image1.png"); |
| 408 |
| 409 // Add the dictionary for the contextual action. |
| 410 input.Clear(); |
| 411 input.SetString(keys::kPageActionDefaultTitle, kTitle); |
| 412 input.SetString(keys::kPageActionDefaultIcon, kIcon); |
| 413 |
| 414 // Parse as page action and read back the values from the object. |
| 415 action.reset(extension.LoadExtensionActionHelper( |
| 416 &input, &error_msg, ExtensionAction::PAGE_ACTION)); |
| 417 ASSERT_TRUE(action.get()); |
| 418 ASSERT_STREQ("", error_msg.c_str()); |
| 419 ASSERT_EQ(kTitle, action->title()); |
| 420 ASSERT_EQ(1u, action->icon_paths().size()); |
| 421 ASSERT_EQ(kIcon, action->icon_paths()[0]); |
| 422 ASSERT_EQ(ExtensionAction::PAGE_ACTION, action->type()); |
| 406 } | 423 } |
| 407 | 424 |
| 408 TEST(ExtensionTest, IdIsValid) { | 425 TEST(ExtensionTest, IdIsValid) { |
| 409 EXPECT_TRUE(Extension::IdIsValid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); | 426 EXPECT_TRUE(Extension::IdIsValid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); |
| 410 EXPECT_TRUE(Extension::IdIsValid("pppppppppppppppppppppppppppppppp")); | 427 EXPECT_TRUE(Extension::IdIsValid("pppppppppppppppppppppppppppppppp")); |
| 411 EXPECT_TRUE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnop")); | 428 EXPECT_TRUE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnop")); |
| 412 EXPECT_TRUE(Extension::IdIsValid("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")); | 429 EXPECT_TRUE(Extension::IdIsValid("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")); |
| 413 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno")); | 430 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno")); |
| 414 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnopa")); | 431 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnopa")); |
| 415 EXPECT_FALSE(Extension::IdIsValid("0123456789abcdef0123456789abcdef")); | 432 EXPECT_FALSE(Extension::IdIsValid("0123456789abcdef0123456789abcdef")); |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 scoped_ptr<Extension> new_extension( | 668 scoped_ptr<Extension> new_extension( |
| 652 LoadManifest("allow_silent_upgrade", | 669 LoadManifest("allow_silent_upgrade", |
| 653 std::string(kTests[i].base_name) + "_new.json")); | 670 std::string(kTests[i].base_name) + "_new.json")); |
| 654 | 671 |
| 655 EXPECT_EQ(kTests[i].expect_success, | 672 EXPECT_EQ(kTests[i].expect_success, |
| 656 Extension::IsPrivilegeIncrease(old_extension.get(), | 673 Extension::IsPrivilegeIncrease(old_extension.get(), |
| 657 new_extension.get())) | 674 new_extension.get())) |
| 658 << kTests[i].base_name; | 675 << kTests[i].base_name; |
| 659 } | 676 } |
| 660 } | 677 } |
| OLD | NEW |