Allow resizing for PIP windows.
Bug: b/109716842
Test: Able to free resize PIP windows with Android side patch.
Change-Id: If27051f3edc27cebc5f2e27f78daf8ea2f60f60e
Reviewed-on: https://chromium-review.googlesource.com/1134810
Reviewed-by: Mitsuru Oshima <oshima@chromium.org>
Commit-Queue: Eliot Courtney <edcourtney@chromium.org>
Cr-Commit-Position: refs/heads/master@{#577796}
diff --git a/ash/wm/workspace/workspace_window_resizer.cc b/ash/wm/workspace/workspace_window_resizer.cc
index 001d1eb..d30fc82 100644
--- a/ash/wm/workspace/workspace_window_resizer.cc
+++ b/ash/wm/workspace/workspace_window_resizer.cc
@@ -80,7 +80,7 @@
return window_resizer;
}
- if (!window_state->IsNormalOrSnapped())
+ if (!window_state->IsNormalOrSnapped() && !window_state->IsPip())
return nullptr;
int bounds_change =
@@ -93,7 +93,8 @@
window->parent() ? window->parent()->id() : -1;
if (window->parent() &&
(parent_shell_window_id == kShellWindowId_DefaultContainer ||
- parent_shell_window_id == kShellWindowId_PanelContainer)) {
+ parent_shell_window_id == kShellWindowId_PanelContainer ||
+ parent_shell_window_id == kShellWindowId_AlwaysOnTopContainer)) {
window_resizer.reset(WorkspaceWindowResizer::Create(
window_state, std::vector<aura::Window*>()));
} else {
diff --git a/ash/wm/workspace/workspace_window_resizer_unittest.cc b/ash/wm/workspace/workspace_window_resizer_unittest.cc
index 0bf72a8..b2cdb9e 100644
--- a/ash/wm/workspace/workspace_window_resizer_unittest.cc
+++ b/ash/wm/workspace/workspace_window_resizer_unittest.cc
@@ -22,6 +22,7 @@
#include "services/ui/public/interfaces/window_tree_constants.mojom.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/test/test_window_delegate.h"
+#include "ui/aura/test/test_windows.h"
#include "ui/aura/window_event_dispatcher.h"
#include "ui/base/hit_test.h"
#include "ui/display/display_layout.h"
@@ -60,6 +61,38 @@
DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate);
};
+// WindowState based on a given initial state. Records the last resize bounds.
+class FakeWindowState : public wm::WindowState::State {
+ public:
+ explicit FakeWindowState(mojom::WindowStateType initial_state_type)
+ : state_type_(initial_state_type) {}
+ ~FakeWindowState() override = default;
+
+ // WindowState::State overrides:
+ void OnWMEvent(wm::WindowState* window_state,
+ const wm::WMEvent* event) override {
+ if (event->IsBoundsEvent()) {
+ if (event->type() == wm::WM_EVENT_SET_BOUNDS) {
+ const auto* set_bounds_event =
+ static_cast<const wm::SetBoundsEvent*>(event);
+ last_bounds_ = set_bounds_event->requested_bounds();
+ }
+ }
+ }
+ mojom::WindowStateType GetType() const override { return state_type_; }
+ void AttachState(wm::WindowState* window_state,
+ wm::WindowState::State* previous_state) override {}
+ void DetachState(wm::WindowState* window_state) override {}
+
+ const gfx::Rect& last_bounds() { return last_bounds_; }
+
+ private:
+ mojom::WindowStateType state_type_;
+ gfx::Rect last_bounds_;
+
+ DISALLOW_COPY_AND_ASSIGN(FakeWindowState);
+};
+
} // namespace
class WorkspaceWindowResizerTest : public AshTestBase {
@@ -1847,4 +1880,26 @@
touch_resize_window_->bounds().ToString());
}
+TEST_F(WorkspaceWindowResizerTest, PipCanBeResized) {
+ aura::Window* root_window = Shell::GetPrimaryRootWindow();
+ aura::Window* container =
+ Shell::GetContainer(root_window, kShellWindowId_AlwaysOnTopContainer);
+ std::unique_ptr<aura::Window> window(
+ aura::test::CreateTestWindowWithId(0, container));
+ window->SetBounds(gfx::Rect(20, 30, 50, 60));
+ window->Show();
+
+ auto* fake_state = new FakeWindowState(mojom::WindowStateType::PIP);
+ wm::WindowState* window_state = wm::GetWindowState(window.get());
+ window_state->SetStateObject(
+ std::unique_ptr<wm::WindowState::State>(fake_state));
+
+ std::unique_ptr<WindowResizer> resizer(
+ CreateResizerForTest(window.get(), gfx::Point(), HTRIGHT));
+ ASSERT_TRUE(resizer.get());
+ resizer->Drag(CalculateDragPoint(*resizer, 50, 0), 0);
+ resizer->CompleteDrag();
+ EXPECT_EQ("20,30 100x60", fake_state->last_bounds().ToString());
+}
+
} // namespace ash