Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(887)

Unified Diff: ui/views/controls/native/native_view_host_aura_unittest.cc

Issue 30993004: Reland: Implement features in NativeViewHostAura for scroll end effect (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixing compile failure on the bots Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/views/controls/native/native_view_host_aura_unittest.cc
diff --git a/ui/views/controls/native/native_view_host_aura_unittest.cc b/ui/views/controls/native/native_view_host_aura_unittest.cc
index 7653cc905c31ba106fc6e6d4b920b754f9a4289b..13f89e29cb0513bef844ecab652993e54d1827b3 100644
--- a/ui/views/controls/native/native_view_host_aura_unittest.cc
+++ b/ui/views/controls/native/native_view_host_aura_unittest.cc
@@ -15,6 +15,53 @@
namespace views {
+// Testing wrapper of the NativeViewHost
+class NativeViewHostTesting : public NativeViewHost {
+ public:
+ NativeViewHostTesting() {}
+ virtual ~NativeViewHostTesting() {
+ destroyed_count_++;
+ }
+
+ static void ResetDestroyedCount() {
+ destroyed_count_ = 0;
+ }
+
+ static int destroyed_count() {
+ return destroyed_count_;
+ }
+
+ private:
+ static int destroyed_count_;
+
+ DISALLOW_COPY_AND_ASSIGN(NativeViewHostTesting);
+};
+int NativeViewHostTesting::destroyed_count_ = 0;
+
+// Observer watching for how many times an aura::Window has been destroyed. This
+// is used to confirm that an object has been cleaned up when expected.
+class AuraWindowDestroyedObserver : public aura::WindowObserver {
+ public:
+ AuraWindowDestroyedObserver(aura::Window *window) :
+ destroyed_count_(0) {
+ window->AddObserver(this);
+ }
+
+ virtual ~AuraWindowDestroyedObserver() {}
+
+ int destroyed_count() { return destroyed_count_; }
+
+ // aura::WindowObserver overrides
+ virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE {
+ destroyed_count_++;
+ }
+
+ private:
+ int destroyed_count_;
+
+ DISALLOW_COPY_AND_ASSIGN(AuraWindowDestroyedObserver);
+};
+
class NativeViewHostAuraTest : public ViewsTestBase {
public:
NativeViewHostAuraTest() {
@@ -32,6 +79,14 @@ class NativeViewHostAuraTest : public ViewsTestBase {
return child_.get();
}
+ aura::Window* clipping_window() {
+ return native_host()->clipping_window_;
+ }
+
+ Widget* toplevel() {
+ return toplevel_.get();
+ }
+
void CreateHost() {
// Create the top level widget.
toplevel_.reset(new Widget);
@@ -50,7 +105,7 @@ class NativeViewHostAuraTest : public ViewsTestBase {
child_->SetContentsView(test_view);
// Owned by |toplevel|.
- host_.reset(new NativeViewHost);
+ host_.reset(new NativeViewHostTesting);
toplevel_->GetRootView()->AddChildView(host_.get());
host_->Attach(child_->GetNativeView());
}
@@ -59,9 +114,22 @@ class NativeViewHostAuraTest : public ViewsTestBase {
host_.reset();
}
+ NativeViewHostTesting* ReleaseHost() {
+ return host_.release();
+ }
+
+ void DestroyTopLevel() {
+ toplevel_.reset();
+ }
+
+ gfx::Point CalculateNativeViewOrigin(gfx::Rect input_rect,
+ gfx::Rect native_rect) {
+ return native_host()->CalculateNativeViewOrigin(input_rect, native_rect);
+ }
+
private:
scoped_ptr<Widget> toplevel_;
- scoped_ptr<NativeViewHost> host_;
+ scoped_ptr<NativeViewHostTesting> host_;
scoped_ptr<Widget> child_;
DISALLOW_COPY_AND_ASSIGN(NativeViewHostAuraTest);
@@ -84,15 +152,165 @@ TEST_F(NativeViewHostAuraTest, HostViewPropertyKey) {
CreateHost();
aura::Window* child_win = child()->GetNativeView();
EXPECT_EQ(host(), child_win->GetProperty(views::kHostViewKey));
+ EXPECT_EQ(host(), clipping_window()->GetProperty(views::kHostViewKey));
host()->Detach();
EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey));
host()->Attach(child_win);
EXPECT_EQ(host(), child_win->GetProperty(views::kHostViewKey));
+ EXPECT_EQ(host(), clipping_window()->GetProperty(views::kHostViewKey));
DestroyHost();
EXPECT_FALSE(child_win->GetProperty(views::kHostViewKey));
}
+// Tests that the values being calculated by CalculateNativeViewOrigin are
+// correct.
+TEST_F(NativeViewHostAuraTest, CalculateNewNativeViewOrigin) {
+ CreateHost();
+
+ gfx::Rect clip_rect(0, 0, 50, 50);
+ gfx::Rect contents_rect(50, 50, 100, 100);
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTHWEST);
+ EXPECT_EQ(gfx::Point(0, 0).ToString(),
+ CalculateNativeViewOrigin(clip_rect, contents_rect).ToString());
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTH);
+ EXPECT_EQ(gfx::Point(-25, 0).ToString(),
+ CalculateNativeViewOrigin(clip_rect, contents_rect).ToString());
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTHEAST);
+ EXPECT_EQ(gfx::Point(-50, 0).ToString(),
+ CalculateNativeViewOrigin(clip_rect, contents_rect).ToString());
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_EAST);
+ EXPECT_EQ(gfx::Point(-50, -25).ToString(),
+ CalculateNativeViewOrigin(clip_rect, contents_rect).ToString());
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTHEAST);
+ EXPECT_EQ(gfx::Point(-50, -50).ToString(),
+ CalculateNativeViewOrigin(clip_rect, contents_rect).ToString());
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTH);
+ EXPECT_EQ(gfx::Point(-25, -50).ToString(),
+ CalculateNativeViewOrigin(clip_rect, contents_rect).ToString());
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTHWEST);
+ EXPECT_EQ(gfx::Point(0, -50).ToString(),
+ CalculateNativeViewOrigin(clip_rect, contents_rect).ToString());
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_WEST);
+ EXPECT_EQ(gfx::Point(0, -25).ToString(),
+ CalculateNativeViewOrigin(clip_rect, contents_rect).ToString());
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_CENTER);
+ EXPECT_EQ(gfx::Point(-25, -25).ToString(),
+ CalculateNativeViewOrigin(clip_rect, contents_rect).ToString());
+
+ DestroyHost();
+}
+
+// Test that the fast resize path places the clipping and content windows were
+// they are supposed to be.
+TEST_F(NativeViewHostAuraTest, FastResizePath) {
+ CreateHost();
+ host()->set_fast_resize(false);
+ toplevel()->SetBounds(gfx::Rect(0, 0, 100, 100));
+ native_host()->ShowWidget(0, 0, 100, 100);
+ host()->set_fast_resize(true);
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_CENTER);
+ EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(),
+ host()->native_view()->layer()->bounds().ToString());
+ EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(),
+ clipping_window()->layer()->bounds().ToString());
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_NORTHWEST);
+ native_host()->ShowWidget(0, 0, 50, 50);
+ EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(),
+ host()->native_view()->layer()->bounds().ToString());
+ EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(),
+ clipping_window()->layer()->bounds().ToString());
+
+ host()->set_fast_resize_gravity(NativeViewHost::GRAVITY_SOUTHEAST);
+ native_host()->ShowWidget(0, 0, 50, 50);
+ EXPECT_EQ(gfx::Rect(-50, -50, 100, 100).ToString(),
+ host()->native_view()->layer()->bounds().ToString());
+ EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(),
+ clipping_window()->layer()->bounds().ToString());
+
+ DestroyHost();
+}
+
+// Test that destroying the top level widget before destroying the attached
+// NativeViewHost works correctly. Specifically the associated NVH should be
+// destroyed and there shouldn't be any errors.
+TEST_F(NativeViewHostAuraTest, DestroyWidget) {
+ NativeViewHostTesting::ResetDestroyedCount();
+ CreateHost();
+ ReleaseHost();
+ EXPECT_EQ(0, NativeViewHostTesting::destroyed_count());
+ DestroyTopLevel();
+ EXPECT_EQ(1, NativeViewHostTesting::destroyed_count());
+}
+
+// Test that the clipping window and the native view are destroyed when the
+// containing widget for the native view is closed.
+TEST_F(NativeViewHostAuraTest, ClosingWidgetDoesntLeak) {
+ CreateHost();
+ AuraWindowDestroyedObserver clipping_observer(clipping_window());
+ AuraWindowDestroyedObserver native_view_observer(child()->GetNativeView());
+ EXPECT_EQ(0, clipping_observer.destroyed_count());
+ EXPECT_EQ(0, native_view_observer.destroyed_count());
+ child()->CloseNow();
+ EXPECT_EQ(1, clipping_observer.destroyed_count());
+ EXPECT_EQ(1, native_view_observer.destroyed_count());
+ DestroyHost();
+}
+
+// Test that the none fast resize path is clipped and positioned correctly.
+TEST_F(NativeViewHostAuraTest, NonFastResizePath) {
+ const gfx::Rect base_rect = gfx::Rect(0, 0, 100, 100);
+ CreateHost();
+ toplevel()->SetBounds(base_rect);
+ native_host()->ShowWidget(base_rect.x(), base_rect.y(),
+ base_rect.width(), base_rect.height());
+ EXPECT_EQ(base_rect.ToString(),
+ host()->native_view()->bounds().ToString());
+ EXPECT_EQ(base_rect.ToString(),
+ clipping_window()->bounds().ToString());
+
+ const gfx::Rect kTestCases[] = {
+ gfx::Rect(-10, -20, 100, 100),
+ gfx::Rect(0, -20, 100, 100),
+ gfx::Rect(10, -20, 100, 100),
+ gfx::Rect(-10, 0, 100, 100),
+ gfx::Rect(0, 0, 100, 100),
+ gfx::Rect(10, 0, 100, 100),
+ gfx::Rect(-10, 20, 100, 100),
+ gfx::Rect(0, 20, 100, 100),
+ gfx::Rect(10, 20, 100, 100),
+ gfx::Rect(0, 0, 200, 300),
+ gfx::Rect(-50, -100, 200, 300),
+ };
+
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
+ const gfx::Rect& bounds = kTestCases[i];
+
+ host()->SetBoundsRect(bounds);
+
+ gfx::Rect clip_rect = gfx::IntersectRects(bounds, base_rect);
+ EXPECT_EQ(clip_rect.ToString(), clipping_window()->bounds().ToString());
+
+ gfx::Rect native_view_bounds = bounds;
+ native_view_bounds.Offset(-clip_rect.x(), -clip_rect.y());
+ EXPECT_EQ(native_view_bounds.ToString(),
+ host()->native_view()->bounds().ToString());
+ }
+
+ DestroyHost();
+}
+
} // namespace views
« no previous file with comments | « ui/views/controls/native/native_view_host_aura.cc ('k') | ui/views/controls/native/native_view_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698