123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- // Copyright 2014 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "components/guest_view/browser/test_guest_view_manager.h"
- #include <memory>
- #include <utility>
- #include "components/guest_view/browser/guest_view_base.h"
- #include "components/guest_view/browser/guest_view_manager_delegate.h"
- #include "content/public/browser/render_frame_host.h"
- #include "content/public/browser/web_contents.h"
- #include "content/public/test/browser_test_utils.h"
- namespace {
- // Returns the current RFH owned by the FrameTreeNode, denoted by
- // |frame_tree_node_id|.
- content::RenderFrameHost* GetCurrentGuestMainRenderFrameHost(
- int frame_tree_node_id) {
- auto* web_contents =
- content::WebContents::FromFrameTreeNodeId(frame_tree_node_id);
- DCHECK(web_contents);
- return web_contents->UnsafeFindFrameByFrameTreeNodeId(frame_tree_node_id);
- }
- } // namespace
- namespace guest_view {
- TestGuestViewManager::TestGuestViewManager(
- content::BrowserContext* context,
- std::unique_ptr<GuestViewManagerDelegate> delegate)
- : GuestViewManager(context, std::move(delegate)),
- num_embedder_processes_destroyed_(0),
- num_guests_created_(0),
- expected_num_guests_created_(0),
- num_views_garbage_collected_(0),
- waiting_for_guests_created_(false),
- waiting_for_attach_(nullptr) {}
- TestGuestViewManager::~TestGuestViewManager() = default;
- size_t TestGuestViewManager::GetNumGuestsActive() const {
- return guest_web_contents_by_instance_id_.size();
- }
- size_t TestGuestViewManager::GetNumRemovedInstanceIDs() const {
- return removed_instance_ids_.size();
- }
- content::RenderFrameHost*
- TestGuestViewManager::GetLastGuestRenderFrameHostCreated() {
- for (auto it = guest_view_watchers_.rbegin();
- it != guest_view_watchers_.rend(); ++it) {
- const auto& watcher = *it;
- if (!watcher->IsDeleted()) {
- return GetCurrentGuestMainRenderFrameHost(watcher->GetFrameTreeNodeId());
- }
- }
- return nullptr;
- }
- content::WebContents* TestGuestViewManager::DeprecatedGetLastGuestCreated() {
- return content::WebContents::FromRenderFrameHost(
- GetLastGuestRenderFrameHostCreated());
- }
- GuestViewBase* TestGuestViewManager::GetLastGuestViewCreated() {
- auto* last_guest = DeprecatedGetLastGuestCreated();
- return GuestViewBase::FromWebContents(last_guest);
- }
- void TestGuestViewManager::WaitForAllGuestsDeleted() {
- // Make sure that every guest that was created has been removed.
- for (auto& watcher : guest_view_watchers_) {
- watcher->Wait();
- }
- }
- void TestGuestViewManager::WaitForLastGuestDeleted() {
- // Wait for the last guest that was created to be deleted.
- guest_view_watchers_.back()->Wait();
- }
- content::RenderFrameHost*
- TestGuestViewManager::WaitForSingleGuestRenderFrameHostCreated() {
- if (!GetNumGuestsActive()) {
- // Guests have been created and subsequently destroyed.
- if (num_guests_created() > 0)
- return nullptr;
- WaitForNumGuestsCreated(1u);
- }
- return GetLastGuestRenderFrameHostCreated();
- }
- content::WebContents*
- TestGuestViewManager::DeprecatedWaitForSingleGuestCreated() {
- return content::WebContents::FromRenderFrameHost(
- WaitForSingleGuestRenderFrameHostCreated());
- }
- GuestViewBase* TestGuestViewManager::WaitForSingleGuestViewCreated() {
- return GuestViewBase::FromWebContents(DeprecatedWaitForSingleGuestCreated());
- }
- content::RenderFrameHost*
- TestGuestViewManager::WaitForNextGuestRenderFrameHostCreated() {
- created_run_loop_ = std::make_unique<base::RunLoop>();
- created_run_loop_->Run();
- return GetLastGuestRenderFrameHostCreated();
- }
- content::WebContents*
- TestGuestViewManager::DeprecatedWaitForNextGuestCreated() {
- return content::WebContents::FromRenderFrameHost(
- WaitForNextGuestRenderFrameHostCreated());
- }
- GuestViewBase* TestGuestViewManager::WaitForNextGuestViewCreated() {
- return GuestViewBase::FromWebContents(DeprecatedWaitForNextGuestCreated());
- }
- void TestGuestViewManager::WaitForNumGuestsCreated(size_t count) {
- if (count == num_guests_created_)
- return;
- waiting_for_guests_created_ = true;
- expected_num_guests_created_ = count;
- num_created_run_loop_ = std::make_unique<base::RunLoop>();
- num_created_run_loop_->Run();
- }
- void TestGuestViewManager::WaitUntilAttached(GuestViewBase* guest_view) {
- if (guest_view->attached())
- return;
- waiting_for_attach_ = guest_view;
- attached_run_loop_ = std::make_unique<base::RunLoop>();
- attached_run_loop_->Run();
- }
- void TestGuestViewManager::WaitForViewGarbageCollected() {
- gc_run_loop_ = std::make_unique<base::RunLoop>();
- gc_run_loop_->Run();
- }
- void TestGuestViewManager::WaitForSingleViewGarbageCollected() {
- if (!num_views_garbage_collected())
- WaitForViewGarbageCollected();
- }
- void TestGuestViewManager::AddGuest(int guest_instance_id,
- content::WebContents* guest_web_contents) {
- GuestViewManager::AddGuest(guest_instance_id, guest_web_contents);
- guest_view_watchers_.push_back(
- std::make_unique<content::FrameDeletedObserver>(
- guest_web_contents->GetPrimaryMainFrame()));
- if (created_run_loop_)
- created_run_loop_->Quit();
- ++num_guests_created_;
- if (!waiting_for_guests_created_ &&
- num_guests_created_ != expected_num_guests_created_) {
- return;
- }
- if (num_created_run_loop_)
- num_created_run_loop_->Quit();
- }
- void TestGuestViewManager::AttachGuest(int embedder_process_id,
- int element_instance_id,
- int guest_instance_id,
- const base::Value::Dict& attach_params) {
- GuestViewManager::AttachGuest(embedder_process_id, element_instance_id,
- guest_instance_id, attach_params);
- if (waiting_for_attach_ &&
- (waiting_for_attach_ ==
- GuestViewBase::From(embedder_process_id, guest_instance_id))) {
- attached_run_loop_->Quit();
- waiting_for_attach_ = nullptr;
- }
- }
- void TestGuestViewManager::DeprecatedGetGuestWebContentsList(
- std::vector<content::WebContents*>* guest_web_contents_list) {
- for (auto& watcher : guest_view_watchers_) {
- if (!watcher->IsDeleted()) {
- auto ftn_id = watcher->GetFrameTreeNodeId();
- guest_web_contents_list->push_back(
- content::WebContents::FromFrameTreeNodeId(ftn_id));
- }
- }
- }
- void TestGuestViewManager::GetGuestRenderFrameHostList(
- std::vector<content::RenderFrameHost*>* guest_render_frame_host_list) {
- for (auto& watcher : guest_view_watchers_) {
- if (!watcher->IsDeleted()) {
- guest_render_frame_host_list->push_back(
- GetCurrentGuestMainRenderFrameHost(watcher->GetFrameTreeNodeId()));
- }
- }
- }
- void TestGuestViewManager::EmbedderProcessDestroyed(int embedder_process_id) {
- ++num_embedder_processes_destroyed_;
- GuestViewManager::EmbedderProcessDestroyed(embedder_process_id);
- }
- void TestGuestViewManager::ViewGarbageCollected(int embedder_process_id,
- int view_instance_id) {
- GuestViewManager::ViewGarbageCollected(embedder_process_id, view_instance_id);
- ++num_views_garbage_collected_;
- if (gc_run_loop_)
- gc_run_loop_->Quit();
- }
- // Test factory for creating test instances of GuestViewManager.
- TestGuestViewManagerFactory::TestGuestViewManagerFactory()
- : test_guest_view_manager_(nullptr) {}
- TestGuestViewManagerFactory::~TestGuestViewManagerFactory() {
- }
- GuestViewManager* TestGuestViewManagerFactory::CreateGuestViewManager(
- content::BrowserContext* context,
- std::unique_ptr<GuestViewManagerDelegate> delegate) {
- if (!test_guest_view_manager_) {
- test_guest_view_manager_ =
- new TestGuestViewManager(context, std::move(delegate));
- }
- return test_guest_view_manager_;
- }
- } // namespace guest_view
|