172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/test/ui/ui_test.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/file_path.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/message_loop.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/html_dialog_view.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/html_dialog_ui.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/url_constants.h"
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/test/in_process_browser_test.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/test/ui_test_utils.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_widget_host_view.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gmock/include/gmock/gmock.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "testing/gtest/include/gtest/gtest.h"
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/widget/widget.h"
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/window/window.h"
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing testing::Eq;
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Window non-client-area means that the minimum size for the window
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// won't be the actual minimum size - our layout and resizing code
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// makes sure the chrome is always visible.
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kMinimumWidthToTestFor = 20;
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kMinimumHeightToTestFor = 30;
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TestHtmlDialogUIDelegate : public HtmlDialogUIDelegate {
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TestHtmlDialogUIDelegate() {}
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~TestHtmlDialogUIDelegate() {}
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // HTMLDialogUIDelegate implementation:
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual bool IsDialogModal() const {
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return true;
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual std::wstring GetDialogTitle() const {
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return std::wstring(L"Test");
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual GURL GetDialogContentURL() const {
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return GURL(chrome::kAboutBlankURL);
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void GetWebUIMessageHandlers(
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      std::vector<WebUIMessageHandler*>* handlers) const { }
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void GetDialogSize(gfx::Size* size) const {
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    size->set_width(40);
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    size->set_height(40);
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual std::string GetDialogArgs() const {
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return std::string();
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnDialogClosed(const std::string& json_retval) { }
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnCloseContents(TabContents* source, bool* out_close_dialog) {
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (out_close_dialog)
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      *out_close_dialog = true;
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool ShouldShowDialogTitle() const { return true; }
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass HtmlDialogBrowserTest : public InProcessBrowserTest {
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  HtmlDialogBrowserTest() {}
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  class WindowChangedObserver : public base::MessagePumpForUI::Observer {
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   public:
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    WindowChangedObserver() {}
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    static WindowChangedObserver* GetInstance() {
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return Singleton<WindowChangedObserver>::get();
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // This method is called before processing a message.
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void WillProcessMessage(const MSG& msg) {}
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // This method is called after processing a message.
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void DidProcessMessage(const MSG& msg) {
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Either WM_PAINT or WM_TIMER indicates the actual work of
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // pushing through the window resizing messages is done since
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // they are lower priority (we don't get to see the
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // WM_WINDOWPOSCHANGED message here).
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (msg.message == WM_PAINT || msg.message == WM_TIMER)
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        MessageLoop::current()->Quit();
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif !defined(OS_MACOSX)
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  class WindowChangedObserver : public base::MessagePumpForUI::Observer {
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   public:
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    WindowChangedObserver() {}
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    static WindowChangedObserver* GetInstance() {
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return Singleton<WindowChangedObserver>::get();
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // This method is called before processing a message.
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void WillProcessEvent(GdkEvent* event) {}
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // This method is called after processing a message.
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void DidProcessEvent(GdkEvent* event) {
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // Quit once the GDK_CONFIGURE event has been processed - seeing
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // this means the window sizing request that was made actually
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      // happened.
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      if (event->type == GDK_CONFIGURE)
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        MessageLoop::current()->Quit();
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define MAYBE_SizeWindow SizeWindow
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// http://code.google.com/p/chromium/issues/detail?id=52602
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Windows has some issues resizing windows- an off by one problem,
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// and a minimum size that seems too big.  This file isn't included in
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Mac builds yet. On Chrome OS, this test doesn't apply since ChromeOS
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// doesn't allow resizing of windows.
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define MAYBE_SizeWindow DISABLED_SizeWindow
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(HtmlDialogBrowserTest, MAYBE_SizeWindow) {
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  HtmlDialogUIDelegate* delegate = new TestHtmlDialogUIDelegate();
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  HtmlDialogView* html_view =
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new HtmlDialogView(browser()->profile(), delegate);
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents = browser()->GetSelectedTabContents();
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ASSERT_TRUE(tab_contents != NULL);
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  views::Window::CreateChromeWindow(tab_contents->GetMessageBoxRootWindow(),
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    gfx::Rect(), html_view);
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  html_view->InitDialog();
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  html_view->window()->Show();
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
13921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  MessageLoopForUI::current()->AddObserver(
14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      WindowChangedObserver::GetInstance());
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  gfx::Rect bounds = html_view->GetWidget()->GetClientAreaScreenBounds();
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Rect set_bounds = bounds;
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gfx::Rect actual_bounds, rwhv_bounds;
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Bigger than the default in both dimensions.
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  set_bounds.set_width(400);
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  set_bounds.set_height(300);
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  html_view->MoveContents(tab_contents, set_bounds);
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::RunMessageLoop();
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  actual_bounds = html_view->GetWidget()->GetClientAreaScreenBounds();
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_EQ(set_bounds, actual_bounds);
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  rwhv_bounds =
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      html_view->tab_contents()->GetRenderWidgetHostView()->GetViewBounds();
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_LT(0, rwhv_bounds.width());
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_LT(0, rwhv_bounds.height());
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_GE(set_bounds.width(), rwhv_bounds.width());
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_GE(set_bounds.height(), rwhv_bounds.height());
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Larger in one dimension and smaller in the other.
164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  set_bounds.set_width(550);
165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  set_bounds.set_height(250);
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  html_view->MoveContents(tab_contents, set_bounds);
168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::RunMessageLoop();
169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  actual_bounds = html_view->GetWidget()->GetClientAreaScreenBounds();
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_EQ(set_bounds, actual_bounds);
171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  rwhv_bounds =
173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      html_view->tab_contents()->GetRenderWidgetHostView()->GetViewBounds();
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_LT(0, rwhv_bounds.width());
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_LT(0, rwhv_bounds.height());
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_GE(set_bounds.width(), rwhv_bounds.width());
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_GE(set_bounds.height(), rwhv_bounds.height());
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Get very small.
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  set_bounds.set_width(kMinimumWidthToTestFor);
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  set_bounds.set_height(kMinimumHeightToTestFor);
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  html_view->MoveContents(tab_contents, set_bounds);
184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::RunMessageLoop();
185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  actual_bounds = html_view->GetWidget()->GetClientAreaScreenBounds();
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_EQ(set_bounds, actual_bounds);
187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  rwhv_bounds =
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      html_view->tab_contents()->GetRenderWidgetHostView()->GetViewBounds();
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_LT(0, rwhv_bounds.width());
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_LT(0, rwhv_bounds.height());
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_GE(set_bounds.width(), rwhv_bounds.width());
193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_GE(set_bounds.height(), rwhv_bounds.height());
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Check to make sure we can't get to 0x0
196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  set_bounds.set_width(0);
197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  set_bounds.set_height(0);
198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  html_view->MoveContents(tab_contents, set_bounds);
200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::RunMessageLoop();
201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  actual_bounds = html_view->GetWidget()->GetClientAreaScreenBounds();
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_LT(0, actual_bounds.width());
203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_LT(0, actual_bounds.height());
204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
20521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  MessageLoopForUI::current()->RemoveObserver(
20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      WindowChangedObserver::GetInstance());
207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
208