chromium/chrome/browser/sessions/tab_restore_service_browsertest.cc

// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/sessions/core/tab_restore_service.h"

#include "chrome/browser/ash/system_web_apps/test_support/test_system_web_app_installation.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/tab_restore_service_factory.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
#include "chrome/browser/web_applications/web_app_utils.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/test/browser_test.h"

using Window = sessions::tab_restore::Window;

class TabRestoreServiceImplBrowserTest : public InProcessBrowserTest {
 public:
  TabRestoreServiceImplBrowserTest()
      : test_system_web_app_installation_(
            ash::TestSystemWebAppInstallation::SetUpTabbedMultiWindowApp()) {}

 protected:
  std::unique_ptr<ash::TestSystemWebAppInstallation>
      test_system_web_app_installation_;
};

IN_PROC_BROWSER_TEST_F(TabRestoreServiceImplBrowserTest, RestoreApp) {
  Profile* profile = browser()->profile();
  sessions::TabRestoreService* trs =
      TabRestoreServiceFactory::GetForProfile(profile);
  const char* app_name = "TestApp";

  Browser* app_browser = CreateBrowserForApp(app_name, profile);
  CloseBrowserSynchronously(app_browser);

  // One entry should be created.
  ASSERT_EQ(1U, trs->entries().size());
  const sessions::tab_restore::Entry* restored_entry =
      trs->entries().front().get();

  // It should be a window with an app.
  ASSERT_EQ(sessions::tab_restore::Type::WINDOW, restored_entry->type);
  const Window* restored_window = static_cast<const Window*>(restored_entry);
  EXPECT_EQ(app_name, restored_window->app_name);
}

// Test that the last app browser tab saves the Window to ensure it will be
// reopened in the correct app browser.
IN_PROC_BROWSER_TEST_F(TabRestoreServiceImplBrowserTest,
                       LastAppTabSavesWindow) {
  Profile* profile = browser()->profile();
  sessions::TabRestoreService* trs =
      TabRestoreServiceFactory::GetForProfile(profile);

  test_system_web_app_installation_->WaitForAppInstall();
  Browser* app_browser = web_app::LaunchWebAppBrowser(
      browser()->profile(), test_system_web_app_installation_->GetAppId());
  GURL app_url = test_system_web_app_installation_->GetAppUrl();
  ASSERT_TRUE(ui_test_utils::NavigateToURL(app_browser, app_url));

  // Create second tab and close it, TAB entry should be created.
  chrome::NewTab(app_browser);
  ASSERT_TRUE(ui_test_utils::NavigateToURL(app_browser, app_url));
  chrome::CloseTab(app_browser);
  ASSERT_EQ(1U, trs->entries().size());
  const sessions::tab_restore::Entry* tab_entry = trs->entries().front().get();
  EXPECT_EQ(sessions::tab_restore::Type::TAB, tab_entry->type);

  // Close last tab, WINDOW entry should be created.
  chrome::CloseTab(app_browser);
  EXPECT_EQ(2U, trs->entries().size());
  const sessions::tab_restore::Entry* window_entry =
      trs->entries().front().get();
  ASSERT_EQ(sessions::tab_restore::Type::WINDOW, window_entry->type);
  const Window* restored_window = static_cast<const Window*>(window_entry);
  EXPECT_EQ(app_browser->app_name(), restored_window->app_name);
  EXPECT_EQ(1U, restored_window->tabs.size());
}