Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / extension_test_message_listener.cc
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(base::EmptyString());
98
99     if (waiting_) {
100       waiting_ = false;
101       base::MessageLoopForUI::current()->Quit();
102     }
103   }
104 }