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