| // 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 <utility> |
| |
| #include "base/memory/ptr_util.h" |
| #include "components/guest_view/browser/guest_view_manager_delegate.h" |
| |
| 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) {} |
| |
| TestGuestViewManager::~TestGuestViewManager() { |
| } |
| |
| size_t TestGuestViewManager::GetNumGuestsActive() const { |
| return guest_web_contents_by_instance_id_.size(); |
| } |
| |
| size_t TestGuestViewManager::GetNumRemovedInstanceIDs() const { |
| return removed_instance_ids_.size(); |
| } |
| |
| content::WebContents* TestGuestViewManager::GetLastGuestCreated() { |
| content::WebContents* web_contents = nullptr; |
| for (int i = current_instance_id_; i >= 0; i--) { |
| web_contents = GetGuestByInstanceID(i); |
| if (web_contents) { |
| break; |
| } |
| } |
| return web_contents; |
| } |
| |
| void TestGuestViewManager::WaitForAllGuestsDeleted() { |
| // Make sure that every guest that was created has been removed. |
| for (auto& watcher : guest_web_contents_watchers_) |
| watcher->Wait(); |
| } |
| |
| void TestGuestViewManager::WaitForLastGuestDeleted() { |
| // Wait for the last guest that was created to be deleted. |
| guest_web_contents_watchers_.back()->Wait(); |
| }; |
| |
| content::WebContents* TestGuestViewManager::WaitForSingleGuestCreated() { |
| if (!GetNumGuestsActive()) { |
| // Guests have been created and subsequently destroyed. |
| if (num_guests_created() > 0) |
| return nullptr; |
| WaitForNumGuestsCreated(1u); |
| } |
| |
| return GetLastGuestCreated(); |
| } |
| |
| content::WebContents* TestGuestViewManager::WaitForNextGuestCreated() { |
| created_message_loop_runner_ = new content::MessageLoopRunner(); |
| created_message_loop_runner_->Run(); |
| return GetLastGuestCreated(); |
| } |
| |
| void TestGuestViewManager::WaitForNumGuestsCreated(size_t count) { |
| if (count == num_guests_created_) |
| return; |
| |
| waiting_for_guests_created_ = true; |
| expected_num_guests_created_ = count; |
| |
| num_created_message_loop_runner_ = new content::MessageLoopRunner; |
| num_created_message_loop_runner_->Run(); |
| } |
| |
| void TestGuestViewManager::WaitForViewGarbageCollected() { |
| gc_message_loop_runner_ = new content::MessageLoopRunner; |
| gc_message_loop_runner_->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_web_contents_watchers_.push_back( |
| base::MakeUnique<content::WebContentsDestroyedWatcher>( |
| guest_web_contents)); |
| |
| if (created_message_loop_runner_.get()) |
| created_message_loop_runner_->Quit(); |
| |
| ++num_guests_created_; |
| if (!waiting_for_guests_created_ && |
| num_guests_created_ != expected_num_guests_created_) { |
| return; |
| } |
| |
| if (num_created_message_loop_runner_.get()) |
| num_created_message_loop_runner_->Quit(); |
| } |
| |
| void TestGuestViewManager::GetGuestWebContentsList( |
| std::vector<content::WebContents*>* guest_web_contents_list) { |
| for (auto& watcher : guest_web_contents_watchers_) |
| guest_web_contents_list->push_back(watcher->web_contents()); |
| } |
| |
| void TestGuestViewManager::RemoveGuest(int guest_instance_id) { |
| GuestViewManager::RemoveGuest(guest_instance_id); |
| } |
| |
| 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_message_loop_runner_.get()) |
| gc_message_loop_runner_->Quit(); |
| } |
| |
| // Test factory for creating test instances of GuestViewManager. |
| TestGuestViewManagerFactory::TestGuestViewManagerFactory() |
| : test_guest_view_manager_(NULL) { |
| } |
| |
| 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 |