// Copyright 2023 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/ui/fullscreen_util_mac.h"

#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
#include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/prefs/pref_service.h"
#include "content/public/test/browser_test.h"
#include "third_party/blink/public/mojom/frame/fullscreen.mojom.h"
#include "ui/base/test/scoped_fake_nswindow_fullscreen.h"

// TODO(lgrey): Convert these into unit tests.
class FullscreenUtilMacTest : public InProcessBrowserTest {
 protected:
  content::WebContents* GetWebContents() {
    return browser()->tab_strip_model()->GetActiveWebContents();
  }
  void EnterTabFullscreen() {
    content::WebContentsDelegate* contents_delegate =
        static_cast<content::WebContentsDelegate*>(browser());
    contents_delegate->EnterFullscreenModeForTab(
        GetWebContents()->GetPrimaryMainFrame(), {});
  }

  void ExitTabFullscreen() {
    content::WebContentsDelegate* contents_delegate =
        static_cast<content::WebContentsDelegate*>(browser());
    contents_delegate->ExitFullscreenModeForTab(GetWebContents());
  }

  FullscreenController* GetFullscreenController() {
    return browser()
        ->GetFeatures()
        .exclusive_access_manager()
        ->fullscreen_controller();
  }

  bool IsBrowserFullscreen() {
    return GetFullscreenController()->IsFullscreenForBrowser();
  }
};

IN_PROC_BROWSER_TEST_F(FullscreenUtilMacTest, IsInContentFullscreen) {
  ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen;
  // By default
  EXPECT_FALSE(fullscreen_utils::IsInContentFullscreen(browser()));

  // Via extension API
  // Toggle on:
  GetFullscreenController()->ToggleBrowserFullscreenModeWithExtension(
      GURL("https://example.com"));
  EXPECT_TRUE(fullscreen_utils::IsInContentFullscreen(browser()));

  // Toggle off:
  GetFullscreenController()->ToggleBrowserFullscreenModeWithExtension(
      GURL("https://example.com"));
  EXPECT_FALSE(fullscreen_utils::IsInContentFullscreen(browser()));

  // Via web API
  EnterTabFullscreen();
  EXPECT_TRUE(fullscreen_utils::IsInContentFullscreen(browser()));

  ExitTabFullscreen();
  EXPECT_FALSE(fullscreen_utils::IsInContentFullscreen(browser()));

  // Browser fullscreen
  ui_test_utils::ToggleFullscreenModeAndWait(browser());
  ASSERT_TRUE(IsBrowserFullscreen());
  EXPECT_FALSE(fullscreen_utils::IsInContentFullscreen(browser()));

  // Nested
  EnterTabFullscreen();
  EXPECT_TRUE(fullscreen_utils::IsInContentFullscreen(browser()));

  ExitTabFullscreen();
  ASSERT_TRUE(IsBrowserFullscreen());
  EXPECT_FALSE(fullscreen_utils::IsInContentFullscreen(browser()));

  ui_test_utils::ToggleFullscreenModeAndWait(browser());
  ASSERT_FALSE(IsBrowserFullscreen());
  EXPECT_FALSE(fullscreen_utils::IsInContentFullscreen(browser()));
}

IN_PROC_BROWSER_TEST_F(FullscreenUtilMacTest, AlwaysShowToolbar) {
  PrefService* prefs = browser()->profile()->GetPrefs();
  bool original_always_show = prefs->GetBoolean(prefs::kShowFullscreenToolbar);

  prefs->SetBoolean(prefs::kShowFullscreenToolbar, false);
  EXPECT_FALSE(fullscreen_utils::IsAlwaysShowToolbarEnabled(browser()));

  prefs->SetBoolean(prefs::kShowFullscreenToolbar, true);
  EXPECT_TRUE(fullscreen_utils::IsAlwaysShowToolbarEnabled(browser()));

  prefs->SetBoolean(prefs::kShowFullscreenToolbar, original_always_show);
  // TODO(lgrey): Add PWA test if anyone can think of a good way to do that.
}
