| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/glic/guest_util.h" |
| |
| #include "base/check_deref.h" |
| #include "base/test/scoped_feature_list.h" |
| #include "chrome/browser/glic/glic_pref_names.h" |
| #include "chrome/browser/glic/glic_test_environment.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/browser/signin/identity_manager_factory.h" |
| #include "chrome/browser/ui/browser_window.h" |
| #include "chrome/common/chrome_features.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/webui_url_constants.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| #include "components/guest_view/browser/guest_view_base.h" |
| #include "components/guest_view/browser/guest_view_manager_delegate.h" |
| #include "components/guest_view/browser/test_guest_view_manager.h" |
| #include "components/signin/public/identity_manager/identity_test_utils.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/browser_test.h" |
| #include "content/public/test/browser_test_utils.h" |
| #include "extensions/browser/api/extensions_api_client.h" |
| #include "extensions/browser/app_window/app_window.h" |
| #include "extensions/browser/app_window/app_window_registry.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/skia/include/core/SkColor.h" |
| #include "ui/base/window_open_disposition.h" |
| |
| namespace glic { |
| namespace { |
| |
| Profile& GetProfile() { |
| return CHECK_DEREF(ProfileManager::GetLastUsedProfile()); |
| } |
| |
| void OpenWebUiWithGuestView(const GURL& host_url) { |
| Browser::CreateParams params = |
| Browser::CreateParams(Browser::Type::TYPE_NORMAL, |
| /*profile=*/&GetProfile(), |
| /*user_gesture=*/true); |
| |
| auto& new_browser = CHECK_DEREF(Browser::Create(params)); |
| new_browser.window()->Show(); |
| |
| ui_test_utils::NavigateToURLWithDisposition( |
| &new_browser, host_url, WindowOpenDisposition::NEW_FOREGROUND_TAB, |
| ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP); |
| } |
| |
| guest_view::TestGuestViewManager& GetGuestViewManager( |
| guest_view::TestGuestViewManagerFactory& factory) { |
| return CHECK_DEREF(factory.GetOrCreateTestGuestViewManager( |
| &GetProfile(), extensions::ExtensionsAPIClient::Get() |
| ->CreateGuestViewManagerDelegate())); |
| } |
| |
| class GuestUtilBrowserTest : public InProcessBrowserTest { |
| public: |
| GuestUtilBrowserTest() { |
| scoped_feature_list_.InitWithFeatures( |
| /*enabled_features=*/{features::kGlic, features::kTabstripComboButton}, |
| /*disabled_features=*/{features::kGlicWarming}); |
| } |
| GuestUtilBrowserTest(const GuestUtilBrowserTest&) = delete; |
| GuestUtilBrowserTest& operator=(const GuestUtilBrowserTest&) = delete; |
| |
| ~GuestUtilBrowserTest() override = default; |
| |
| void SetUpOnMainThread() override { |
| InProcessBrowserTest::SetUpOnMainThread(); |
| glic_test_environment_ = |
| std::make_unique<glic::GlicTestEnvironment>(browser()->profile()); |
| } |
| |
| void SetUpCommandLine(base::CommandLine* command_line) override { |
| // Load blank page in glic guest view |
| command_line->AppendSwitchASCII(::switches::kGlicGuestURL, "about:blank"); |
| } |
| |
| protected: |
| guest_view::TestGuestViewManagerFactory& factory() { return factory_; } |
| |
| private: |
| base::test::ScopedFeatureList scoped_feature_list_; |
| guest_view::TestGuestViewManagerFactory factory_; |
| std::unique_ptr<glic::GlicTestEnvironment> glic_test_environment_; |
| }; |
| |
| IN_PROC_BROWSER_TEST_F(GuestUtilBrowserTest, OnGuestAdded_NonGlic) { |
| EXPECT_EQ(0ULL, GetGuestViewManager(factory()).GetCurrentGuestCount()); |
| |
| // Load a non-glic webui containing a <webview> |
| OpenWebUiWithGuestView(GURL{"chrome://chrome-signin/?reason=5"}); |
| |
| auto* guest_view = |
| GetGuestViewManager(factory()).WaitForSingleGuestViewCreated(); |
| ASSERT_NE(guest_view, nullptr); |
| ASSERT_NE(guest_view->web_contents(), nullptr); |
| |
| // OnGuestAdded() should not affect this non-glic WebContents. |
| EXPECT_FALSE(glic::OnGuestAdded(guest_view->web_contents())); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GuestUtilBrowserTest, OnGuestAdded_Glic) { |
| EXPECT_EQ(0ULL, GetGuestViewManager(factory()).GetCurrentGuestCount()); |
| |
| OpenWebUiWithGuestView(GURL{chrome::kChromeUIGlicURL}); |
| |
| auto* guest_view = |
| GetGuestViewManager(factory()).WaitForSingleGuestViewCreated(); |
| ASSERT_NE(guest_view, nullptr); |
| ASSERT_NE(guest_view->web_contents(), nullptr); |
| |
| // OnGuestAdded() should recognize the WebContents and set its base background |
| // color. Can't directly test this because there is no public getter for |
| // page_base_background_color_. |
| EXPECT_TRUE(glic::OnGuestAdded(guest_view->web_contents())); |
| } |
| |
| } // namespace |
| } // namespace glic |