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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/extension_test_message_listener.h" 6 7 #include "base/strings/string_number_conversions.h" 8 #include "base/strings/string_util.h" 9 #include "chrome/browser/chrome_notification_types.h" 10 #include "content/public/browser/notification_service.h" 11 #include "content/public/browser/notification_source.h" 12 #include "content/public/test/test_utils.h" 13 #include "extensions/browser/api/test/test_api.h" 14 15 ExtensionTestMessageListener::ExtensionTestMessageListener( 16 const std::string& expected_message, 17 bool will_reply) 18 : expected_message_(expected_message), 19 satisfied_(false), 20 waiting_(false), 21 wait_for_any_message_(false), 22 will_reply_(will_reply), 23 replied_(false), 24 failed_(false) { 25 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_TEST_MESSAGE, 26 content::NotificationService::AllSources()); 27 } 28 29 ExtensionTestMessageListener::ExtensionTestMessageListener(bool will_reply) 30 : satisfied_(false), 31 waiting_(false), 32 wait_for_any_message_(true), 33 will_reply_(will_reply), 34 replied_(false), 35 failed_(false) { 36 registrar_.Add(this, 37 chrome::NOTIFICATION_EXTENSION_TEST_MESSAGE, 38 content::NotificationService::AllSources()); 39 } 40 41 ExtensionTestMessageListener::~ExtensionTestMessageListener() {} 42 43 bool ExtensionTestMessageListener::WaitUntilSatisfied() { 44 if (satisfied_) 45 return !failed_; 46 waiting_ = true; 47 content::RunMessageLoop(); 48 return !failed_; 49 } 50 51 void ExtensionTestMessageListener::Reply(const std::string& message) { 52 CHECK(satisfied_); 53 CHECK(!replied_); 54 55 replied_ = true; 56 function_->Reply(message); 57 function_ = NULL; 58 } 59 60 void ExtensionTestMessageListener::Reply(int message) { 61 Reply(base::IntToString(message)); 62 } 63 64 void ExtensionTestMessageListener::Reset() { 65 satisfied_ = false; 66 failed_ = false; 67 message_.clear(); 68 replied_ = false; 69 } 70 71 void ExtensionTestMessageListener::Observe( 72 int type, 73 const content::NotificationSource& source, 74 const content::NotificationDetails& details) { 75 // Return immediately if we're already satisfied or it's not the right 76 // extension. 77 extensions::TestSendMessageFunction* function = 78 content::Source<extensions::TestSendMessageFunction>(source).ptr(); 79 if (satisfied_ || 80 (!extension_id_.empty() && function->extension_id() != extension_id_)) { 81 return; 82 } 83 84 // We should have an empty message if we're not already satisfied. 85 CHECK(message_.empty()); 86 87 const std::string& message = *content::Details<std::string>(details).ptr(); 88 if (message == expected_message_ || wait_for_any_message_ || 89 (!failure_message_.empty() && message == failure_message_)) { 90 message_ = message; 91 satisfied_ = true; 92 failed_ = (message_ == failure_message_); 93 94 // Reply immediately, or save the function for future use. 95 function_ = function; 96 if (!will_reply_) 97 Reply(std::string()); 98 99 if (waiting_) { 100 waiting_ = false; 101 base::MessageLoopForUI::current()->Quit(); 102 } 103 } 104 } 105