| Index: chrome/browser/extensions/extension_menu_manager_unittest.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/extension_menu_manager_unittest.cc (revision 117097)
|
| +++ chrome/browser/extensions/extension_menu_manager_unittest.cc (working copy)
|
| @@ -493,3 +493,95 @@
|
| ASSERT_TRUE(info->GetBoolean("editable", &bool_tmp));
|
| ASSERT_EQ(params.is_editable, bool_tmp);
|
| }
|
| +
|
| +// Test that there is always only one radio item selected.
|
| +TEST_F(ExtensionMenuManagerTest, SanitizeRadioButtons) {
|
| + Extension* extension = AddExtension("test");
|
| +
|
| + // A single unchecked item should get checked
|
| + ExtensionMenuItem* item1 = CreateTestItem(extension);
|
| +
|
| + item1->set_type(ExtensionMenuItem::RADIO);
|
| + item1->SetChecked(false);
|
| + ASSERT_FALSE(item1->checked());
|
| + manager_.AddContextItem(extension, item1);
|
| + ASSERT_TRUE(item1->checked());
|
| +
|
| + // In a run of two unchecked items, the first should get selected.
|
| + item1->SetChecked(false);
|
| + ExtensionMenuItem* item2 = CreateTestItem(extension);
|
| + item2->set_type(ExtensionMenuItem::RADIO);
|
| + item2->SetChecked(false);
|
| + ASSERT_FALSE(item1->checked());
|
| + ASSERT_FALSE(item2->checked());
|
| + manager_.AddContextItem(extension, item2);
|
| + ASSERT_TRUE(item1->checked());
|
| + ASSERT_FALSE(item2->checked());
|
| +
|
| + // If multiple items are checked, only the last item should get checked.
|
| + item1->SetChecked(true);
|
| + item2->SetChecked(true);
|
| + ASSERT_TRUE(item1->checked());
|
| + ASSERT_TRUE(item2->checked());
|
| + manager_.ItemUpdated(item1->id());
|
| + ASSERT_FALSE(item1->checked());
|
| + ASSERT_TRUE(item2->checked());
|
| +
|
| + // If the checked item is removed, the new first item should get checked.
|
| + item1->SetChecked(false);
|
| + item2->SetChecked(true);
|
| + ASSERT_FALSE(item1->checked());
|
| + ASSERT_TRUE(item2->checked());
|
| + manager_.RemoveContextMenuItem(item2->id());
|
| + item2 = NULL;
|
| + ASSERT_TRUE(item1->checked());
|
| +
|
| + // If a checked item is added to a run that already has a checked item,
|
| + // then the new item should get checked.
|
| + item1->SetChecked(true);
|
| + ExtensionMenuItem* new_item = CreateTestItem(extension);
|
| + new_item->set_type(ExtensionMenuItem::RADIO);
|
| + new_item->SetChecked(true);
|
| + ASSERT_TRUE(item1->checked());
|
| + ASSERT_TRUE(new_item->checked());
|
| + manager_.AddContextItem(extension, new_item);
|
| + ASSERT_FALSE(item1->checked());
|
| + ASSERT_TRUE(new_item->checked());
|
| + // Make sure that children are checked as well.
|
| + ExtensionMenuItem* parent = CreateTestItem(extension);
|
| + manager_.AddContextItem(extension, parent);
|
| + ExtensionMenuItem* child1 = CreateTestItem(extension);
|
| + child1->set_type(ExtensionMenuItem::RADIO);
|
| + child1->SetChecked(false);
|
| + ExtensionMenuItem* child2 = CreateTestItem(extension);
|
| + child2->set_type(ExtensionMenuItem::RADIO);
|
| + child2->SetChecked(true);
|
| + ASSERT_FALSE(child1->checked());
|
| + ASSERT_TRUE(child2->checked());
|
| +
|
| + manager_.AddChildItem(parent->id(), child1);
|
| + ASSERT_TRUE(child1->checked());
|
| +
|
| + manager_.AddChildItem(parent->id(), child2);
|
| + ASSERT_FALSE(child1->checked());
|
| + ASSERT_TRUE(child2->checked());
|
| +
|
| + // Removing the checked item from the children should cause the
|
| + // remaining child to be checked.
|
| + manager_.RemoveContextMenuItem(child2->id());
|
| + child2 = NULL;
|
| + ASSERT_TRUE(child1->checked());
|
| +
|
| + // This should NOT cause |new_item| to be deseleted because
|
| + // |parent| will be seperating the two runs of radio items.
|
| + manager_.ChangeParent(child1->id(), NULL);
|
| + ASSERT_TRUE(new_item->checked());
|
| + ASSERT_TRUE(child1->checked());
|
| +
|
| + // Removing |parent| should cause only |child1| to be selected.
|
| + manager_.RemoveContextMenuItem(parent->id());
|
| + parent = NULL;
|
| + ASSERT_FALSE(new_item->checked());
|
| + ASSERT_TRUE(child1->checked());
|
| +}
|
| +
|
|
|