| Index: ui/views/controls/combobox/combobox_unittest.cc | 
| diff --git a/ui/views/controls/combobox/combobox_unittest.cc b/ui/views/controls/combobox/combobox_unittest.cc | 
| index 3637c087b1db6a7dd602668317659201339920e1..087313f820f83186446a1b22aa2562da829cd8d9 100644 | 
| --- a/ui/views/controls/combobox/combobox_unittest.cc | 
| +++ b/ui/views/controls/combobox/combobox_unittest.cc | 
| @@ -6,19 +6,23 @@ | 
|  | 
| #include <set> | 
|  | 
| +#include "base/basictypes.h" | 
| #include "base/strings/utf_string_conversions.h" | 
| #include "ui/base/models/combobox_model.h" | 
| #include "ui/events/event.h" | 
| #include "ui/events/keycodes/keyboard_codes.h" | 
| +#include "ui/views/controls/combobox/combobox_listener.h" | 
| #include "ui/views/ime/mock_input_method.h" | 
| #include "ui/views/test/views_test_base.h" | 
| #include "ui/views/widget/widget.h" | 
|  | 
| +namespace views { | 
| + | 
| namespace { | 
|  | 
| // A wrapper of Combobox to intercept the result of OnKeyPressed() and | 
| // OnKeyReleased() methods. | 
| -class TestCombobox : public views::Combobox { | 
| +class TestCombobox : public Combobox { | 
| public: | 
| explicit TestCombobox(ui::ComboboxModel* model) | 
| : Combobox(model), | 
| @@ -28,13 +32,13 @@ class TestCombobox : public views::Combobox { | 
|  | 
| virtual bool OnKeyPressed(const ui::KeyEvent& e) OVERRIDE { | 
| key_received_ = true; | 
| -    key_handled_ = views::Combobox::OnKeyPressed(e); | 
| +    key_handled_ = Combobox::OnKeyPressed(e); | 
| return key_handled_; | 
| } | 
|  | 
| virtual bool OnKeyReleased(const ui::KeyEvent& e) OVERRIDE { | 
| key_received_ = true; | 
| -    key_handled_ = views::Combobox::OnKeyReleased(e); | 
| +    key_handled_ = Combobox::OnKeyReleased(e); | 
| return key_handled_; | 
| } | 
|  | 
| @@ -83,9 +87,26 @@ class TestComboboxModel : public ui::ComboboxModel { | 
| DISALLOW_COPY_AND_ASSIGN(TestComboboxModel); | 
| }; | 
|  | 
| -}  // namespace | 
| +class EvilListener : public ComboboxListener { | 
| + public: | 
| +  EvilListener() : deleted_(false) {}; | 
| +  virtual ~EvilListener() {}; | 
|  | 
| -namespace views { | 
| +  // ComboboxListener: | 
| +  virtual void OnSelectedIndexChanged(Combobox* combobox) OVERRIDE { | 
| +    delete combobox; | 
| +    deleted_ = true; | 
| +  } | 
| + | 
| +  bool deleted() const { return deleted_; } | 
| + | 
| + private: | 
| +  bool deleted_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(EvilListener); | 
| +}; | 
| + | 
| +}  // namespace | 
|  | 
| class ComboboxTest : public ViewsTestBase { | 
| public: | 
| @@ -340,4 +361,13 @@ TEST_F(ComboboxTest, SelectValue) { | 
| EXPECT_EQ(1, combobox_->selected_index()); | 
| } | 
|  | 
| +TEST_F(ComboboxTest, ListenerHandlesDelete) { | 
| +  TestComboboxModel model; | 
| +  TestCombobox* combobox = new TestCombobox(&model);  // Deleted on change. | 
| +  EvilListener evil_listener; | 
| +  combobox->set_listener(&evil_listener); | 
| +  ASSERT_NO_FATAL_FAILURE(combobox->ExecuteCommand(2)); | 
| +  EXPECT_TRUE(evil_listener.deleted()); | 
| +} | 
| + | 
| }  // namespace views | 
|  |