blob: 0f971b8a3ae219b66be6219083c59bc58751551a [file] [log] [blame]
// Copyright 2021 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 "weblayer/test/weblayer_browser_test.h"
#include "base/callback.h"
#include "third_party/blink/public/mojom/frame/fullscreen.mojom.h"
#include "weblayer/browser/tab_impl.h"
#include "weblayer/public/browser.h"
#include "weblayer/public/fullscreen_delegate.h"
#include "weblayer/shell/browser/shell.h"
#include "weblayer/test/weblayer_browser_test_utils.h"
namespace weblayer {
using FullscreenBrowserTest = WebLayerBrowserTest;
class FullscreenDelegateImpl : public FullscreenDelegate {
public:
bool got_enter() const { return got_enter_; }
bool got_exit() const { return got_exit_; }
void ResetState() { got_enter_ = got_exit_ = false; }
// FullscreenDelegate:
void EnterFullscreen(base::OnceClosure exit_closure) override {
got_enter_ = true;
}
void ExitFullscreen() override { got_exit_ = true; }
private:
bool got_enter_ = false;
bool got_exit_ = false;
};
IN_PROC_BROWSER_TEST_F(FullscreenBrowserTest, EnterFromBackgroundTab) {
EXPECT_TRUE(embedded_test_server()->Start());
TabImpl* tab1 = static_cast<TabImpl*>(shell()->tab());
Browser* browser = tab1->GetBrowser();
TabImpl* tab2 = static_cast<TabImpl*>(browser->CreateTab());
EXPECT_NE(tab2, browser->GetActiveTab());
FullscreenDelegateImpl fullscreen_delegate;
tab2->SetFullscreenDelegate(&fullscreen_delegate);
// As `tab2` is in the background, the delegate should not be notified.
static_cast<content::WebContentsDelegate*>(tab2)->EnterFullscreenModeForTab(
nullptr, blink::mojom::FullscreenOptions());
EXPECT_TRUE(static_cast<content::WebContentsDelegate*>(tab2)
->IsFullscreenForTabOrPending(nullptr));
EXPECT_FALSE(fullscreen_delegate.got_enter());
// Making the tab active should trigger the going fullscreen.
browser->SetActiveTab(tab2);
EXPECT_TRUE(static_cast<content::WebContentsDelegate*>(tab2)
->IsFullscreenForTabOrPending(nullptr));
EXPECT_TRUE(fullscreen_delegate.got_enter());
tab2->SetFullscreenDelegate(nullptr);
}
IN_PROC_BROWSER_TEST_F(FullscreenBrowserTest, NoExitForBackgroundTab) {
EXPECT_TRUE(embedded_test_server()->Start());
Browser* browser = shell()->tab()->GetBrowser();
TabImpl* tab = static_cast<TabImpl*>(browser->CreateTab());
EXPECT_NE(tab, browser->GetActiveTab());
FullscreenDelegateImpl fullscreen_delegate;
tab->SetFullscreenDelegate(&fullscreen_delegate);
// As `tab` is in the background, the delegate should not be notified.
static_cast<content::WebContentsDelegate*>(tab)->EnterFullscreenModeForTab(
nullptr, blink::mojom::FullscreenOptions());
EXPECT_TRUE(static_cast<content::WebContentsDelegate*>(tab)
->IsFullscreenForTabOrPending(nullptr));
EXPECT_FALSE(fullscreen_delegate.got_enter());
EXPECT_TRUE(static_cast<content::WebContentsDelegate*>(tab)
->IsFullscreenForTabOrPending(nullptr));
EXPECT_FALSE(fullscreen_delegate.got_enter());
EXPECT_FALSE(fullscreen_delegate.got_exit());
fullscreen_delegate.ResetState();
// Simulate exiting. As the delegate wasn't told about the enter, it should
// not be told about the exit.
static_cast<content::WebContentsDelegate*>(tab)->ExitFullscreenModeForTab(
nullptr);
EXPECT_FALSE(static_cast<content::WebContentsDelegate*>(tab)
->IsFullscreenForTabOrPending(nullptr));
EXPECT_FALSE(fullscreen_delegate.got_enter());
EXPECT_FALSE(fullscreen_delegate.got_exit());
tab->SetFullscreenDelegate(nullptr);
}
IN_PROC_BROWSER_TEST_F(FullscreenBrowserTest, DelegateNotCalledMoreThanOnce) {
EXPECT_TRUE(embedded_test_server()->Start());
// The tab needs to be made active as fullscreen requests for inactive tabs
// are ignored.
TabImpl* tab = static_cast<TabImpl*>(shell()->tab());
tab->GetBrowser()->SetActiveTab(tab);
FullscreenDelegateImpl fullscreen_delegate;
tab->SetFullscreenDelegate(&fullscreen_delegate);
static_cast<content::WebContentsDelegate*>(tab)->EnterFullscreenModeForTab(
nullptr, blink::mojom::FullscreenOptions());
EXPECT_TRUE(static_cast<content::WebContentsDelegate*>(tab)
->IsFullscreenForTabOrPending(nullptr));
EXPECT_TRUE(fullscreen_delegate.got_enter());
EXPECT_FALSE(fullscreen_delegate.got_exit());
fullscreen_delegate.ResetState();
// Simulate another enter. As the tab is already fullscreen the delegate
// should not be notified again.
static_cast<content::WebContentsDelegate*>(tab)->EnterFullscreenModeForTab(
nullptr, blink::mojom::FullscreenOptions());
EXPECT_TRUE(static_cast<content::WebContentsDelegate*>(tab)
->IsFullscreenForTabOrPending(nullptr));
EXPECT_FALSE(fullscreen_delegate.got_enter());
EXPECT_FALSE(fullscreen_delegate.got_exit());
tab->SetFullscreenDelegate(nullptr);
}
} // namespace weblayer