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 "chrome/browser/ui/panels/base_panel_browser_test.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/browser_window.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/panels/detached_panel_collection.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/native_panel.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/panels/panel_collection.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel_mouse_watcher.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/panels/stacked_panel_collection.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/test_panel_active_state_observer.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/test_panel_mouse_watcher.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/web_contents_tester.h" 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_system.h" 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/browser/install_flag.h" 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest_constants.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/x/x11_util.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/cocoa/run_loop_testing.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContentsTester; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::Rect kTestingPrimaryDisplayArea = gfx::Rect(0, 0, 800, 600); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::Rect kTestingPrimaryWorkArea = gfx::Rect(0, 0, 800, 580); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MockDesktopBar { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool auto_hiding_enabled; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisplaySettingsProvider::DesktopBarVisibility visibility; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int thickness; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDisplaySettingsProviderImpl : 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public BasePanelBrowserTest::MockDisplaySettingsProvider { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit MockDisplaySettingsProviderImpl(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockDisplaySettingsProviderImpl() { } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from DisplaySettingsProvider: 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Rect GetPrimaryDisplayArea() const OVERRIDE; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Rect GetPrimaryWorkArea() const OVERRIDE; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Rect GetDisplayAreaMatching( 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& bounds) const OVERRIDE; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Rect GetWorkAreaMatching( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& bounds) const OVERRIDE; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsAutoHidingDesktopBarEnabled( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBarAlignment alignment) OVERRIDE; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetDesktopBarThickness( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBarAlignment alignment) const OVERRIDE; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual DesktopBarVisibility GetDesktopBarVisibility( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBarAlignment alignment) const OVERRIDE; 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual bool IsFullScreen() OVERRIDE; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from MockDisplaySettingsProvider: 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetPrimaryDisplay( 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& display_area, const gfx::Rect& work_area) OVERRIDE; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetSecondaryDisplay( 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& display_area, const gfx::Rect& work_area) OVERRIDE; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EnableAutoHidingDesktopBar(DesktopBarAlignment alignment, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enabled, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int thickness) OVERRIDE; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetDesktopBarVisibility( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBarAlignment alignment, DesktopBarVisibility visibility) OVERRIDE; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetDesktopBarThickness(DesktopBarAlignment alignment, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int thickness) OVERRIDE; 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void EnableFullScreenMode(bool enabled) OVERRIDE; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect primary_display_area_; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect primary_work_area_; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect secondary_display_area_; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect secondary_work_area_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockDesktopBar mock_desktop_bars[3]; 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool full_screen_enabled_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockDisplaySettingsProviderImpl); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)MockDisplaySettingsProviderImpl::MockDisplaySettingsProviderImpl() 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) : full_screen_enabled_(false) { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memset(mock_desktop_bars, 0, sizeof(mock_desktop_bars)); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect MockDisplaySettingsProviderImpl::GetPrimaryDisplayArea() const { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return primary_display_area_; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect MockDisplaySettingsProviderImpl::GetPrimaryWorkArea() const { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return primary_work_area_; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect MockDisplaySettingsProviderImpl::GetDisplayAreaMatching( 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& bounds) const { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (secondary_display_area_.IsEmpty()) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return primary_display_area_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect primary_intersection = 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::IntersectRects(bounds, primary_display_area_); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int primary_intersection_size = 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) primary_intersection.width() * primary_intersection.height(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect secondary_intersection = 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::IntersectRects(bounds, secondary_display_area_); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int secondary_intersection_size = 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) secondary_intersection.width() * secondary_intersection.height(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return primary_intersection_size >= secondary_intersection_size ? 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) primary_display_area_ : secondary_display_area_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect MockDisplaySettingsProviderImpl::GetWorkAreaMatching( 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& bounds) const { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (secondary_work_area_.IsEmpty()) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return primary_work_area_; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect primary_intersection = 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::IntersectRects(bounds, primary_work_area_); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int primary_intersection_size = 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) primary_intersection.width() * primary_intersection.height(); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect secondary_intersection = 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::IntersectRects(bounds, secondary_work_area_); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int secondary_intersection_size = 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) secondary_intersection.width() * secondary_intersection.height(); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return primary_intersection_size >= secondary_intersection_size ? 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) primary_work_area_ : secondary_work_area_; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockDisplaySettingsProviderImpl::IsAutoHidingDesktopBarEnabled( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBarAlignment alignment) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mock_desktop_bars[static_cast<int>(alignment)].auto_hiding_enabled; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockDisplaySettingsProviderImpl::GetDesktopBarThickness( 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBarAlignment alignment) const { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mock_desktop_bars[static_cast<int>(alignment)].thickness; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DisplaySettingsProvider::DesktopBarVisibility 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDisplaySettingsProviderImpl::GetDesktopBarVisibility( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBarAlignment alignment) const { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mock_desktop_bars[static_cast<int>(alignment)].visibility; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool MockDisplaySettingsProviderImpl::IsFullScreen() { 17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return full_screen_enabled_; 17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockDisplaySettingsProviderImpl::EnableAutoHidingDesktopBar( 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBarAlignment alignment, bool enabled, int thickness) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockDesktopBar* bar = &(mock_desktop_bars[static_cast<int>(alignment)]); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bar->auto_hiding_enabled = enabled; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bar->thickness = thickness; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockDisplaySettingsProviderImpl::SetPrimaryDisplay( 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& display_area, const gfx::Rect& work_area) { 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(display_area.Contains(work_area)); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) primary_display_area_ = display_area; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) primary_work_area_ = work_area; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnDisplaySettingsChanged(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockDisplaySettingsProviderImpl::SetSecondaryDisplay( 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& display_area, const gfx::Rect& work_area) { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(display_area.Contains(work_area)); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) secondary_display_area_ = display_area; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) secondary_work_area_ = work_area; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDisplaySettingsChanged(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockDisplaySettingsProviderImpl::SetDesktopBarVisibility( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBarAlignment alignment, DesktopBarVisibility visibility) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockDesktopBar* bar = &(mock_desktop_bars[static_cast<int>(alignment)]); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bar->auto_hiding_enabled) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (visibility == bar->visibility) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bar->visibility = visibility; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER( 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopBarObserver, 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desktop_bar_observers(), 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnAutoHidingDesktopBarVisibilityChanged(alignment, visibility)); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockDisplaySettingsProviderImpl::SetDesktopBarThickness( 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBarAlignment alignment, int thickness) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockDesktopBar* bar = &(mock_desktop_bars[static_cast<int>(alignment)]); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bar->auto_hiding_enabled) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (thickness == bar->thickness) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bar->thickness = thickness; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER( 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DesktopBarObserver, 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desktop_bar_observers(), 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnAutoHidingDesktopBarThicknessChanged(alignment, thickness)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void MockDisplaySettingsProviderImpl::EnableFullScreenMode(bool enabled) { 23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) full_screen_enabled_ = enabled; 23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CheckFullScreenMode(PERFORM_FULLSCREEN_CHECK); 23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* BasePanelBrowserTest::kTestDir = 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("panels"); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BasePanelBrowserTest::BasePanelBrowserTest() 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : InProcessBrowserTest(), 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_display_settings_enabled_(true) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BasePanelBrowserTest::~BasePanelBrowserTest() { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BasePanelBrowserTest::SetUpCommandLine(CommandLine* command_line) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kEnablePanels); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BasePanelBrowserTest::SetUpOnMainThread() { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InProcessBrowserTest::SetUpOnMainThread(); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup the work area and desktop bar so that we have consistent testing 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // environment for all panel related tests. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mock_display_settings_enabled_) { 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_display_settings_provider_ = new MockDisplaySettingsProviderImpl(); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_display_settings_provider_->SetPrimaryDisplay( 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTestingPrimaryDisplayArea, kTestingPrimaryWorkArea); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PanelManager::SetDisplaySettingsProviderForTesting( 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_display_settings_provider_); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PanelManager* panel_manager = PanelManager::GetInstance(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel_manager->enable_auto_sizing(false); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelManager::shorten_time_intervals_for_testing(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate the mouse movement so that tests are not affected by actual mouse 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // events. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelMouseWatcher* mouse_watcher = new TestPanelMouseWatcher(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel_manager->SetMouseWatcherForTesting(mouse_watcher); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is needed so the subsequently created panels can be activated. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On a Mac, it transforms background-only test process into foreground one. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BasePanelBrowserTest::WaitForPanelActiveState( 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel, ActiveState expected_state) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(expected_state == SHOW_AS_ACTIVE || 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_state == SHOW_AS_INACTIVE); 2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_MACOSX) 2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<NativePanelTesting> panel_testing( 2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateNativePanelTesting(panel)); 2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(panel_testing->EnsureApplicationRunOnForeground()) << 2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "Failed to bring application to foreground. Bail out."; 2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelActiveStateObserver signal(panel, expected_state == SHOW_AS_ACTIVE); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal.Wait(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BasePanelBrowserTest::WaitForWindowSizeAvailable(Panel* panel) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<NativePanelTesting> panel_testing( 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateNativePanelTesting(panel)); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver signal( 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_PANEL_WINDOW_SIZE_KNOWN, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Panel>(panel)); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (panel_testing->IsWindowSizeKnown()) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal.Wait(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(panel_testing->IsWindowSizeKnown()); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BasePanelBrowserTest::WaitForBoundsAnimationFinished(Panel* panel) { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<NativePanelTesting> panel_testing( 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateNativePanelTesting(panel)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sometimes there are several animations in sequence due to content 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // auto resizing. Wait for all animations to finish. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (panel_testing->IsAnimatingBounds()) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver signal( 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_PANEL_BOUNDS_ANIMATIONS_FINISHED, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Panel>(panel)); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!panel_testing->IsAnimatingBounds()) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal.Wait(); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BasePanelBrowserTest::CreatePanelParams::CreatePanelParams( 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds, 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ActiveState show_flag) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : name(name), 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds(bounds), 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show_flag(show_flag), 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wait_for_fully_created(true), 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_active_state(show_flag), 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_mode(PanelManager::CREATE_AS_DOCKED), 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile(NULL) { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Panel* BasePanelBrowserTest::CreatePanelWithParams( 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CreatePanelParams& params) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opening panels on a Mac causes NSWindowController of the Panel window 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to be autoreleased. We need a pool drained after it's done so the test 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can close correctly. The NSWindowController of the Panel window controls 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lifetime of the Panel object so we want to release it as soon as 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // possible. In real Chrome, this is done by message pump. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On non-Mac platform, this is an empty class. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::ScopedNSAutoreleasePool autorelease_pool; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelManager* manager = PanelManager::GetInstance(); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Panel* panel = manager->CreatePanel( 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.name, 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.profile ? params.profile : browser()->profile(), 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.url, 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.bounds, 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.create_mode); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params.url.is_empty()) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!manager->auto_sizing_enabled() || 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds.width() || params.bounds.height()) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(panel->auto_resizable()); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(panel->auto_resizable()); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.show_flag == SHOW_AS_ACTIVE) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel->Show(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel->ShowInactive(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.wait_for_fully_created) { 377b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoopForUI::current()->RunUntilIdle(); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_LINUX) && defined(USE_X11) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On bots, we might have a simple window manager which always activates new 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // windows, and can't always deactivate them. Re-activate the main tabbed 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser to "deactivate" the newly created panel. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.expected_active_state == SHOW_AS_INACTIVE && 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GuessWindowManager() == ui::WM_ICE_WM) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for new panel to become active before deactivating to ensure 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the activated notification is consumed before we wait for the panel 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to become inactive. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForPanelActiveState(panel, SHOW_AS_ACTIVE); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->window()->Activate(); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // More waiting, because gaining or losing focus may require inter-process 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronous communication, and it is not enough to just run the local 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop to make sure this activity has completed. 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForPanelActiveState(panel, params.expected_active_state); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Linux, window size is not available right away and we should wait 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before moving forward with the test. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForWindowSizeAvailable(panel); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the bounds animations on creation to finish. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForBoundsAnimationFinished(panel); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return panel; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Panel* BasePanelBrowserTest::CreatePanelWithBounds( 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& panel_name, const gfx::Rect& bounds) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreatePanelParams params(panel_name, bounds, SHOW_AS_ACTIVE); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreatePanelWithParams(params); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Panel* BasePanelBrowserTest::CreatePanel(const std::string& panel_name) { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreatePanelParams params(panel_name, gfx::Rect(), SHOW_AS_ACTIVE); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreatePanelWithParams(params); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Panel* BasePanelBrowserTest::CreateDockedPanel(const std::string& name, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel = CreatePanelWithBounds(name, bounds); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PanelCollection::DOCKED, panel->collection()->type()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return panel; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Panel* BasePanelBrowserTest::CreateDetachedPanel(const std::string& name, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds) { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel = CreatePanelWithBounds(name, bounds); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PanelManager* panel_manager = panel->manager(); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) panel_manager->MovePanelToCollection(panel, 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) panel_manager->detached_collection(), 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PanelCollection::DEFAULT_POSITION); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PanelCollection::DETACHED, panel->collection()->type()); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The panel is first created as docked panel, which ignores the specified 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin in |bounds|. We need to reposition the panel after it becomes 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // detached. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel->SetPanelBounds(bounds); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForBoundsAnimationFinished(panel); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return panel; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Panel* BasePanelBrowserTest::CreateStackedPanel(const std::string& name, 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& bounds, 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StackedPanelCollection* stack) { 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Panel* panel = CreateDetachedPanel(name, bounds); 446a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) panel->manager()->MovePanelToCollection( 447a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) panel, 448a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) stack, 449a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) static_cast<PanelCollection::PositioningMask>( 450a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PanelCollection::DEFAULT_POSITION | 451a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) PanelCollection::COLLAPSE_TO_FIT)); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PanelCollection::STACKED, panel->collection()->type()); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForBoundsAnimationFinished(panel); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return panel; 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPanel* BasePanelBrowserTest::CreateInactivePanel(const std::string& name) { 458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create an active panel first, instead of inactive panel. This is because 459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // certain window managers on Linux, like icewm, will always activate the 460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // new window. 461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Panel* panel = CreatePanel(name); 462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DeactivatePanel(panel); 464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WaitForPanelActiveState(panel, SHOW_AS_INACTIVE); 465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return panel; 467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4697dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochPanel* BasePanelBrowserTest::CreateInactiveDockedPanel( 4707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& name, const gfx::Rect& bounds) { 4717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Create an active panel first, instead of inactive panel. This is because 4727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // certain window managers on Linux, like icewm, will always activate the 4737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // new window. 4747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Panel* panel = CreateDockedPanel(name, bounds); 4757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DeactivatePanel(panel); 4777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WaitForPanelActiveState(panel, SHOW_AS_INACTIVE); 4787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return panel; 4807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPanel* BasePanelBrowserTest::CreateInactiveDetachedPanel( 483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& name, const gfx::Rect& bounds) { 484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create an active panel first, instead of inactive panel. This is because 485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // certain window managers on Linux, like icewm, will always activate the 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // new window. 487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Panel* panel = CreateDetachedPanel(name, bounds); 488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DeactivatePanel(panel); 490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WaitForPanelActiveState(panel, SHOW_AS_INACTIVE); 491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return panel; 493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BasePanelBrowserTest::ActivatePanel(Panel* panel) { 4967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // For certain window managers on Linux, the window activation/deactivation 4977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // signals might not be sent. To work around this, we explicitly deactivate 4987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // all other panels first. 4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_LINUX) 5007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<Panel*> panels = PanelManager::GetInstance()->panels(); 5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (std::vector<Panel*>::const_iterator iter = panels.begin(); 5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch iter != panels.end(); ++iter) { 5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Panel* current_panel = *iter; 5047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (panel != current_panel) 5057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch current_panel->Deactivate(); 5067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch panel->Activate(); 5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid BasePanelBrowserTest::DeactivatePanel(Panel* panel) { 513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_LINUX) 514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // For certain window managers on Linux, like icewm, panel activation and 515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // deactivation notification might not get tiggered when non-panel window is 516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // activated or deactivated. So we deactivate the panel directly. 517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch panel->Deactivate(); 518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Make the panel lose focus by activating the browser window. This is 520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // because: 521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // 1) On Windows, deactivating the panel window might cause the application 522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // to lose the foreground status. When this occurs, trying to activate 523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the panel window again will not be allowed by the system. 524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // 2) On MacOS, deactivating a window is not supported by Cocoa. 525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser()->window()->Activate(); 526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativePanelTesting* BasePanelBrowserTest::CreateNativePanelTesting( 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel) { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return panel->native_panel()->CreateNativePanelTesting(); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> BasePanelBrowserTest::CreateExtension( 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& path, 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location location, 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue& extra_value) { 53990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extensions::ExtensionPrefs* extension_prefs = 54090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extensions::ExtensionPrefs::Get(browser()->profile()); 54190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::FilePath full_path = extension_prefs->install_directory().Append(path); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> input_value(extra_value.DeepCopy()); 5443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) input_value->SetString(extensions::manifest_keys::kVersion, "1.0.0.0"); 5453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) input_value->SetString(extensions::manifest_keys::kName, "Sample Extension"); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension = Extension::Create( 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_path, location, *input_value, Extension::NO_FLAGS, &error); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extension.get()); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("", error.c_str()); 552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extensions::ExtensionSystem::Get( 553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser()->profile())->extension_service()->OnExtensionInstalled( 554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extension.get(), 555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch syncer::StringOrdinal(), 556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extensions::kInstallFlagInstallImmediately); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BasePanelBrowserTest::CloseWindowAndWait(Panel* panel) { 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closing a panel may involve several async tasks. Need to use 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message pump and wait for the notification. 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelManager* manager = PanelManager::GetInstance(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int panel_count = manager->num_panels(); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver signal( 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_PANEL_CLOSED, 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Panel>(panel)); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel->Close(); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal.Wait(); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we have one less panel. 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(panel_count - 1, manager->num_panels()); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mac window controllers may be autoreleased, and in the non-test 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // environment, may actually depend on the autorelease pool being recycled 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the run loop in order to perform important work. Replicate this in 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the test environment. 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoreleasePool()->Recycle(); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that everything has a chance to run. 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::testing::NSRunLoopRunAllPending(); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BasePanelBrowserTest::MoveMouseAndWaitForExpansionStateChange( 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel, 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& position) { 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver signal( 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_PANEL_CHANGED_EXPANSION_STATE, 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Panel>(panel)); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MoveMouse(position); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal.Wait(); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BasePanelBrowserTest::MoveMouse(const gfx::Point& position) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelManager::GetInstance()->mouse_watcher()->NotifyMouseMovement(position); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BasePanelBrowserTest::MakePanelName(int index) { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string panel_name("Panel"); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return panel_name + base::IntToString(index); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool BasePanelBrowserTest::WmSupportWindowActivation() { 6057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 6067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 607