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