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
54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/dom_view.h"
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/test/in_process_browser_test.h"
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/test/ui_test_utils.h"
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/widget/root_view.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/widget/widget.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenusing namespace views;
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass DOMViewTest : public InProcessBrowserTest {
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Widget* CreatePopupWindow() {
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Widget::CreateParams params(Widget::CreateParams::TYPE_POPUP);
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    params.mirror_origin_in_rtl = false;
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Widget* widget = Widget::CreateWidget(params);
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    widget->Init(NULL, gfx::Rect(0, 0, 400, 400));
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return widget;
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Tests if creating and deleting dom_view
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// does not crash and leak memory.
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(DOMViewTest, TestShowAndHide) {
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Widget* one = CreatePopupWindow();
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DOMView* dom_view = new DOMView();
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->GetRootView()->AddChildView(dom_view);
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  dom_view->Init(browser()->profile(), NULL);
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  dom_view->LoadURL(GURL("http://www.google.com"));
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::WaitForNotification(NotificationType::LOAD_STOP);
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->Show();
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::RunAllPendingInMessageLoop();
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->Hide();
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Tests if removing from tree then deleting dom_view
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// does not crash and leak memory.
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(DOMViewTest, TestRemoveAndDelete) {
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Widget* one = CreatePopupWindow();
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DOMView* dom_view = new DOMView();
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->GetRootView()->AddChildView(dom_view);
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  dom_view->Init(browser()->profile(), NULL);
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  dom_view->LoadURL(GURL("http://www.google.com"));
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::WaitForNotification(NotificationType::LOAD_STOP);
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->Show();
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::RunAllPendingInMessageLoop();
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->GetRootView()->RemoveChildView(dom_view);
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  delete dom_view;
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->Hide();
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Tests if reparenting dom_view does not crash and does not leak
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// memory.
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(DOMViewTest, TestReparent) {
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Widget* one = CreatePopupWindow();
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DOMView* dom_view = new DOMView();
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->GetRootView()->AddChildView(dom_view);
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  dom_view->Init(browser()->profile(), NULL);
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  dom_view->LoadURL(GURL("http://www.google.com"));
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::WaitForNotification(NotificationType::LOAD_STOP);
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->Show();
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::RunAllPendingInMessageLoop();
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->GetRootView()->RemoveChildView(dom_view);
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  one->Hide();
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Re-attach to another Widget.
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Widget* two = CreatePopupWindow();
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  two->GetRootView()->AddChildView(dom_view);
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  two->Show();
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ui_test_utils::RunAllPendingInMessageLoop();
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  two->Hide();
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
92