blob: 7d054c83e766ba0db0374b2a7442f805cdffb592 [file]
// Copyright 2026 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/devtools/devtools_contents_resizing_strategy.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/rect.h"
using devtools::DockSide;
TEST(DevToolsContentsResizingStrategyTest, EmptyStrategy) {
DevToolsContentsResizingStrategy strategy;
gfx::Rect container_bounds(0, 0, 1000, 800);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 800), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 800), contents_bounds);
}
TEST(DevToolsContentsResizingStrategyTest, UndockedExplicitNoneWithBounds) {
// Strategy has DockSide::kNone and explicit bounds (e.g. Device Mode
// emulation). Inspected page respects specified bounds (700x800).
DevToolsContentsResizingStrategy strategy(DockSide::kNone,
gfx::Rect(0, 0, 700, 800));
gfx::Rect container_bounds(0, 0, 1000, 800);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 800), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 700, 800), contents_bounds);
}
TEST(DevToolsContentsResizingStrategyTest, DockedRightNormalBounds) {
// Container 1000x800, Inspected page 700x800, DevTools 300x800 on right.
DevToolsContentsResizingStrategy strategy(DockSide::kRight,
gfx::Rect(0, 0, 700, 800));
gfx::Rect container_bounds(0, 0, 1000, 800);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 800), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 700, 800), contents_bounds);
// DevTools receives remaining width 300px (1000 - 700).
}
TEST(DevToolsContentsResizingStrategyTest, DockedRightContainerGrows) {
// Original Strategy: Inspected page 700x800 (when container was 1000x800).
// User manually resizes window outwards to 1200x800.
// Inspected page remains at 700x800 until JS sends new bounds; DevTools gets
// remaining 500px (1200 - 700).
DevToolsContentsResizingStrategy strategy(DockSide::kRight,
gfx::Rect(0, 0, 700, 800));
gfx::Rect container_bounds(0, 0, 1200, 800);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1200, 800), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 700, 800), contents_bounds);
}
TEST(DevToolsContentsResizingStrategyTest, DockedRightContainerShrinks) {
// Original Strategy: Inspected page 700x800 (when container was 1000x800).
// Container shrinks to 650x800.
// DevTools should retain at least 250px width, so inspected page should be at
// most 400px (650 - 250).
DevToolsContentsResizingStrategy strategy(DockSide::kRight,
gfx::Rect(0, 0, 700, 800));
gfx::Rect container_bounds(0, 0, 650, 800);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 650, 800), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 400, 800), contents_bounds);
// DevTools retains 250px (650 - 400), preventing it from collapsing to 0.
}
TEST(DevToolsContentsResizingStrategyTest, DockedBottomContainerShrinks) {
// Original Strategy: Inspected page 1000x600 (when container was 1000x800).
// Container height shrinks to 650px.
// DevTools should retain at least 72px height, so inspected page height
// should be at most 578px (650 - 72).
DevToolsContentsResizingStrategy strategy(DockSide::kBottom,
gfx::Rect(0, 0, 1000, 600));
gfx::Rect container_bounds(0, 0, 1000, 650);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 650), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 578), contents_bounds);
// DevTools retains 72px height (650 - 578).
}
TEST(DevToolsContentsResizingStrategyTest, DockedBottomHeightLessThanBounds) {
// Original Strategy: Inspected page 1000x600 (when container was 1000x800).
// Container height shrinks to 550px (< bounds.height() 600px).
// DevTools should still retain at least 72px height, so inspected page
// height should be clamped to 478px (550 - 72).
DevToolsContentsResizingStrategy strategy(DockSide::kBottom,
gfx::Rect(0, 0, 1000, 600));
gfx::Rect container_bounds(0, 0, 1000, 550);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 550), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 478), contents_bounds);
// DevTools retains 72px height (550 - 478).
}
TEST(DevToolsContentsResizingStrategyTest, DockedContainerShrinksBothAxes) {
// Original Strategy: Inspected page 700x800 (when container was 1000x800).
// Container shrinks both horizontally and vertically to 600x500.
// DevTools right retains 250px width (600 - 250 = 350px page width),
// and height scales to full container height 500px.
DevToolsContentsResizingStrategy strategy(DockSide::kRight,
gfx::Rect(0, 0, 700, 800));
gfx::Rect container_bounds(0, 0, 600, 500);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 600, 500), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 350, 500), contents_bounds);
}
TEST(DevToolsContentsResizingStrategyTest, DockedRightVerySmallContainer) {
// Container width (100px) is below minimum DevTools width (250px).
// DevTools gets full container width (100px), inspected page width clamped to
// 0.
DevToolsContentsResizingStrategy strategy(DockSide::kRight,
gfx::Rect(0, 0, 700, 800));
gfx::Rect container_bounds(0, 0, 100, 800);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 100, 800), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 0, 800), contents_bounds);
}
TEST(DevToolsContentsResizingStrategyTest, DockedBottomVerySmallContainer) {
// Container height (50px) is below minimum DevTools height (72px).
// DevTools gets full container height (50px), inspected page height clamped
// to 0.
DevToolsContentsResizingStrategy strategy(DockSide::kBottom,
gfx::Rect(0, 0, 1000, 600));
gfx::Rect container_bounds(0, 0, 1000, 50);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 50), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 0), contents_bounds);
}
TEST(DevToolsContentsResizingStrategyTest, DockedBottomExplicitBounds) {
// When DevTools is docked bottom, explicit bounds (e.g. Device Mode
// emulation) are preserved.
DevToolsContentsResizingStrategy strategy(DockSide::kBottom,
gfx::Rect(0, 0, 700, 600));
gfx::Rect container_bounds(0, 0, 1000, 800);
gfx::Rect devtools_bounds;
gfx::Rect contents_bounds;
ApplyDevToolsContentsResizingStrategy(strategy, container_bounds,
&devtools_bounds, &contents_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 1000, 800), devtools_bounds);
EXPECT_EQ(gfx::Rect(0, 0, 700, 600), contents_bounds);
}