extension_test_message_listener.cc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. #include "extensions/test/extension_test_message_listener.h"
  5. #include "base/run_loop.h"
  6. #include "base/strings/string_number_conversions.h"
  7. #include "base/strings/string_util.h"
  8. #include "content/public/test/test_utils.h"
  9. #include "extensions/browser/api/test/test_api.h"
  10. ExtensionTestMessageListener::ExtensionTestMessageListener(
  11. const std::string& expected_message,
  12. ReplyBehavior reply_behavior)
  13. : expected_message_(expected_message), reply_behavior_(reply_behavior) {
  14. test_api_observation_.Observe(
  15. extensions::TestApiObserverRegistry::GetInstance());
  16. }
  17. ExtensionTestMessageListener::ExtensionTestMessageListener(
  18. ReplyBehavior reply_behavior)
  19. : reply_behavior_(reply_behavior) {
  20. test_api_observation_.Observe(
  21. extensions::TestApiObserverRegistry::GetInstance());
  22. }
  23. ExtensionTestMessageListener::~ExtensionTestMessageListener() {
  24. DCHECK(!function_) << "MessageListener did not reply, but signaled it would.";
  25. }
  26. bool ExtensionTestMessageListener::WaitUntilSatisfied() {
  27. if (satisfied_)
  28. return !failed_;
  29. base::RunLoop run_loop;
  30. quit_wait_closure_ = run_loop.QuitWhenIdleClosure();
  31. run_loop.Run();
  32. return !failed_;
  33. }
  34. void ExtensionTestMessageListener::Reply(const std::string& message) {
  35. CHECK(satisfied_);
  36. CHECK(function_);
  37. function_->Reply(message);
  38. function_.reset();
  39. }
  40. void ExtensionTestMessageListener::Reply(int message) {
  41. Reply(base::NumberToString(message));
  42. }
  43. void ExtensionTestMessageListener::ReplyWithError(const std::string& error) {
  44. CHECK(satisfied_);
  45. CHECK(function_);
  46. function_->ReplyWithError(error);
  47. function_.reset();
  48. }
  49. void ExtensionTestMessageListener::Reset() {
  50. DCHECK(!function_) << "MessageListener did not reply, but signaled it would.";
  51. satisfied_ = false;
  52. failed_ = false;
  53. message_.clear();
  54. had_user_gesture_ = false;
  55. extension_id_for_message_.clear();
  56. }
  57. bool ExtensionTestMessageListener::OnTestMessage(
  58. extensions::TestSendMessageFunction* function,
  59. const std::string& message) {
  60. // Return immediately if we're already satisfied or it's not the right
  61. // extension.
  62. std::string sender_extension_id;
  63. if (function->extension())
  64. sender_extension_id = function->extension_id();
  65. if (satisfied_ ||
  66. (!extension_id_.empty() && sender_extension_id != extension_id_) ||
  67. (browser_context_ && function->browser_context() != browser_context_)) {
  68. return false;
  69. }
  70. // We should have an empty message if we're not already satisfied.
  71. CHECK(message_.empty());
  72. CHECK(extension_id_for_message_.empty());
  73. bool listener_will_respond = false;
  74. const bool wait_for_any_message = !expected_message_;
  75. const bool is_expected_message =
  76. expected_message_ && message == *expected_message_;
  77. const bool is_failure_message =
  78. failure_message_ && message == *failure_message_;
  79. if (is_expected_message || wait_for_any_message || is_failure_message) {
  80. message_ = message;
  81. extension_id_for_message_ = sender_extension_id;
  82. satisfied_ = true;
  83. failed_ = is_failure_message;
  84. had_user_gesture_ = function->user_gesture();
  85. if (reply_behavior_ == ReplyBehavior::kWillReply) {
  86. listener_will_respond = true;
  87. function_ = function;
  88. }
  89. if (quit_wait_closure_)
  90. std::move(quit_wait_closure_).Run();
  91. if (on_satisfied_)
  92. std::move(on_satisfied_).Run(message);
  93. if (on_repeatedly_satisfied_)
  94. on_repeatedly_satisfied_.Run(message);
  95. }
  96. return listener_will_respond;
  97. }