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.
5 #include "chrome/browser/extensions/extension_test_message_listener.h"
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"
15 ExtensionTestMessageListener::ExtensionTestMessageListener(
16 const std::string& expected_message,
18 : expected_message_(expected_message),
21 wait_for_any_message_(false),
22 will_reply_(will_reply),
25 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_TEST_MESSAGE,
26 content::NotificationService::AllSources());
29 ExtensionTestMessageListener::ExtensionTestMessageListener(bool will_reply)
32 wait_for_any_message_(true),
33 will_reply_(will_reply),
37 chrome::NOTIFICATION_EXTENSION_TEST_MESSAGE,
38 content::NotificationService::AllSources());
41 ExtensionTestMessageListener::~ExtensionTestMessageListener() {}
43 bool ExtensionTestMessageListener::WaitUntilSatisfied() {
47 content::RunMessageLoop();
51 void ExtensionTestMessageListener::Reply(const std::string& message) {
56 function_->Reply(message);
60 void ExtensionTestMessageListener::Reply(int message) {
61 Reply(base::IntToString(message));
64 void ExtensionTestMessageListener::Reset() {
71 void ExtensionTestMessageListener::Observe(
73 const content::NotificationSource& source,
74 const content::NotificationDetails& details) {
75 // Return immediately if we're already satisfied or it's not the right
77 extensions::TestSendMessageFunction* function =
78 content::Source<extensions::TestSendMessageFunction>(source).ptr();
80 (!extension_id_.empty() && function->extension_id() != extension_id_)) {
84 // We should have an empty message if we're not already satisfied.
85 CHECK(message_.empty());
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_)) {
92 failed_ = (message_ == failure_message_);
94 // Reply immediately, or save the function for future use.
97 Reply(base::EmptyString());
101 base::MessageLoopForUI::current()->Quit();