widget_unittest.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/events/event_utils.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/bubble/bubble_delegate.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/test_views_delegate.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/views_test_base.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_delegate.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_delegate.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/window/native_frame_view.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/aura_constants.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_aura.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_win.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A generic typedef to pick up relevant NativeWidget implementations. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef NativeWidgetAura NativeWidgetPlatform; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef NativeWidgetWin NativeWidgetPlatform; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A widget that assumes mouse capture always works. It won't on Aura in 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// testing, so we mock it. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NativeWidgetCapture : public NativeWidgetPlatform { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit NativeWidgetCapture(internal::NativeWidgetDelegate* delegate) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : NativeWidgetPlatform(delegate), 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_capture_(false) {} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NativeWidgetCapture() {} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetCapture() OVERRIDE { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_capture_ = true; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReleaseCapture() OVERRIDE { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_capture_) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate()->OnMouseCaptureLost(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_capture_ = false; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HasCapture() const OVERRIDE { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_capture_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool mouse_capture_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NativeWidgetCapture); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A typedef that inserts our mock-capture NativeWidget implementation for 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// relevant platforms. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef NativeWidgetCapture NativeWidgetPlatformForTest; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef NativeWidgetWin NativeWidgetPlatformForTest; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view that always processes all mouse events. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MouseView : public View { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseView() 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : View(), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entered_(0), 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exited_(0), 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pressed_(0) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MouseView() {} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pressed_++; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entered_++; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exited_++; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the number of OnMouseEntered calls and reset the counter. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int EnteredCalls() { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = entered_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entered_ = 0; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the number of OnMouseExited calls and reset the counter. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ExitedCalls() { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = exited_; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exited_ = 0; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pressed() const { return pressed_; } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entered_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exited_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pressed_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MouseView); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A view that keeps track of the events it receives, but consumes no events. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EventCountView : public View { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventCountView() {} 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~EventCountView() {} 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int GetEventCount(ui::EventType type) { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return event_count_[type]; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ResetCounts() { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_count_.clear(); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ui::EventHandler: 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordEvent(*event); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordEvent(*event); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordEvent(*event); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE { 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordEvent(*event); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordEvent(*event); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RecordEvent(const ui::Event& event) { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++event_count_[event.type()]; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<ui::EventType, int> event_count_; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EventCountView); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A view that keeps track of the events it receives, and consumes all scroll 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// gesture events. 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollableEventCountView : public EventCountView { 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollableEventCountView() {} 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ScrollableEventCountView() {} 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ui::EventHandler: 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventCountView::OnGestureEvent(event); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (event->type()) { 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ui::ET_GESTURE_SCROLL_BEGIN: 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ui::ET_GESTURE_SCROLL_UPDATE: 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ui::ET_GESTURE_SCROLL_END: 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ui::ET_SCROLL_FLING_START: 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScrollableEventCountView); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view that does a capture on gesture-begin events. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GestureCaptureView : public View { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureCaptureView() {} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~GestureCaptureView() {} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View: 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->type() == ui::ET_GESTURE_BEGIN) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWidget()->SetCapture(this); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GestureCaptureView); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A view that implements GetMinimumSize. 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MinimumSizeFrameView : public NativeFrameView { 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit MinimumSizeFrameView(Widget* frame): NativeFrameView(frame) {} 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~MinimumSizeFrameView() {} 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Overridden from View: 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual gfx::Size GetMinimumSize() OVERRIDE { 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Size(300, 400); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MinimumSizeFrameView); 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// An event handler that simply keeps a count of the different types of events 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// it receives. 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EventCountHandler : public ui::EventHandler { 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventCountHandler() {} 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~EventCountHandler() {} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int GetEventCount(ui::EventType type) { 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return event_count_[type]; 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ResetCounts() { 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_count_.clear(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ui::EventHandler: 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEvent(ui::Event* event) OVERRIDE { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecordEvent(*event); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EventHandler::OnEvent(event); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RecordEvent(const ui::Event& event) { 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++event_count_[event.type()]; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<ui::EventType, int> event_count_; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EventCountHandler); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WidgetTest : public ViewsTestBase { 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WidgetTest() {} 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WidgetTest() {} 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NativeWidget* CreatePlatformNativeWidget( 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::NativeWidgetDelegate* delegate) { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new NativeWidgetPlatformForTest(delegate); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* CreateTopLevelPlatformWidget() { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* toplevel = new Widget; 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams toplevel_params = 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_WINDOW); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel_params.native_widget = CreatePlatformNativeWidget(toplevel); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->Init(toplevel_params); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return toplevel; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* CreateTopLevelFramelessPlatformWidget() { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* toplevel = new Widget; 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams toplevel_params = 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel_params.native_widget = CreatePlatformNativeWidget(toplevel); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->Init(toplevel_params); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return toplevel; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* CreateChildPlatformWidget(gfx::NativeView parent_native_view) { 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* child = new Widget; 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams child_params = 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_CONTROL); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_params.native_widget = CreatePlatformNativeWidget(child); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_params.parent = parent_native_view; 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->Init(child_params); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetContentsView(new View); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return child; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Windows, it is possible for us to have a child window that is 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TYPE_POPUP. 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* CreateChildPopupPlatformWidget(gfx::NativeView parent_native_view) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* child = new Widget; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams child_params = 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_POPUP); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_params.child = true; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_params.native_widget = CreatePlatformNativeWidget(child); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_params.parent = parent_native_view; 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->Init(child_params); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetContentsView(new View); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return child; 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* CreateTopLevelNativeWidget() { 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* toplevel = new Widget; 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->Init(params); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return toplevel; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* CreateChildNativeWidgetWithParent(Widget* parent) { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* child = new Widget; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_CONTROL); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.parent = parent->GetNativeView(); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->Init(params); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetContentsView(new View); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return child; 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* CreateChildNativeWidget() { 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CreateChildNativeWidgetWithParent(NULL); 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WidgetHasMouseCapture(const Widget* widget) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const internal::NativeWidgetPrivate*>(widget-> 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget())->HasCapture(); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::WindowShowState GetWidgetShowState(const Widget* widget) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use IsMaximized/IsMinimized/IsFullScreen instead of GetWindowPlacement 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because the former is implemented on all platforms but the latter is not. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget->IsFullscreen() ? ui::SHOW_STATE_FULLSCREEN : 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->IsMaximized() ? ui::SHOW_STATE_MAXIMIZED : 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->IsMinimized() ? ui::SHOW_STATE_MINIMIZED : 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SHOW_STATE_NORMAL; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, WidgetInitParams) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(views_delegate().UseTransparentWindows()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Widgets are not transparent by default. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget::InitParams init1; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(init1.transparent); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-window widgets are not transparent either. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget::InitParams init2(Widget::InitParams::TYPE_MENU); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(init2.transparent); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A ViewsDelegate can set windows transparent by default. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views_delegate().SetUseTransparentWindows(true); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget::InitParams init3; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(init3.transparent); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-window widgets stay opaque. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget::InitParams init4(Widget::InitParams::TYPE_MENU); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(init4.transparent); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget::GetTopLevelWidget tests. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, GetTopLevelWidget_Native) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a hierarchy of native widgets. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView parent = toplevel->GetNativeView(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* child = CreateChildPlatformWidget(parent); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(toplevel, child->GetTopLevelWidget()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |child| should be automatically destroyed with |toplevel|. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests some grab/ungrab events. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, DISABLED_GrabUngrab) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* child1 = CreateChildNativeWidgetWithParent(toplevel); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* child2 = CreateChildNativeWidgetWithParent(toplevel); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->SetBounds(gfx::Rect(0, 0, 500, 500)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child1->SetBounds(gfx::Rect(10, 10, 300, 300)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* view = new MouseView(); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetBounds(0, 0, 300, 300); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child1->GetRootView()->AddChildView(view); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child2->SetBounds(gfx::Rect(200, 10, 200, 200)); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view = new MouseView(); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetBounds(0, 0, 200, 200); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child2->GetRootView()->AddChildView(view); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Show(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click on child1 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p1(45, 45); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, p1, p1, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&pressed); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WidgetHasMouseCapture(toplevel)); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WidgetHasMouseCapture(child1)); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(WidgetHasMouseCapture(child2)); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent released(ui::ET_MOUSE_RELEASED, p1, p1, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&released); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(WidgetHasMouseCapture(toplevel)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(WidgetHasMouseCapture(child1)); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(WidgetHasMouseCapture(child2)); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click on child2 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p2(315, 45); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent pressed2(ui::ET_MOUSE_PRESSED, p2, p2, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&pressed2); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(pressed2.handled()); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WidgetHasMouseCapture(toplevel)); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WidgetHasMouseCapture(child2)); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(WidgetHasMouseCapture(child1)); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent released2(ui::ET_MOUSE_RELEASED, p2, p2, 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&released2); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(WidgetHasMouseCapture(toplevel)); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(WidgetHasMouseCapture(child1)); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(WidgetHasMouseCapture(child2)); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests mouse move outside of the window into the "resize controller" and back 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will still generate an OnMouseEntered and OnMouseExited event.. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, CheckResizeControllerEvents) { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->SetBounds(gfx::Rect(0, 0, 100, 100)); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseView* view = new MouseView(); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetBounds(90, 90, 10, 10); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->GetRootView()->AddChildView(view); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Show(); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to an outside position. 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p1(200, 200); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent moved_out(ui::ET_MOUSE_MOVED, p1, p1, ui::EF_NONE); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&moved_out); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, view->EnteredCalls()); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, view->ExitedCalls()); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move onto the active view. 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p2(95, 95); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent moved_over(ui::ET_MOUSE_MOVED, p2, p2, ui::EF_NONE); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&moved_over); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, view->EnteredCalls()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, view->ExitedCalls()); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move onto the outer resizing border. 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p3(102, 95); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent moved_resizer(ui::ET_MOUSE_MOVED, p3, p3, ui::EF_NONE); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&moved_resizer); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, view->EnteredCalls()); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, view->ExitedCalls()); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move onto the view again. 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&moved_over); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, view->EnteredCalls()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, view->ExitedCalls()); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test if a focus manager and an inputmethod work without CHECK failure 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when window activation changes. 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, ChangeActivation) { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* top1 = CreateTopLevelPlatformWidget(); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CreateInputMethod before activated 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top1->GetInputMethod(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top1->Show(); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* top2 = CreateTopLevelPlatformWidget(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top2->Show(); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top1->Activate(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create InputMethod after deactivated. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top2->GetInputMethod(); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top2->Activate(); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top1->Activate(); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top1->CloseNow(); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top2->CloseNow(); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests visibility of child widgets. 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, Visibility) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView parent = toplevel->GetNativeView(); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* child = CreateChildPlatformWidget(parent); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(toplevel->IsVisible()); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(child->IsVisible()); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->Show(); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(toplevel->IsVisible()); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(child->IsVisible()); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Show(); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(toplevel->IsVisible()); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(child->IsVisible()); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |child| should be automatically destroyed with |toplevel|. 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On Windows, it is possible to have child window that are TYPE_POPUP. Unlike 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// regular child windows, these should be created as hidden and must be shown 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// explicitly. 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, Visibility_ChildPopup) { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* child_popup = CreateChildPopupPlatformWidget( 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->GetNativeView()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(toplevel->IsVisible()); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(child_popup->IsVisible()); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Show(); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(toplevel->IsVisible()); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(child_popup->IsVisible()); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_popup->Show(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(child_popup->IsVisible()); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |child_popup| should be automatically destroyed with |toplevel|. 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget ownership tests. 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests various permutations of Widget ownership specified in the 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InitParams::Ownership param. 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A WidgetTest that supplies a toplevel widget for NativeWidget to parent to. 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WidgetOwnershipTest : public WidgetTest { 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WidgetOwnershipTest() {} 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WidgetOwnershipTest() {} 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WidgetTest::SetUp(); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_widget_ = CreateTopLevelPlatformWidget(); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_widget_->CloseNow(); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WidgetTest::TearDown(); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* desktop_widget_; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WidgetOwnershipTest); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A bag of state to monitor destructions. 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct OwnershipTestState { 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState() : widget_deleted(false), native_widget_deleted(false) {} 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool widget_deleted; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool native_widget_deleted; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A platform NativeWidget subclass that updates a bag of state when it is 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destroyed. 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OwnershipTestNativeWidget : public NativeWidgetPlatform { 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestNativeWidget(internal::NativeWidgetDelegate* delegate, 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState* state) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : NativeWidgetPlatform(delegate), 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_(state) { 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OwnershipTestNativeWidget() { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_->native_widget_deleted = true; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState* state_; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OwnershipTestNativeWidget); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A views NativeWidget subclass that updates a bag of state when it is 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destroyed. 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OwnershipTestNativeWidgetPlatform : public NativeWidgetPlatformForTest { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestNativeWidgetPlatform(internal::NativeWidgetDelegate* delegate, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState* state) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : NativeWidgetPlatformForTest(delegate), 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_(state) { 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OwnershipTestNativeWidgetPlatform() { 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_->native_widget_deleted = true; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState* state_; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OwnershipTestNativeWidgetPlatform); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A Widget subclass that updates a bag of state when it is destroyed. 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OwnershipTestWidget : public Widget { 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit OwnershipTestWidget(OwnershipTestState* state) : state_(state) {} 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OwnershipTestWidget() { 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_->widget_deleted = true; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState* state_; 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OwnershipTestWidget); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget owns its NativeWidget, part 1: NativeWidget is a platform-native 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// widget. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetOwnershipTest, Ownership_WidgetOwnsPlatformNativeWidget) { 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState state; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new OwnershipTestWidget(&state)); 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.native_widget = 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new OwnershipTestNativeWidgetPlatform(widget.get(), &state); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now delete the Widget, which should delete the NativeWidget. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget.reset(); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.widget_deleted); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.native_widget_deleted); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(beng): write test for this ownership scenario and the NativeWidget 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being deleted out from under the Widget. 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget owns its NativeWidget, part 2: NativeWidget is a NativeWidget. 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetOwnershipTest, Ownership_WidgetOwnsViewsNativeWidget) { 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState state; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new OwnershipTestWidget(&state)); 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.native_widget = 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new OwnershipTestNativeWidgetPlatform(widget.get(), &state); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now delete the Widget, which should delete the NativeWidget. 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget.reset(); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.widget_deleted); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.native_widget_deleted); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(beng): write test for this ownership scenario and the NativeWidget 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being deleted out from under the Widget. 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget owns its NativeWidget, part 3: NativeWidget is a NativeWidget, 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destroy the parent view. 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetOwnershipTest, 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Ownership_WidgetOwnsViewsNativeWidget_DestroyParentView) { 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState state; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new OwnershipTestWidget(&state)); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.native_widget = 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new OwnershipTestNativeWidgetPlatform(widget.get(), &state); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.parent = toplevel->GetNativeView(); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now close the toplevel, which deletes the view hierarchy. 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This shouldn't delete the widget because it shouldn't be deleted 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the native side. 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(state.widget_deleted); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(state.native_widget_deleted); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now delete it explicitly. 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget.reset(); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.widget_deleted); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.native_widget_deleted); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidget owns its Widget, part 1: NativeWidget is a platform-native 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// widget. 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetOwnershipTest, Ownership_PlatformNativeWidgetOwnsWidget) { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState state; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new OwnershipTestWidget(&state); 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.native_widget = 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new OwnershipTestNativeWidgetPlatform(widget, &state); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now destroy the native widget. 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.widget_deleted); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.native_widget_deleted); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidget owns its Widget, part 2: NativeWidget is a NativeWidget. 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetOwnershipTest, Ownership_ViewsNativeWidgetOwnsWidget) { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState state; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new OwnershipTestWidget(&state); 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.native_widget = 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new OwnershipTestNativeWidgetPlatform(widget, &state); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.parent = toplevel->GetNativeView(); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now destroy the native widget. This is achieved by closing the toplevel. 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The NativeWidget won't be deleted until after a return to the message loop 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we have to run pending messages before testing the destruction status. 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.widget_deleted); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.native_widget_deleted); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidget owns its Widget, part 3: NativeWidget is a platform-native 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// widget, destroyed out from under it by the OS. 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetOwnershipTest, 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Ownership_PlatformNativeWidgetOwnsWidget_NativeDestroy) { 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState state; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new OwnershipTestWidget(&state); 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.native_widget = 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new OwnershipTestNativeWidgetPlatform(widget, &state); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now simulate a destroy of the platform native widget from the OS: 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete widget->GetNativeView(); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DestroyWindow(widget->GetNativeView()); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.widget_deleted); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.native_widget_deleted); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidget owns its Widget, part 4: NativeWidget is a NativeWidget, 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destroyed by the view hierarchy that contains it. 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetOwnershipTest, 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Ownership_ViewsNativeWidgetOwnsWidget_NativeDestroy) { 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState state; 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new OwnershipTestWidget(&state); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.native_widget = 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new OwnershipTestNativeWidgetPlatform(widget, &state); 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.parent = toplevel->GetNativeView(); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy the widget (achieved by closing the toplevel). 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The NativeWidget won't be deleted until after a return to the message loop 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we have to run pending messages before testing the destruction status. 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.widget_deleted); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.native_widget_deleted); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidget owns its Widget, part 5: NativeWidget is a NativeWidget, 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we close it directly. 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetOwnershipTest, 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Ownership_ViewsNativeWidgetOwnsWidget_Close) { 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwnershipTestState state; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new OwnershipTestWidget(&state); 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.native_widget = 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new OwnershipTestNativeWidgetPlatform(widget, &state); 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.parent = toplevel->GetNativeView(); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy the widget. 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Close(); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The NativeWidget won't be deleted until after a return to the message loop 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we have to run pending messages before testing the destruction status. 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.widget_deleted); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(state.native_widget_deleted); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Widget owns its NativeWidget and has a WidgetDelegateView as its contents. 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetOwnershipTest, 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Ownership_WidgetOwnsNativeWidgetWithWithWidgetDelegateView) { 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OwnershipTestState state; 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WidgetDelegateView* delegate_view = new WidgetDelegateView; 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Widget> widget(new OwnershipTestWidget(&state)); 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.native_widget = 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new OwnershipTestNativeWidgetPlatform(widget.get(), &state); 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.delegate = delegate_view; 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(params); 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->SetContentsView(delegate_view); 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now delete the Widget. There should be no crash or use-after-free. 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.reset(); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(state.widget_deleted); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(state.native_widget_deleted); 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget observer tests. 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WidgetObserverTest : public WidgetTest, public WidgetObserver { 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WidgetObserverTest() 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : active_(NULL), 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_closed_(NULL), 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_activated_(NULL), 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_shown_(NULL), 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_hidden_(NULL), 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_bounds_changed_(NULL) { 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WidgetObserverTest() {} 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from WidgetObserver: 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWidgetDestroying(Widget* widget) OVERRIDE { 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (active_ == widget) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_ = NULL; 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_closed_ = widget; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWidgetActivationChanged(Widget* widget, 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool active) OVERRIDE { 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (active) { 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (widget_activated_) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_activated_->Deactivate(); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_activated_ = widget; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_ = widget; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (widget_activated_ == widget) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_activated_ = NULL; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_deactivated_ = widget; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWidgetVisibilityChanged(Widget* widget, 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool visible) OVERRIDE { 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (visible) 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_shown_ = widget; 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_hidden_ = widget; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWidgetBoundsChanged(Widget* widget, 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& new_bounds) OVERRIDE { 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_bounds_changed_ = widget; 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void reset() { 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_ = NULL; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_closed_ = NULL; 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_activated_ = NULL; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_deactivated_ = NULL; 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_shown_ = NULL; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_hidden_ = NULL; 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_bounds_changed_ = NULL; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* NewWidget() { 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = CreateTopLevelNativeWidget(); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->AddObserver(this); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Widget* active() const { return active_; } 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Widget* widget_closed() const { return widget_closed_; } 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Widget* widget_activated() const { return widget_activated_; } 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Widget* widget_deactivated() const { return widget_deactivated_; } 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Widget* widget_shown() const { return widget_shown_; } 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Widget* widget_hidden() const { return widget_hidden_; } 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Widget* widget_bounds_changed() const { return widget_bounds_changed_; } 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* active_; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget_closed_; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget_activated_; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget_deactivated_; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget_shown_; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget_hidden_; 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* widget_bounds_changed_; 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetObserverTest, DISABLED_ActivationChange) { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel1 = NewWidget(); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel2 = NewWidget(); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel1->Show(); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel2->Show(); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reset(); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel1->Activate(); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(toplevel1, widget_activated()); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel2->Activate(); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(toplevel1, widget_deactivated()); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(toplevel2, widget_activated()); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(toplevel2, active()); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetObserverTest, DISABLED_VisibilityChange) { 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* child1 = NewWidget(); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* child2 = NewWidget(); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Show(); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child1->Show(); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child2->Show(); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reset(); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child1->Hide(); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(child1, widget_hidden()); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child2->Hide(); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(child2, widget_hidden()); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child1->Show(); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(child1, widget_shown()); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child2->Show(); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(child2, widget_shown()); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->CloseNow(); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetObserverTest, DestroyBubble) { 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* anchor = CreateTopLevelPlatformWidget(); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) anchor->Show(); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BubbleDelegateView* bubble_delegate = 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BubbleDelegateView(anchor->client_view(), BubbleBorder::NONE); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* bubble_widget(BubbleDelegateView::CreateBubble(bubble_delegate)); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bubble_widget->Show(); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bubble_widget->CloseNow(); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) anchor->Hide(); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) anchor->CloseNow(); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetObserverTest, WidgetBoundsChanged) { 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* child1 = NewWidget(); 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* child2 = NewWidget(); 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child1->OnNativeWidgetMove(); 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(child1, widget_bounds_changed()); 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child2->OnNativeWidgetMove(); 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(child2, widget_bounds_changed()); 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child1->OnNativeWidgetSizeChanged(gfx::Size()); 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(child1, widget_bounds_changed()); 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child2->OnNativeWidgetSizeChanged(gfx::Size()); 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(child2, widget_bounds_changed()); 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_AURA) && defined(OS_WIN) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Aura needs shell to maximize/fullscreen window. 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidgetGtk doesn't implement GetRestoredBounds. 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, GetRestoredBounds) { 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(toplevel->GetWindowBoundsInScreen().ToString(), 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->GetRestoredBounds().ToString()); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Show(); 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Maximize(); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(toplevel->GetWindowBoundsInScreen().ToString(), 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->GetRestoredBounds().ToString()); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(toplevel->GetRestoredBounds().width(), 0); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(toplevel->GetRestoredBounds().height(), 0); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Restore(); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(toplevel->GetWindowBoundsInScreen().ToString(), 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->GetRestoredBounds().ToString()); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->SetFullscreen(true); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(toplevel->GetWindowBoundsInScreen().ToString(), 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->GetRestoredBounds().ToString()); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(toplevel->GetRestoredBounds().width(), 0); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(toplevel->GetRestoredBounds().height(), 0); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that window state is not changed after getting out of full screen. 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, ExitFullscreenRestoreState) { 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Show(); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should be a normal state window. 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::SHOW_STATE_NORMAL, GetWidgetShowState(toplevel)); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->SetFullscreen(true); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (GetWidgetShowState(toplevel) != ui::SHOW_STATE_FULLSCREEN) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->SetFullscreen(false); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (GetWidgetShowState(toplevel) == ui::SHOW_STATE_FULLSCREEN) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And it should still be in normal state after getting out of full screen. 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::SHOW_STATE_NORMAL, GetWidgetShowState(toplevel)); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, make it maximized. 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Maximize(); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (GetWidgetShowState(toplevel) != ui::SHOW_STATE_MAXIMIZED) 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->SetFullscreen(true); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (GetWidgetShowState(toplevel) != ui::SHOW_STATE_FULLSCREEN) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->SetFullscreen(false); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (GetWidgetShowState(toplevel) == ui::SHOW_STATE_FULLSCREEN) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And it stays maximized after getting out of full screen. 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, GetWidgetShowState(toplevel)); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up. 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Close(); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, ResetCaptureOnGestureEnd) { 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* toplevel = CreateTopLevelFramelessPlatformWidget(); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* container = new View; 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->SetContentsView(container); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* gesture = new GestureCaptureView; 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture->SetBounds(0, 0, 30, 30); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container->AddChildView(gesture); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseView* mouse = new MouseView; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse->SetBounds(30, 0, 30, 30); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container->AddChildView(mouse); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->SetSize(gfx::Size(100, 100)); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Show(); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start a gesture on |gesture|. 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GestureEvent begin(ui::ET_GESTURE_BEGIN, 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15, 15, 0, base::TimeDelta(), 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GestureEventDetails(ui::ET_GESTURE_BEGIN, 0, 0), 1); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GestureEvent end(ui::ET_GESTURE_END, 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15, 15, 0, base::TimeDelta(), 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GestureEventDetails(ui::ET_GESTURE_END, 0, 0), 1); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->OnGestureEvent(&begin); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try to click on |mouse|. Since |gesture| will have capture, |mouse| 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will not receive the event. 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point click_location(45, 15); 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent press(ui::ET_MOUSE_PRESSED, click_location, click_location, 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent release(ui::ET_MOUSE_RELEASED, click_location, click_location, 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&press); 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&release); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, mouse->pressed()); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The end of the gesture should release the capture, and pressing on |mouse| 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should now reach |mouse|. 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->OnGestureEvent(&end); 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&press); 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnMouseEvent(&release); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, mouse->pressed()); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Close(); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPendingMessages(); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The key-event propagation from Widget happens differently on aura and 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// non-aura systems because of the difference in IME. So this test works only on 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// aura. 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WidgetTest, KeyboardInputEvent) { 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel = CreateTopLevelPlatformWidget(); 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* container = toplevel->client_view(); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* textfield = new Textfield(); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->SetText(ASCIIToUTF16("some text")); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container->AddChildView(textfield); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Show(); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->RequestFocus(); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The press gets handled. The release doesn't have an effect. 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::KeyEvent backspace_p(ui::ET_KEY_PRESSED, ui::VKEY_DELETE, 0, false); 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnKeyEvent(&backspace_p); 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backspace_p.stopped_propagation()); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::KeyEvent backspace_r(ui::ET_KEY_RELEASED, ui::VKEY_DELETE, 0, false); 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) toplevel->OnKeyEvent(&backspace_r); 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(backspace_r.handled()); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel->Close(); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies bubbles result in a focus lost when shown. 1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(msw): this tests relies on focus, it needs to be in 1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// interactive_ui_tests. 1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WidgetTest, DISABLED_FocusChangesOnBubble) { 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a widget, show and activate it and focus the contents view. 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* contents_view = new View; 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_view->set_focusable(true); 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget widget; 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams init_params = 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.bounds = gfx::Rect(0, 0, 200, 200); 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS) 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.native_widget = new DesktopNativeWidgetAura(&widget); 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Init(init_params); 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.SetContentsView(contents_view); 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Show(); 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Activate(); 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_view->RequestFocus(); 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(contents_view->HasFocus()); 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Show a bubble. 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BubbleDelegateView* bubble_delegate_view = 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BubbleDelegateView(contents_view, BubbleBorder::TOP_LEFT); 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_delegate_view->set_focusable(true); 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BubbleDelegateView::CreateBubble(bubble_delegate_view)->Show(); 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_delegate_view->RequestFocus(); 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |contents_view_| should no longer have focus. 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(contents_view->HasFocus()); 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(bubble_delegate_view->HasFocus()); 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_delegate_view->GetWidget()->CloseNow(); 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Closing the bubble should result in focus going back to the contents view. 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(contents_view->HasFocus()); 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Desktop native widget Aura tests are for non Chrome OS platforms. 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS) 1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test to ensure that after minimize, view width is set to zero. 1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WidgetTest, TestViewWidthAfterMinimizingWidget) { 1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a widget. 1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget widget; 1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget::InitParams init_params = 1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_WINDOW); 1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) init_params.show_state = ui::SHOW_STATE_NORMAL; 1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect initial_bounds(0, 0, 300, 400); 1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) init_params.bounds = initial_bounds; 1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) init_params.native_widget = new DesktopNativeWidgetAura(&widget); 1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget.Init(init_params); 1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonClientView* non_client_view = widget.non_client_view(); 1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget); 1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) non_client_view->SetFrameView(frame_view); 1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget.Show(); 1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget.Minimize(); 1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, frame_view->width()); 1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class validates whether paints are received for a visible Widget. 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// To achieve this it overrides the Show and Close methods on the Widget class 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and sets state whether subsequent paints are expected. 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DesktopAuraTestValidPaintWidget : public views::Widget { 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopAuraTestValidPaintWidget() 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : expect_paint_(true), 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) received_paint_while_hidden_(false) { 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DesktopAuraTestValidPaintWidget() { 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Show() OVERRIDE { 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expect_paint_ = true; 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::Show(); 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Close() OVERRIDE { 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expect_paint_ = false; 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::Close(); 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Hide() { 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expect_paint_ = false; 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::Hide(); 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnNativeWidgetPaint(gfx::Canvas* canvas) OVERRIDE { 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(expect_paint_); 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!expect_paint_) 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) received_paint_while_hidden_ = true; 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::OnNativeWidgetPaint(canvas); 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_paint_while_hidden() const { 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return received_paint_while_hidden_; 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool expect_paint_; 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_paint_while_hidden_; 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetTest, DesktopNativeWidgetAuraNoPaintAfterCloseTest) { 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* contents_view = new View; 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_view->set_focusable(true); 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopAuraTestValidPaintWidget widget; 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams init_params = 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.bounds = gfx::Rect(0, 0, 200, 200); 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.native_widget = new DesktopNativeWidgetAura(&widget); 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Init(init_params); 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.SetContentsView(contents_view); 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Show(); 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Activate(); 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingMessages(); 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.SchedulePaintInRect(init_params.bounds); 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Close(); 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingMessages(); 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(widget.received_paint_while_hidden()); 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetTest, DesktopNativeWidgetAuraNoPaintAfterHideTest) { 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* contents_view = new View; 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_view->set_focusable(true); 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopAuraTestValidPaintWidget widget; 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams init_params = 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.bounds = gfx::Rect(0, 0, 200, 200); 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.native_widget = new DesktopNativeWidgetAura(&widget); 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Init(init_params); 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.SetContentsView(contents_view); 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Show(); 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Activate(); 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingMessages(); 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.SchedulePaintInRect(init_params.bounds); 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Hide(); 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingMessages(); 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(widget.received_paint_while_hidden()); 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget.Close(); 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class provides functionality to test whether the destruction of full 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// screen child windows occurs correctly in desktop AURA without crashing. 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// It provides facilities to test the following cases:- 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1. Child window destroyed which should lead to the destruction of the 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// parent. 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 2. Parent window destroyed which should lead to the child being destroyed. 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DesktopAuraFullscreenChildWindowDestructionTest 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public views::TestViewsDelegate, 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public aura::WindowObserver { 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopAuraFullscreenChildWindowDestructionTest() 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : full_screen_widget_(NULL), 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_(NULL), 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_destroyed_(false), 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_destroyed_(false) {} 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1351b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual ~DesktopAuraFullscreenChildWindowDestructionTest() { 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(parent_destroyed_); 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(child_destroyed_); 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) full_screen_widget_ = NULL; 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_ = NULL; 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::TestViewsDelegate overrides. 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnBeforeWidgetInit( 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams* params, 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::NativeWidgetDelegate* delegate) OVERRIDE { 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params->native_widget) 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->native_widget = new views::DesktopNativeWidgetAura(delegate); 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CreateFullscreenChildWindow(const gfx::Rect& bounds) { 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams init_params; 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.type = Widget::InitParams::TYPE_WINDOW; 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.bounds = bounds; 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.layer_type = ui::LAYER_NOT_DRAWN; 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_.Init(init_params); 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_ = new aura::Window(&child_window_delegate_); 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_->SetType(aura::client::WINDOW_TYPE_NORMAL); 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_->Init(ui::LAYER_TEXTURED); 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_->SetName("TestFullscreenChildWindow"); 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_->SetProperty(aura::client::kShowStateKey, 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::SHOW_STATE_FULLSCREEN); 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_->SetDefaultParentByRootWindow( 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_.GetNativeView()->GetRootWindow(), gfx::Rect(0, 0, 1900, 1600)); 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_->Show(); 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_->AddObserver(this); 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(child_window_->parent() != NULL); 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_window_->parent()->AddObserver(this); 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) full_screen_widget_ = 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::GetWidgetForNativeView(child_window_->parent()); 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(full_screen_widget_ != NULL); 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DestroyChildWindow() { 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(child_window_ != NULL); 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete child_window_; 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DestroyParentWindow() { 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(full_screen_widget_ != NULL); 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) full_screen_widget_->CloseNow(); 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowDestroying(aura::Window* window) OVERRIDE { 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->RemoveObserver(this); 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (window == child_window_) { 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_destroyed_ = true; 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (window == full_screen_widget_->GetNativeView()) { 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_destroyed_ = true; 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ADD_FAILURE() << "Unexpected window destroyed callback: " << window; 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget widget_; 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* full_screen_widget_; 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* child_window_; 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool parent_destroyed_; 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool child_destroyed_; 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::TestWindowDelegate child_window_delegate_; 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DesktopAuraFullscreenChildWindowDestructionTest); 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetTest, DesktopAuraFullscreenChildDestroyedBeforeParentTest) { 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ViewsDelegate::views_delegate = NULL; 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopAuraFullscreenChildWindowDestructionTest full_screen_child_test; 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(full_screen_child_test.CreateFullscreenChildWindow( 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 200, 200))); 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingMessages(); 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(full_screen_child_test.DestroyChildWindow()); 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingMessages(); 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetTest, DesktopAuraFullscreenChildParentDestroyed) { 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ViewsDelegate::views_delegate = NULL; 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopAuraFullscreenChildWindowDestructionTest full_screen_child_test; 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(full_screen_child_test.CreateFullscreenChildWindow( 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 200, 200))); 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingMessages(); 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(full_screen_child_test.DestroyParentWindow()); 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunPendingMessages(); 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test to ensure that the aura Window's visiblity state is set to visible if 1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the underlying widget is hidden and then shown. 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WidgetTest, TestWindowVisibilityAfterHide) { 1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create a widget. 1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget widget; 1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget::InitParams init_params = 1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_WINDOW); 1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) init_params.show_state = ui::SHOW_STATE_NORMAL; 1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect initial_bounds(0, 0, 300, 400); 1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) init_params.bounds = initial_bounds; 1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) init_params.native_widget = new DesktopNativeWidgetAura(&widget); 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget.Init(init_params); 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonClientView* non_client_view = widget.non_client_view(); 1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget); 1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) non_client_view->SetFrameView(frame_view); 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget.Hide(); 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(widget.GetNativeView()->IsVisible()); 1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget.Show(); 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(widget.GetNativeView()->IsVisible()); 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // !defined(OS_CHROMEOS) 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that wheel events generated from scroll events are targetted to the 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// views under the cursor when the focused view does not processed them. 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetTest, WheelEventsFromScrollEventTarget) { 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventCountView* cursor_view = new EventCountView; 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_view->SetBounds(60, 0, 50, 40); 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* widget = CreateTopLevelPlatformWidget(); 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->GetRootView()->AddChildView(cursor_view); 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Generate a scroll event on the cursor view. 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScrollEvent scroll(ui::ET_SCROLL, 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(65, 5), 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EventTimeForNow(), 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 20, 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 20, 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2); 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnScrollEvent(&scroll); 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, cursor_view->GetEventCount(ui::ET_SCROLL)); 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, cursor_view->GetEventCount(ui::ET_MOUSEWHEEL)); 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_view->ResetCounts(); 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScrollEvent scroll2(ui::ET_SCROLL, 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(5, 5), 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EventTimeForNow(), 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 20, 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 20, 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2); 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnScrollEvent(&scroll2); 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, cursor_view->GetEventCount(ui::ET_SCROLL)); 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, cursor_view->GetEventCount(ui::ET_MOUSEWHEEL)); 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->CloseNow(); 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(USE_AURA) 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that if a scroll-begin gesture is not handled, then subsequent scroll 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// events are not dispatched to any view. 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetTest, GestureScrollEventDispatching) { 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventCountView* noscroll_view = new EventCountView; 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventCountView* scroll_view = new ScrollableEventCountView; 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) noscroll_view->SetBounds(0, 0, 50, 40); 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_view->SetBounds(60, 0, 40, 40); 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* widget = CreateTopLevelPlatformWidget(); 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->GetRootView()->AddChildView(noscroll_view); 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->GetRootView()->AddChildView(scroll_view); 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEvent begin(ui::ET_GESTURE_SCROLL_BEGIN, 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5, 5, 0, base::TimeDelta(), 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN, 0, 0), 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnGestureEvent(&begin); 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEvent update(ui::ET_GESTURE_SCROLL_UPDATE, 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25, 15, 0, base::TimeDelta(), 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 20, 10), 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnGestureEvent(&update); 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEvent end(ui::ET_GESTURE_SCROLL_END, 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25, 15, 0, base::TimeDelta(), 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END, 0, 0), 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnGestureEvent(&end); 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, noscroll_view->GetEventCount(ui::ET_GESTURE_SCROLL_BEGIN)); 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, noscroll_view->GetEventCount(ui::ET_GESTURE_SCROLL_UPDATE)); 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, noscroll_view->GetEventCount(ui::ET_GESTURE_SCROLL_END)); 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEvent begin(ui::ET_GESTURE_SCROLL_BEGIN, 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 65, 5, 0, base::TimeDelta(), 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN, 0, 0), 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnGestureEvent(&begin); 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEvent update(ui::ET_GESTURE_SCROLL_UPDATE, 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85, 15, 0, base::TimeDelta(), 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 20, 10), 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnGestureEvent(&update); 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEvent end(ui::ET_GESTURE_SCROLL_END, 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85, 15, 0, base::TimeDelta(), 15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END, 0, 0), 15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnGestureEvent(&end); 15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, scroll_view->GetEventCount(ui::ET_GESTURE_SCROLL_BEGIN)); 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, scroll_view->GetEventCount(ui::ET_GESTURE_SCROLL_UPDATE)); 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, scroll_view->GetEventCount(ui::ET_GESTURE_SCROLL_END)); 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->CloseNow(); 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that event-handlers installed on the RootView get triggered correctly. 15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetTest, EventHandlersOnRootView) { 15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* widget = CreateTopLevelNativeWidget(); 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* root_view = widget->GetRootView(); 15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventCountView* view = new EventCountView; 15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->SetBounds(0, 0, 20, 20); 15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_view->AddChildView(view); 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventCountHandler h1; 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_view->AddPreTargetHandler(&h1); 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventCountHandler h2; 15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_view->AddPostTargetHandler(&h2); 15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->SetBounds(gfx::Rect(0, 0, 100, 100)); 15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Show(); 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TouchEvent pressed(ui::ET_TOUCH_PRESSED, 15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(10, 10), 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0, 15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EventTimeForNow(), 15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.0, 0.0, 1.0, 0.0); 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnTouchEvent(&pressed); 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, h1.GetEventCount(ui::ET_TOUCH_PRESSED)); 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, view->GetEventCount(ui::ET_TOUCH_PRESSED)); 16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, h2.GetEventCount(ui::ET_TOUCH_PRESSED)); 16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEvent begin(ui::ET_GESTURE_BEGIN, 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5, 5, 0, ui::EventTimeForNow(), 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEventDetails(ui::ET_GESTURE_BEGIN, 0, 0), 1); 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEvent end(ui::ET_GESTURE_END, 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5, 5, 0, ui::EventTimeForNow(), 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEventDetails(ui::ET_GESTURE_END, 0, 0), 1); 16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnGestureEvent(&begin); 16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, h1.GetEventCount(ui::ET_GESTURE_BEGIN)); 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, view->GetEventCount(ui::ET_GESTURE_BEGIN)); 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, h2.GetEventCount(ui::ET_GESTURE_BEGIN)); 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TouchEvent released(ui::ET_TOUCH_RELEASED, 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(10, 10), 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0, 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EventTimeForNow(), 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1.0, 0.0, 1.0, 0.0); 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnTouchEvent(&released); 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, h1.GetEventCount(ui::ET_TOUCH_RELEASED)); 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, view->GetEventCount(ui::ET_TOUCH_RELEASED)); 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, h2.GetEventCount(ui::ET_TOUCH_RELEASED)); 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnGestureEvent(&end); 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, h1.GetEventCount(ui::ET_GESTURE_END)); 16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, view->GetEventCount(ui::ET_GESTURE_END)); 16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, h2.GetEventCount(ui::ET_GESTURE_END)); 16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScrollEvent scroll(ui::ET_SCROLL, 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(5, 5), 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EventTimeForNow(), 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 20, 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 20, 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2); 16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->OnScrollEvent(&scroll); 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, h1.GetEventCount(ui::ET_SCROLL)); 16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, view->GetEventCount(ui::ET_SCROLL)); 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, h2.GetEventCount(ui::ET_SCROLL)); 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->CloseNow(); 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WidgetTest, SynthesizeMouseMoveEvent) { 1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget* widget = CreateTopLevelNativeWidget(); 1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) View* root_view = widget->GetRootView(); 1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EventCountView* v1 = new EventCountView(); 1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) v1->SetBounds(0, 0, 10, 10); 1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_view->AddChildView(v1); 1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EventCountView* v2 = new EventCountView(); 1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) v2->SetBounds(0, 10, 10, 10); 1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_view->AddChildView(v2); 1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Point cursor_location(5, 5); 1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::MouseEvent move(ui::ET_MOUSE_MOVED, cursor_location, cursor_location, 1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::EF_NONE); 1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget->OnMouseEvent(&move); 1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, v1->GetEventCount(ui::ET_MOUSE_ENTERED)); 1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, v2->GetEventCount(ui::ET_MOUSE_ENTERED)); 1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete v1; 1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) v2->SetBounds(0, 0, 10, 10); 1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, v2->GetEventCount(ui::ET_MOUSE_ENTERED)); 1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget->SynthesizeMouseMoveEvent(); 1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, v2->GetEventCount(ui::ET_MOUSE_ENTERED)); 1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Used by SingleWindowClosing to count number of times WindowClosing() has 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// been invoked. 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ClosingDelegate : public WidgetDelegate { 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClosingDelegate() : count_(0), widget_(NULL) {} 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int count() const { return count_; } 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_widget(views::Widget* widget) { widget_ = widget; } 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WidgetDelegate overrides: 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Widget* GetWidget() OVERRIDE { return widget_; } 16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const Widget* GetWidget() const OVERRIDE { return widget_; } 16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void WindowClosing() OVERRIDE { 16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) count_++; 16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int count_; 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* widget_; 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ClosingDelegate); 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies WindowClosing() is invoked correctly on the delegate when a Widget 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is closed. 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetTest, SingleWindowClosing) { 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ClosingDelegate> delegate(new ClosingDelegate()); 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* widget = new Widget(); // Destroyed by CloseNow() below. 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams init_params = 17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_WINDOW); 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.bounds = gfx::Rect(0, 0, 200, 200); 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.delegate = delegate.get(); 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) && !defined(OS_CHROMEOS) 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_params.native_widget = new DesktopNativeWidgetAura(widget); 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(init_params); 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, delegate->count()); 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->CloseNow(); 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, delegate->count()); 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Used by SetTopLevelCorrectly to track calls to OnBeforeWidgetInit(). 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VerifyTopLevelDelegate : public TestViewsDelegate { 17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VerifyTopLevelDelegate() 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : on_before_init_called_(false), 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_top_level_(false) { 17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool on_before_init_called() const { return on_before_init_called_; } 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_top_level() const { return is_top_level_; } 17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnBeforeWidgetInit( 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams* params, 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::NativeWidgetDelegate* delegate) OVERRIDE { 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) on_before_init_called_ = true; 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_top_level_ = params->top_level; 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool on_before_init_called_; 17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_top_level_; 17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VerifyTopLevelDelegate); 17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies |top_level| is correctly passed to 17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ViewsDelegate::OnBeforeWidgetInit(). 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WidgetTest, SetTopLevelCorrectly) { 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_views_delegate(NULL); 17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VerifyTopLevelDelegate* delegate = new VerifyTopLevelDelegate; 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_views_delegate(delegate); // ViewsTestBase takes ownership. 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = 17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams(views::Widget::InitParams::TYPE_POPUP); 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(params); 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(delegate->on_before_init_called()); 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(delegate->is_top_level()); 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A scumbag View that deletes its owning widget OnMousePressed. 1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WidgetDeleterView : public View { 1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WidgetDeleterView() : View() {} 1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Overridden from View. 1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE { 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete GetWidget(); 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WidgetDeleterView); 1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WidgetTest, TestWidgetDeletedInOnMousePressed) { 1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget* widget = new Widget; 1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget::InitParams params = 1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateParams(views::Widget::InitParams::TYPE_POPUP); 1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget->Init(params); 1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget->SetContentsView(new WidgetDeleterView); 1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget->SetSize(gfx::Size(100, 100)); 1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget->Show(); 1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Point click_location(45, 15); 1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::MouseEvent press(ui::ET_MOUSE_PRESSED, click_location, click_location, 1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget->OnMouseEvent(&press); 1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Yay we did not crash! 1786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 1790