| Index: chrome/browser/views/html_dialog_view_browsertest.cc
|
| diff --git a/chrome/browser/views/html_dialog_view_browsertest.cc b/chrome/browser/views/html_dialog_view_browsertest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7bb9977c86288d70ad0682f7cb7afe4876fb28b0
|
| --- /dev/null
|
| +++ b/chrome/browser/views/html_dialog_view_browsertest.cc
|
| @@ -0,0 +1,204 @@
|
| +// Copyright (c) 2010 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 "chrome/test/ui/ui_test.h"
|
| +
|
| +#include "base/file_path.h"
|
| +#include "base/message_loop.h"
|
| +#include "chrome/browser/chrome_thread.h"
|
| +#include "chrome/browser/dom_ui/html_dialog_ui.h"
|
| +#include "chrome/browser/tab_contents/tab_contents.h"
|
| +#include "chrome/browser/renderer_host/render_widget_host_view.h"
|
| +#include "chrome/browser/views/html_dialog_view.h"
|
| +#include "chrome/common/url_constants.h"
|
| +#include "chrome/test/in_process_browser_test.h"
|
| +#include "chrome/test/ui_test_utils.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "views/widget/widget.h"
|
| +#include "views/window/window.h"
|
| +
|
| +using testing::Eq;
|
| +
|
| +namespace {
|
| +
|
| +// Window non-client-area means that the minimum size for the window
|
| +// won't be the actual minimum size - our layout and resizing code
|
| +// makes sure the chrome is always visible.
|
| +const int kMinimumWidthToTestFor = 20;
|
| +const int kMinimumHeightToTestFor = 30;
|
| +
|
| +class TestHtmlDialogUIDelegate : public HtmlDialogUIDelegate {
|
| + public:
|
| + TestHtmlDialogUIDelegate() {}
|
| + virtual ~TestHtmlDialogUIDelegate() {}
|
| +
|
| + // HTMLDialogUIDelegate implementation:
|
| + virtual bool IsDialogModal() const {
|
| + return true;
|
| + }
|
| + virtual std::wstring GetDialogTitle() const {
|
| + return std::wstring(L"Test");
|
| + }
|
| + virtual GURL GetDialogContentURL() const {
|
| + return GURL(chrome::kAboutBlankURL);
|
| + }
|
| + virtual void GetDOMMessageHandlers(
|
| + std::vector<DOMMessageHandler*>* handlers) const { }
|
| + virtual void GetDialogSize(gfx::Size* size) const {
|
| + size->set_width(40);
|
| + size->set_height(40);
|
| + }
|
| + virtual std::string GetDialogArgs() const {
|
| + return std::string();
|
| + }
|
| + virtual void OnDialogClosed(const std::string& json_retval) { }
|
| + virtual void OnCloseContents(TabContents* source, bool* out_close_dialog) {
|
| + if (out_close_dialog)
|
| + *out_close_dialog = true;
|
| + }
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +class HtmlDialogBrowserTest : public InProcessBrowserTest {
|
| + public:
|
| + HtmlDialogBrowserTest() {}
|
| +
|
| +#if defined(OS_WIN)
|
| + class WindowChangedObserver : public base::MessagePumpForUI::Observer {
|
| + public:
|
| + WindowChangedObserver() {}
|
| +
|
| + static WindowChangedObserver* Get() {
|
| + return Singleton<WindowChangedObserver>::get();
|
| + }
|
| +
|
| + // This method is called before processing a message.
|
| + virtual void WillProcessMessage(const MSG& msg) {}
|
| +
|
| + // This method is called after processing a message.
|
| + virtual void DidProcessMessage(const MSG& msg) {
|
| + // Either WM_PAINT or WM_TIMER indicates the actual work of
|
| + // pushing through the window resizing messages is done since
|
| + // they are lower priority (we don't get to see the
|
| + // WM_WINDOWPOSCHANGED message here).
|
| + if (msg.message == WM_PAINT || msg.message == WM_TIMER)
|
| + MessageLoop::current()->Quit();
|
| + }
|
| + };
|
| +#elif !defined(OS_MACOSX)
|
| + class WindowChangedObserver : public base::MessagePumpForUI::Observer {
|
| + public:
|
| + WindowChangedObserver() {}
|
| +
|
| + static WindowChangedObserver* Get() {
|
| + return Singleton<WindowChangedObserver>::get();
|
| + }
|
| +
|
| + // This method is called before processing a message.
|
| + virtual void WillProcessEvent(GdkEvent* event) {}
|
| +
|
| + // This method is called after processing a message.
|
| + virtual void DidProcessEvent(GdkEvent* event) {
|
| + // Quit once the GDK_CONFIGURE event has been processed - seeing
|
| + // this means the window sizing request that was made actually
|
| + // happened.
|
| + if (event->type == GDK_CONFIGURE)
|
| + MessageLoop::current()->Quit();
|
| + }
|
| + };
|
| +#endif
|
| +};
|
| +
|
| +#if defined(OS_LINUX)
|
| +#define MAYBE_SizeWindow SizeWindow
|
| +#else
|
| +// http://code.google.com/p/chromium/issues/detail?id=52602
|
| +// Windows has some issues resizing windows- an off by one problem,
|
| +// and a minimum size that seems too big. This file isn't included in
|
| +// Mac builds yet.
|
| +#define MAYBE_SizeWindow DISABLED_SizeWindow
|
| +#endif
|
| +
|
| +IN_PROC_BROWSER_TEST_F(HtmlDialogBrowserTest, MAYBE_SizeWindow) {
|
| + HtmlDialogUIDelegate* delegate = new TestHtmlDialogUIDelegate();
|
| +
|
| + HtmlDialogView* html_view =
|
| + new HtmlDialogView(browser()->profile(), delegate);
|
| + TabContents* tab_contents = browser()->GetSelectedTabContents();
|
| + ASSERT_TRUE(tab_contents != NULL);
|
| + views::Window::CreateChromeWindow(tab_contents->GetMessageBoxRootWindow(),
|
| + gfx::Rect(), html_view);
|
| + html_view->InitDialog();
|
| + html_view->window()->Show();
|
| +
|
| + MessageLoopForUI::current()->AddObserver(WindowChangedObserver::Get());
|
| +
|
| + gfx::Rect bounds;
|
| + html_view->GetWidget()->GetBounds(&bounds, false);
|
| +
|
| + gfx::Rect set_bounds = bounds;
|
| + gfx::Rect actual_bounds, rwhv_bounds;
|
| +
|
| + // Bigger than the default in both dimensions.
|
| + set_bounds.set_width(400);
|
| + set_bounds.set_height(300);
|
| +
|
| + html_view->MoveContents(tab_contents, set_bounds);
|
| + ui_test_utils::RunMessageLoop();
|
| + html_view->GetWidget()->GetBounds(&actual_bounds, false);
|
| + EXPECT_EQ(set_bounds, actual_bounds);
|
| +
|
| + rwhv_bounds =
|
| + html_view->tab_contents()->GetRenderWidgetHostView()->GetViewBounds();
|
| + EXPECT_LT(0, rwhv_bounds.width());
|
| + EXPECT_LT(0, rwhv_bounds.height());
|
| + EXPECT_GE(set_bounds.width(), rwhv_bounds.width());
|
| + EXPECT_GE(set_bounds.height(), rwhv_bounds.height());
|
| +
|
| + // Larger in one dimension and smaller in the other.
|
| + set_bounds.set_width(550);
|
| + set_bounds.set_height(250);
|
| +
|
| + html_view->MoveContents(tab_contents, set_bounds);
|
| + ui_test_utils::RunMessageLoop();
|
| + html_view->GetWidget()->GetBounds(&actual_bounds, false);
|
| + EXPECT_EQ(set_bounds, actual_bounds);
|
| +
|
| + rwhv_bounds =
|
| + html_view->tab_contents()->GetRenderWidgetHostView()->GetViewBounds();
|
| + EXPECT_LT(0, rwhv_bounds.width());
|
| + EXPECT_LT(0, rwhv_bounds.height());
|
| + EXPECT_GE(set_bounds.width(), rwhv_bounds.width());
|
| + EXPECT_GE(set_bounds.height(), rwhv_bounds.height());
|
| +
|
| + // Get very small.
|
| + set_bounds.set_width(kMinimumWidthToTestFor);
|
| + set_bounds.set_height(kMinimumHeightToTestFor);
|
| +
|
| + html_view->MoveContents(tab_contents, set_bounds);
|
| + ui_test_utils::RunMessageLoop();
|
| + html_view->GetWidget()->GetBounds(&actual_bounds, false);
|
| + EXPECT_EQ(set_bounds, actual_bounds);
|
| +
|
| + rwhv_bounds =
|
| + html_view->tab_contents()->GetRenderWidgetHostView()->GetViewBounds();
|
| + EXPECT_LT(0, rwhv_bounds.width());
|
| + EXPECT_LT(0, rwhv_bounds.height());
|
| + EXPECT_GE(set_bounds.width(), rwhv_bounds.width());
|
| + EXPECT_GE(set_bounds.height(), rwhv_bounds.height());
|
| +
|
| + // Check to make sure we can't get to 0x0
|
| + set_bounds.set_width(0);
|
| + set_bounds.set_height(0);
|
| +
|
| + html_view->MoveContents(tab_contents, set_bounds);
|
| + ui_test_utils::RunMessageLoop();
|
| + html_view->GetWidget()->GetBounds(&actual_bounds, false);
|
| + EXPECT_LT(0, actual_bounds.width());
|
| + EXPECT_LT(0, actual_bounds.height());
|
| +
|
| + MessageLoopForUI::current()->RemoveObserver(WindowChangedObserver::Get());
|
| +}
|
|
|