test_guest_view_manager.cc 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. // Copyright 2014 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 "components/guest_view/browser/test_guest_view_manager.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "components/guest_view/browser/guest_view_base.h"
  8. #include "components/guest_view/browser/guest_view_manager_delegate.h"
  9. #include "content/public/browser/render_frame_host.h"
  10. #include "content/public/browser/web_contents.h"
  11. #include "content/public/test/browser_test_utils.h"
  12. namespace {
  13. // Returns the current RFH owned by the FrameTreeNode, denoted by
  14. // |frame_tree_node_id|.
  15. content::RenderFrameHost* GetCurrentGuestMainRenderFrameHost(
  16. int frame_tree_node_id) {
  17. auto* web_contents =
  18. content::WebContents::FromFrameTreeNodeId(frame_tree_node_id);
  19. DCHECK(web_contents);
  20. return web_contents->UnsafeFindFrameByFrameTreeNodeId(frame_tree_node_id);
  21. }
  22. } // namespace
  23. namespace guest_view {
  24. TestGuestViewManager::TestGuestViewManager(
  25. content::BrowserContext* context,
  26. std::unique_ptr<GuestViewManagerDelegate> delegate)
  27. : GuestViewManager(context, std::move(delegate)),
  28. num_embedder_processes_destroyed_(0),
  29. num_guests_created_(0),
  30. expected_num_guests_created_(0),
  31. num_views_garbage_collected_(0),
  32. waiting_for_guests_created_(false),
  33. waiting_for_attach_(nullptr) {}
  34. TestGuestViewManager::~TestGuestViewManager() = default;
  35. size_t TestGuestViewManager::GetNumGuestsActive() const {
  36. return guest_web_contents_by_instance_id_.size();
  37. }
  38. size_t TestGuestViewManager::GetNumRemovedInstanceIDs() const {
  39. return removed_instance_ids_.size();
  40. }
  41. content::RenderFrameHost*
  42. TestGuestViewManager::GetLastGuestRenderFrameHostCreated() {
  43. for (auto it = guest_view_watchers_.rbegin();
  44. it != guest_view_watchers_.rend(); ++it) {
  45. const auto& watcher = *it;
  46. if (!watcher->IsDeleted()) {
  47. return GetCurrentGuestMainRenderFrameHost(watcher->GetFrameTreeNodeId());
  48. }
  49. }
  50. return nullptr;
  51. }
  52. content::WebContents* TestGuestViewManager::DeprecatedGetLastGuestCreated() {
  53. return content::WebContents::FromRenderFrameHost(
  54. GetLastGuestRenderFrameHostCreated());
  55. }
  56. GuestViewBase* TestGuestViewManager::GetLastGuestViewCreated() {
  57. auto* last_guest = DeprecatedGetLastGuestCreated();
  58. return GuestViewBase::FromWebContents(last_guest);
  59. }
  60. void TestGuestViewManager::WaitForAllGuestsDeleted() {
  61. // Make sure that every guest that was created has been removed.
  62. for (auto& watcher : guest_view_watchers_) {
  63. watcher->Wait();
  64. }
  65. }
  66. void TestGuestViewManager::WaitForLastGuestDeleted() {
  67. // Wait for the last guest that was created to be deleted.
  68. guest_view_watchers_.back()->Wait();
  69. }
  70. content::RenderFrameHost*
  71. TestGuestViewManager::WaitForSingleGuestRenderFrameHostCreated() {
  72. if (!GetNumGuestsActive()) {
  73. // Guests have been created and subsequently destroyed.
  74. if (num_guests_created() > 0)
  75. return nullptr;
  76. WaitForNumGuestsCreated(1u);
  77. }
  78. return GetLastGuestRenderFrameHostCreated();
  79. }
  80. content::WebContents*
  81. TestGuestViewManager::DeprecatedWaitForSingleGuestCreated() {
  82. return content::WebContents::FromRenderFrameHost(
  83. WaitForSingleGuestRenderFrameHostCreated());
  84. }
  85. GuestViewBase* TestGuestViewManager::WaitForSingleGuestViewCreated() {
  86. return GuestViewBase::FromWebContents(DeprecatedWaitForSingleGuestCreated());
  87. }
  88. content::RenderFrameHost*
  89. TestGuestViewManager::WaitForNextGuestRenderFrameHostCreated() {
  90. created_run_loop_ = std::make_unique<base::RunLoop>();
  91. created_run_loop_->Run();
  92. return GetLastGuestRenderFrameHostCreated();
  93. }
  94. content::WebContents*
  95. TestGuestViewManager::DeprecatedWaitForNextGuestCreated() {
  96. return content::WebContents::FromRenderFrameHost(
  97. WaitForNextGuestRenderFrameHostCreated());
  98. }
  99. GuestViewBase* TestGuestViewManager::WaitForNextGuestViewCreated() {
  100. return GuestViewBase::FromWebContents(DeprecatedWaitForNextGuestCreated());
  101. }
  102. void TestGuestViewManager::WaitForNumGuestsCreated(size_t count) {
  103. if (count == num_guests_created_)
  104. return;
  105. waiting_for_guests_created_ = true;
  106. expected_num_guests_created_ = count;
  107. num_created_run_loop_ = std::make_unique<base::RunLoop>();
  108. num_created_run_loop_->Run();
  109. }
  110. void TestGuestViewManager::WaitUntilAttached(GuestViewBase* guest_view) {
  111. if (guest_view->attached())
  112. return;
  113. waiting_for_attach_ = guest_view;
  114. attached_run_loop_ = std::make_unique<base::RunLoop>();
  115. attached_run_loop_->Run();
  116. }
  117. void TestGuestViewManager::WaitForViewGarbageCollected() {
  118. gc_run_loop_ = std::make_unique<base::RunLoop>();
  119. gc_run_loop_->Run();
  120. }
  121. void TestGuestViewManager::WaitForSingleViewGarbageCollected() {
  122. if (!num_views_garbage_collected())
  123. WaitForViewGarbageCollected();
  124. }
  125. void TestGuestViewManager::AddGuest(int guest_instance_id,
  126. content::WebContents* guest_web_contents) {
  127. GuestViewManager::AddGuest(guest_instance_id, guest_web_contents);
  128. guest_view_watchers_.push_back(
  129. std::make_unique<content::FrameDeletedObserver>(
  130. guest_web_contents->GetPrimaryMainFrame()));
  131. if (created_run_loop_)
  132. created_run_loop_->Quit();
  133. ++num_guests_created_;
  134. if (!waiting_for_guests_created_ &&
  135. num_guests_created_ != expected_num_guests_created_) {
  136. return;
  137. }
  138. if (num_created_run_loop_)
  139. num_created_run_loop_->Quit();
  140. }
  141. void TestGuestViewManager::AttachGuest(int embedder_process_id,
  142. int element_instance_id,
  143. int guest_instance_id,
  144. const base::Value::Dict& attach_params) {
  145. GuestViewManager::AttachGuest(embedder_process_id, element_instance_id,
  146. guest_instance_id, attach_params);
  147. if (waiting_for_attach_ &&
  148. (waiting_for_attach_ ==
  149. GuestViewBase::From(embedder_process_id, guest_instance_id))) {
  150. attached_run_loop_->Quit();
  151. waiting_for_attach_ = nullptr;
  152. }
  153. }
  154. void TestGuestViewManager::DeprecatedGetGuestWebContentsList(
  155. std::vector<content::WebContents*>* guest_web_contents_list) {
  156. for (auto& watcher : guest_view_watchers_) {
  157. if (!watcher->IsDeleted()) {
  158. auto ftn_id = watcher->GetFrameTreeNodeId();
  159. guest_web_contents_list->push_back(
  160. content::WebContents::FromFrameTreeNodeId(ftn_id));
  161. }
  162. }
  163. }
  164. void TestGuestViewManager::GetGuestRenderFrameHostList(
  165. std::vector<content::RenderFrameHost*>* guest_render_frame_host_list) {
  166. for (auto& watcher : guest_view_watchers_) {
  167. if (!watcher->IsDeleted()) {
  168. guest_render_frame_host_list->push_back(
  169. GetCurrentGuestMainRenderFrameHost(watcher->GetFrameTreeNodeId()));
  170. }
  171. }
  172. }
  173. void TestGuestViewManager::EmbedderProcessDestroyed(int embedder_process_id) {
  174. ++num_embedder_processes_destroyed_;
  175. GuestViewManager::EmbedderProcessDestroyed(embedder_process_id);
  176. }
  177. void TestGuestViewManager::ViewGarbageCollected(int embedder_process_id,
  178. int view_instance_id) {
  179. GuestViewManager::ViewGarbageCollected(embedder_process_id, view_instance_id);
  180. ++num_views_garbage_collected_;
  181. if (gc_run_loop_)
  182. gc_run_loop_->Quit();
  183. }
  184. // Test factory for creating test instances of GuestViewManager.
  185. TestGuestViewManagerFactory::TestGuestViewManagerFactory()
  186. : test_guest_view_manager_(nullptr) {}
  187. TestGuestViewManagerFactory::~TestGuestViewManagerFactory() {
  188. }
  189. GuestViewManager* TestGuestViewManagerFactory::CreateGuestViewManager(
  190. content::BrowserContext* context,
  191. std::unique_ptr<GuestViewManagerDelegate> delegate) {
  192. if (!test_guest_view_manager_) {
  193. test_guest_view_manager_ =
  194. new TestGuestViewManager(context, std::move(delegate));
  195. }
  196. return test_guest_view_manager_;
  197. }
  198. } // namespace guest_view