blob: 18c375a23090e53d66438487e1961e19caa64c1a [file] [log] [blame]
// Copyright 2019 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 "chrome/browser/ui/web_applications/app_browser_controller.h"
#include "base/test/bind_test_util.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/installable/installable_metrics.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/extensions/application_launch.h"
#include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h"
#include "chrome/browser/web_applications/components/externally_installed_web_app_prefs.h"
#include "chrome/browser/web_applications/components/install_manager.h"
#include "chrome/browser/web_applications/components/web_app_constants.h"
#include "chrome/browser/web_applications/system_web_app_manager.h"
#include "chrome/browser/web_applications/web_app_provider.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/web_application_info.h"
#include "chrome/common/webui_url_constants.h"
#include "extensions/browser/extension_registry.h"
namespace web_app {
class AppBrowserControllerBrowserTest
: public extensions::ExtensionBrowserTest {
public:
AppBrowserControllerBrowserTest() {
scoped_feature_list_.InitWithFeatures({}, {features::kTerminalSystemApp});
}
~AppBrowserControllerBrowserTest() override {}
void SetUp() override { extensions::ExtensionBrowserTest::SetUp(); }
protected:
void InstallAndLaunchTerminalApp() {
GURL app_url = GetAppURL();
auto web_app_info = std::make_unique<WebApplicationInfo>();
web_app_info->app_url = app_url;
web_app_info->scope = app_url.GetWithoutFilename();
web_app_info->open_as_window = true;
AppId app_id = InstallWebApp(std::move(web_app_info));
auto* provider = WebAppProvider::Get(profile());
provider->system_web_app_manager().SetSystemAppsForTesting(
{{SystemAppType::TERMINAL, SystemAppInfo(app_url)}});
web_app::ExternallyInstalledWebAppPrefs(profile()->GetPrefs())
.Insert(app_url, app_id,
web_app::ExternalInstallSource::kInternalDefault);
ASSERT_EQ(web_app::GetAppIdForSystemWebApp(browser()->profile(),
SystemAppType::TERMINAL),
app_id);
const extensions::Extension* extension =
extensions::ExtensionRegistry::Get(profile())->GetInstalledExtension(
app_id);
ASSERT_TRUE(extension);
app_browser_ = LaunchAppBrowser(extension);
ASSERT_TRUE(app_browser_);
ASSERT_NE(app_browser_, browser());
}
std::string InstallWebApp(
std::unique_ptr<WebApplicationInfo>&& web_app_info) {
std::string app_id;
base::RunLoop run_loop;
auto* provider = WebAppProvider::Get(profile());
DCHECK(provider);
provider->install_manager().InstallWebAppFromInfo(
std::move(web_app_info), ForInstallableSite::kYes,
WebappInstallSource::OMNIBOX_INSTALL_ICON,
base::BindLambdaForTesting(
[&](const std::string& installed_app_id, InstallResultCode code) {
EXPECT_EQ(InstallResultCode::kSuccess, code);
app_id = installed_app_id;
run_loop.Quit();
}));
run_loop.Run();
return app_id;
}
GURL GetAppURL() {
return embedded_test_server()->GetURL("app.com", "/simple.html");
}
GURL GetActiveTabURL() {
return app_browser_->tab_strip_model()
->GetActiveWebContents()
->GetVisibleURL();
}
Browser* app_browser_ = nullptr;
private:
base::test::ScopedFeatureList scoped_feature_list_;
DISALLOW_COPY_AND_ASSIGN(AppBrowserControllerBrowserTest);
};
IN_PROC_BROWSER_TEST_F(AppBrowserControllerBrowserTest, SomeTest) {
ASSERT_TRUE(embedded_test_server()->Start());
InstallAndLaunchTerminalApp();
EXPECT_TRUE(app_browser_->SupportsWindowFeature(Browser::FEATURE_TABSTRIP));
// Check URL of tab1.
EXPECT_EQ(GetActiveTabURL(), GetAppURL());
// Create tab2 with specific URL, check URL, number of tabs.
chrome::AddTabAt(app_browser_, GURL(chrome::kChromeUINewTabURL), -1, true);
EXPECT_EQ(app_browser_->tab_strip_model()->count(), 2);
EXPECT_EQ(GetActiveTabURL(), GURL("chrome://newtab/"));
// Create tab3 with default URL, check URL, number of tabs.
chrome::NewTab(app_browser_);
EXPECT_EQ(app_browser_->tab_strip_model()->count(), 3);
EXPECT_EQ(GetActiveTabURL(), GetAppURL());
// Switch to tab1, check URL.
chrome::SelectNextTab(app_browser_);
EXPECT_EQ(app_browser_->tab_strip_model()->count(), 3);
EXPECT_EQ(GetActiveTabURL(), GetAppURL());
// Switch to tab2, check URL.
chrome::SelectNextTab(app_browser_);
EXPECT_EQ(app_browser_->tab_strip_model()->count(), 3);
EXPECT_EQ(GetActiveTabURL(), GURL("chrome://newtab/"));
// Switch to tab3, check URL.
chrome::SelectNextTab(app_browser_);
EXPECT_EQ(app_browser_->tab_strip_model()->count(), 3);
EXPECT_EQ(GetActiveTabURL(), GetAppURL());
// Close tab3, check number of tabs.
chrome::CloseTab(app_browser_);
EXPECT_EQ(app_browser_->tab_strip_model()->count(), 2);
EXPECT_EQ(GetActiveTabURL(), GURL("chrome://newtab/"));
// Close tab2, check number of tabs.
chrome::CloseTab(app_browser_);
EXPECT_EQ(app_browser_->tab_strip_model()->count(), 1);
EXPECT_EQ(GetActiveTabURL(), GetAppURL());
}
} // namespace web_app