1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/extension_test_message_listener.h" 6 7 #include "chrome/browser/extensions/extension_test_api.h" 8 #include "chrome/test/ui_test_utils.h" 9 #include "content/common/notification_service.h" 10 #include "content/common/notification_type.h" 11 12 ExtensionTestMessageListener::ExtensionTestMessageListener( 13 const std::string& expected_message, 14 bool will_reply) 15 : expected_message_(expected_message), 16 satisfied_(false), 17 waiting_(false), 18 will_reply_(will_reply) { 19 registrar_.Add(this, NotificationType::EXTENSION_TEST_MESSAGE, 20 NotificationService::AllSources()); 21 } 22 23 ExtensionTestMessageListener::~ExtensionTestMessageListener() {} 24 25 bool ExtensionTestMessageListener::WaitUntilSatisfied() { 26 if (satisfied_) 27 return true; 28 waiting_ = true; 29 ui_test_utils::RunMessageLoop(); 30 return satisfied_; 31 } 32 33 void ExtensionTestMessageListener::Reply(const std::string& message) { 34 DCHECK(satisfied_); 35 DCHECK(will_reply_); 36 function_->Reply(message); 37 function_ = NULL; 38 will_reply_ = false; 39 } 40 41 void ExtensionTestMessageListener::Observe( 42 NotificationType type, 43 const NotificationSource& source, 44 const NotificationDetails& details) { 45 const std::string& content = *Details<std::string>(details).ptr(); 46 if (!satisfied_ && content == expected_message_) { 47 function_ = Source<ExtensionTestSendMessageFunction>(source).ptr(); 48 satisfied_ = true; 49 registrar_.RemoveAll(); // Stop listening for more messages. 50 if (!will_reply_) { 51 function_->Reply(""); 52 function_ = NULL; 53 } 54 if (waiting_) { 55 waiting_ = false; 56 MessageLoopForUI::current()->Quit(); 57 } 58 } 59 } 60