Index: chrome/browser/ui/panels/old_base_panel_browser_test.cc |
diff --git a/chrome/browser/ui/panels/old_base_panel_browser_test.cc b/chrome/browser/ui/panels/old_base_panel_browser_test.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..52180e76eb72eb10e67844bcd87ce4ffa635102c |
--- /dev/null |
+++ b/chrome/browser/ui/panels/old_base_panel_browser_test.cc |
@@ -0,0 +1,492 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/panels/base_panel_browser_test.h" |
+ |
+#include "chrome/browser/ui/browser_list.h" |
+ |
+#include "base/bind.h" |
+#include "base/command_line.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/message_loop.h" |
+#include "base/path_service.h" |
+#include "base/string_number_conversions.h" |
+#include "chrome/browser/extensions/extension_service.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/panels/native_panel.h" |
+#include "chrome/browser/ui/panels/panel_browser_window.h" |
+#include "chrome/browser/ui/panels/panel_manager.h" |
+#include "chrome/browser/ui/panels/panel_mouse_watcher.h" |
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
+#include "chrome/common/chrome_notification_types.h" |
+#include "chrome/common/chrome_paths.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/extensions/extension_manifest_constants.h" |
+#include "chrome/common/string_ordinal.h" |
+#include "chrome/test/base/ui_test_utils.h" |
+#include "content/public/browser/notification_service.h" |
+#include "content/public/common/url_constants.h" |
+#include "content/public/test/web_contents_tester.h" |
+ |
+#if defined(OS_LINUX) |
+#include "ui/base/x/x11_util.h" |
+#endif |
+ |
+#if defined(OS_MACOSX) |
+#include "base/mac/scoped_nsautorelease_pool.h" |
+#include "chrome/browser/ui/cocoa/find_bar/find_bar_bridge.h" |
+#include "chrome/browser/ui/cocoa/run_loop_testing.h" |
+#endif |
+ |
+using content::WebContentsTester; |
+using extensions::Extension; |
+ |
+namespace { |
+ |
+const gfx::Rect kTestingPrimaryScreenArea = gfx::Rect(0, 0, 800, 600); |
+const gfx::Rect kTestingWorkArea = gfx::Rect(0, 0, 800, 580); |
+ |
+struct MockDesktopBar { |
+ bool auto_hiding_enabled; |
+ DisplaySettingsProvider::DesktopBarVisibility visibility; |
+ int thickness; |
+}; |
+ |
+class MockDisplaySettingsProviderImpl : |
+ public BasePanelBrowserTest::MockDisplaySettingsProvider { |
+ public: |
+ explicit MockDisplaySettingsProviderImpl(PanelManager* panel_manager); |
+ virtual ~MockDisplaySettingsProviderImpl() { } |
+ |
+ // Overridden from DisplaySettingsProvider: |
+ virtual gfx::Rect GetPrimaryScreenArea() const OVERRIDE; |
+ virtual gfx::Rect GetWorkArea() const OVERRIDE; |
+ virtual bool IsAutoHidingDesktopBarEnabled( |
+ DesktopBarAlignment alignment) OVERRIDE; |
+ virtual int GetDesktopBarThickness( |
+ DesktopBarAlignment alignment) const OVERRIDE; |
+ virtual DesktopBarVisibility GetDesktopBarVisibility( |
+ DesktopBarAlignment alignment) const OVERRIDE; |
+ |
+ // Overridden from MockDisplaySettingsProvider: |
+ virtual void SetPrimaryScreenArea( |
+ const gfx::Rect& primary_screen_area) OVERRIDE; |
+ virtual void SetWorkArea(const gfx::Rect& work_area) OVERRIDE; |
+ virtual void EnableAutoHidingDesktopBar(DesktopBarAlignment alignment, |
+ bool enabled, |
+ int thickness) OVERRIDE; |
+ virtual void SetDesktopBarVisibility( |
+ DesktopBarAlignment alignment, DesktopBarVisibility visibility) OVERRIDE; |
+ virtual void SetDesktopBarThickness(DesktopBarAlignment alignment, |
+ int thickness) OVERRIDE; |
+ |
+ private: |
+ gfx::Rect testing_primary_screen_area_; |
+ gfx::Rect testing_work_area_; |
+ MockDesktopBar mock_desktop_bars[3]; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MockDisplaySettingsProviderImpl); |
+}; |
+ |
+ |
+MockDisplaySettingsProviderImpl::MockDisplaySettingsProviderImpl( |
+ PanelManager* panel_manager) { |
+ DisplaySettingsProvider* old_provider = |
+ panel_manager->display_settings_provider(); |
+ |
+ ObserverListBase<DisplaySettingsProvider::DisplayAreaObserver>::Iterator |
+ display_area_observers_iter(old_provider->display_area_observers()); |
+ AddDisplayAreaObserver(display_area_observers_iter.GetNext()); |
+ DCHECK(!display_area_observers_iter.GetNext()); |
+ |
+ ObserverListBase<DisplaySettingsProvider::DesktopBarObserver>::Iterator |
+ desktop_bar_observer_iter(old_provider->desktop_bar_observers()); |
+ AddDesktopBarObserver(desktop_bar_observer_iter.GetNext()); |
+ DCHECK(!desktop_bar_observer_iter.GetNext()); |
+ |
+ ObserverListBase<DisplaySettingsProvider::FullScreenObserver>::Iterator |
+ full_screen_observer_iter(old_provider->full_screen_observers()); |
+ AddFullScreenObserver(full_screen_observer_iter.GetNext()); |
+ DCHECK(!full_screen_observer_iter.GetNext()); |
+ |
+ panel_manager->set_display_settings_provider(this); |
+ |
+ memset(mock_desktop_bars, 0, sizeof(mock_desktop_bars)); |
+} |
+ |
+gfx::Rect MockDisplaySettingsProviderImpl::GetPrimaryScreenArea() const { |
+ return testing_primary_screen_area_; |
+} |
+ |
+gfx::Rect MockDisplaySettingsProviderImpl::GetWorkArea() const { |
+ return testing_work_area_; |
+} |
+ |
+bool MockDisplaySettingsProviderImpl::IsAutoHidingDesktopBarEnabled( |
+ DesktopBarAlignment alignment) { |
+ return mock_desktop_bars[static_cast<int>(alignment)].auto_hiding_enabled; |
+} |
+ |
+int MockDisplaySettingsProviderImpl::GetDesktopBarThickness( |
+ DesktopBarAlignment alignment) const { |
+ return mock_desktop_bars[static_cast<int>(alignment)].thickness; |
+} |
+ |
+DisplaySettingsProvider::DesktopBarVisibility |
+MockDisplaySettingsProviderImpl::GetDesktopBarVisibility( |
+ DesktopBarAlignment alignment) const { |
+ return mock_desktop_bars[static_cast<int>(alignment)].visibility; |
+} |
+ |
+void MockDisplaySettingsProviderImpl::EnableAutoHidingDesktopBar( |
+ DesktopBarAlignment alignment, bool enabled, int thickness) { |
+ MockDesktopBar* bar = &(mock_desktop_bars[static_cast<int>(alignment)]); |
+ bar->auto_hiding_enabled = enabled; |
+ bar->thickness = thickness; |
+ OnAutoHidingDesktopBarChanged(); |
+} |
+ |
+void MockDisplaySettingsProviderImpl::SetPrimaryScreenArea( |
+ const gfx::Rect& primary_screen_area) { |
+ testing_primary_screen_area_ = primary_screen_area; |
+} |
+ |
+void MockDisplaySettingsProviderImpl::SetWorkArea(const gfx::Rect& work_area) { |
+ testing_work_area_ = work_area; |
+ OnDisplaySettingsChanged(); |
+} |
+ |
+void MockDisplaySettingsProviderImpl::SetDesktopBarVisibility( |
+ DesktopBarAlignment alignment, DesktopBarVisibility visibility) { |
+ MockDesktopBar* bar = &(mock_desktop_bars[static_cast<int>(alignment)]); |
+ if (!bar->auto_hiding_enabled) |
+ return; |
+ if (visibility == bar->visibility) |
+ return; |
+ bar->visibility = visibility; |
+ OnAutoHidingDesktopBarChanged(); |
+} |
+ |
+void MockDisplaySettingsProviderImpl::SetDesktopBarThickness( |
+ DesktopBarAlignment alignment, int thickness) { |
+ MockDesktopBar* bar = &(mock_desktop_bars[static_cast<int>(alignment)]); |
+ if (!bar->auto_hiding_enabled) |
+ return; |
+ if (thickness == bar->thickness) |
+ return; |
+ bar->thickness = thickness; |
+ OnAutoHidingDesktopBarChanged(); |
+} |
+ |
+bool ExistsPanel(Panel* panel) { |
+ std::vector<Panel*> panels = PanelManager::GetInstance()->panels(); |
+ return std::find(panels.begin(), panels.end(), panel) != panels.end(); |
+} |
+ |
+} // namespace |
+ |
+const FilePath::CharType* BasePanelBrowserTest::kTestDir = |
+ FILE_PATH_LITERAL("panels"); |
+ |
+BasePanelBrowserTest::BasePanelBrowserTest() |
+ : InProcessBrowserTest(), |
+ mock_display_settings_enabled_(true) { |
+#if defined(OS_MACOSX) |
+ FindBarBridge::disable_animations_during_testing_ = true; |
+#endif |
+} |
+ |
+BasePanelBrowserTest::~BasePanelBrowserTest() { |
+} |
+ |
+bool BasePanelBrowserTest::SkipTestIfIceWM() { |
+#if defined(OS_LINUX) |
+ return ui::GuessWindowManager() == ui::WM_ICE_WM; |
+#else |
+ return false; |
+#endif |
+} |
+ |
+bool BasePanelBrowserTest::SkipTestIfCompizWM() { |
+#if defined(OS_LINUX) |
+ return ui::GuessWindowManager() == ui::WM_COMPIZ; |
+#else |
+ return false; |
+#endif |
+} |
+ |
+void BasePanelBrowserTest::SetUpCommandLine(CommandLine* command_line) { |
+ EnableDOMAutomation(); |
+ command_line->AppendSwitch(switches::kEnablePanels); |
+} |
+ |
+void BasePanelBrowserTest::SetUpOnMainThread() { |
+ InProcessBrowserTest::SetUpOnMainThread(); |
+ |
+ // Setup the work area and desktop bar so that we have consistent testing |
+ // environment for all panel related tests. |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ if (mock_display_settings_enabled_) { |
+ mock_display_settings_provider_ = |
+ new MockDisplaySettingsProviderImpl(panel_manager); |
+ SetTestingAreas(kTestingPrimaryScreenArea, kTestingWorkArea); |
+ } |
+ |
+ panel_manager->enable_auto_sizing(false); |
+ |
+ PanelManager::shorten_time_intervals_for_testing(); |
+ |
+ // This is needed so the subsequently created panels can be activated. |
+ // On a Mac, it transforms background-only test process into foreground one. |
+ ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); |
+} |
+ |
+void BasePanelBrowserTest::WaitForPanelActiveState( |
+ Panel* panel, ActiveState expected_state) { |
+ DCHECK(expected_state == SHOW_AS_ACTIVE || |
+ expected_state == SHOW_AS_INACTIVE); |
+ ui_test_utils::WindowedNotificationObserver signal( |
+ chrome::NOTIFICATION_PANEL_CHANGED_ACTIVE_STATUS, |
+ content::Source<Panel>(panel)); |
+ if (panel->IsActive() == (expected_state == SHOW_AS_ACTIVE)) |
+ return; // Already in required state. |
+ signal.Wait(); |
+ // Verify that transition happened in the desired direction. |
+ EXPECT_TRUE(panel->IsActive() == (expected_state == SHOW_AS_ACTIVE)); |
+} |
+ |
+void BasePanelBrowserTest::WaitForWindowSizeAvailable(Panel* panel) { |
+ scoped_ptr<NativePanelTesting> panel_testing( |
+ NativePanelTesting::Create(panel->native_panel())); |
+ ui_test_utils::WindowedNotificationObserver signal( |
+ chrome::NOTIFICATION_PANEL_WINDOW_SIZE_KNOWN, |
+ content::Source<Panel>(panel)); |
+ if (panel_testing->IsWindowSizeKnown()) |
+ return; |
+ signal.Wait(); |
+ EXPECT_TRUE(panel_testing->IsWindowSizeKnown()); |
+} |
+ |
+void BasePanelBrowserTest::WaitForBoundsAnimationFinished(Panel* panel) { |
+ scoped_ptr<NativePanelTesting> panel_testing( |
+ NativePanelTesting::Create(panel->native_panel())); |
+ ui_test_utils::WindowedNotificationObserver signal( |
+ chrome::NOTIFICATION_PANEL_BOUNDS_ANIMATIONS_FINISHED, |
+ content::Source<Panel>(panel)); |
+ if (!panel_testing->IsAnimatingBounds()) |
+ return; |
+ signal.Wait(); |
+ EXPECT_TRUE(!panel_testing->IsAnimatingBounds()); |
+} |
+ |
+void BasePanelBrowserTest::WaitForExpansionStateChanged( |
+ Panel* panel, Panel::ExpansionState expansion_state) { |
+ ui_test_utils::WindowedNotificationObserver signal( |
+ chrome::NOTIFICATION_PANEL_CHANGED_EXPANSION_STATE, |
+ content::Source<Panel>(panel)); |
+ if (panel->expansion_state() == expansion_state) |
+ return; |
+ signal.Wait(); |
+ EXPECT_EQ(expansion_state, panel->expansion_state()); |
+} |
+ |
+Panel* BasePanelBrowserTest::CreatePanelWithParams( |
+ const CreatePanelParams& params) { |
+#if defined(OS_MACOSX) |
+ // Opening panels on a Mac causes NSWindowController of the Panel window |
+ // to be autoreleased. We need a pool drained after it's done so the test |
+ // can close correctly. The NSWindowController of the Panel window controls |
+ // lifetime of the Browser object so we want to release it as soon as |
+ // possible. In real Chrome, this is done by message pump. |
+ // On non-Mac platform, this is an empty class. |
+ base::mac::ScopedNSAutoreleasePool autorelease_pool; |
+#endif |
+ |
+ Browser* panel_browser = Browser::CreateWithParams( |
+ Browser::CreateParams::CreateForApp( |
+ Browser::TYPE_PANEL, params.name, params.bounds, |
+ browser()->profile())); |
+ EXPECT_TRUE(panel_browser->is_type_panel()); |
+ |
+ if (!params.url.is_empty()) { |
+ ui_test_utils::WindowedNotificationObserver observer( |
+ content::NOTIFICATION_LOAD_STOP, |
+ content::NotificationService::AllSources()); |
+ panel_browser->AddSelectedTabWithURL(params.url, |
+ content::PAGE_TRANSITION_START_PAGE); |
+ observer.Wait(); |
+ } |
+ |
+ PanelBrowserWindow* panel_browser_window = |
+ static_cast<PanelBrowserWindow*>(panel_browser->window()); |
+ Panel* panel = panel_browser_window->panel(); |
+ |
+ if (!PanelManager::GetInstance()->auto_sizing_enabled() || |
+ params.bounds.width() || params.bounds.height()) { |
+ EXPECT_FALSE(panel->auto_resizable()); |
+ } else { |
+ EXPECT_TRUE(panel->auto_resizable()); |
+ } |
+ |
+#if defined(OS_LINUX) |
+ // On bots, we might have a simple window manager which always activates new |
+ // windows, and can't always deactivate them. Keep track of the previously |
+ // active window so we can activate that window back to ensure the new window |
+ // is inactive. |
+ Browser* last_active_browser_to_restore = NULL; |
+ if (params.expected_active_state == SHOW_AS_INACTIVE && |
+ ui::GuessWindowManager() == ui::WM_ICE_WM) { |
+ last_active_browser_to_restore = BrowserList::GetLastActive(); |
+ EXPECT_TRUE(last_active_browser_to_restore); |
+ EXPECT_NE(last_active_browser_to_restore, panel_browser); |
+ } |
+#endif |
+ |
+ if (params.show_flag == SHOW_AS_ACTIVE) { |
+ panel->Show(); |
+ } else { |
+ panel->ShowInactive(); |
+ } |
+ |
+ if (params.wait_for_fully_created) { |
+ MessageLoopForUI::current()->RunAllPending(); |
+ |
+#if defined(OS_LINUX) |
+ // Restore focus where it was. It will deactivate the new panel. |
+ if (last_active_browser_to_restore) |
+ last_active_browser_to_restore->window()->Activate(); |
+#endif |
+ // More waiting, because gaining or losing focus may require inter-process |
+ // asynchronous communication, and it is not enough to just run the local |
+ // message loop to make sure this activity has completed. |
+ WaitForPanelActiveState(panel, params.expected_active_state); |
+ |
+ // On Linux, window size is not available right away and we should wait |
+ // before moving forward with the test. |
+ WaitForWindowSizeAvailable(panel); |
+ |
+ // Wait for the bounds animations on creation to finish. |
+ WaitForBoundsAnimationFinished(panel); |
+ } |
+ |
+ return panel; |
+} |
+ |
+Panel* BasePanelBrowserTest::CreatePanelWithBounds( |
+ const std::string& panel_name, const gfx::Rect& bounds) { |
+ CreatePanelParams params(panel_name, bounds, SHOW_AS_ACTIVE); |
+ return CreatePanelWithParams(params); |
+} |
+ |
+Panel* BasePanelBrowserTest::CreatePanel(const std::string& panel_name) { |
+ CreatePanelParams params(panel_name, gfx::Rect(), SHOW_AS_ACTIVE); |
+ return CreatePanelWithParams(params); |
+} |
+ |
+Panel* BasePanelBrowserTest::CreateDockedPanel(const std::string& name, |
+ const gfx::Rect& bounds) { |
+ Panel* panel = CreatePanelWithBounds(name, bounds); |
+ EXPECT_EQ(PanelStrip::DOCKED, panel->panel_strip()->type()); |
+ return panel; |
+} |
+ |
+Panel* BasePanelBrowserTest::CreateDetachedPanel(const std::string& name, |
+ const gfx::Rect& bounds) { |
+ Panel* panel = CreatePanelWithBounds(name, bounds); |
+ panel->manager()->MovePanelToStrip(panel, |
+ PanelStrip::DETACHED, |
+ PanelStrip::DEFAULT_POSITION); |
+ EXPECT_EQ(PanelStrip::DETACHED, panel->panel_strip()->type()); |
+ // The panel is first created as docked panel, which ignores the specified |
+ // origin in |bounds|. We need to reposition the panel after it becomes |
+ // detached. |
+ panel->SetPanelBounds(bounds); |
+ WaitForBoundsAnimationFinished(panel); |
+ return panel; |
+} |
+ |
+void BasePanelBrowserTest::CreateTestTabContents(Browser* browser) { |
+ TabContentsWrapper* tab_contents = |
+ new TabContentsWrapper( |
+ WebContentsTester::CreateTestWebContents(browser->profile(), NULL)); |
+ browser->AddTab(tab_contents, content::PAGE_TRANSITION_LINK); |
+} |
+ |
+scoped_refptr<Extension> BasePanelBrowserTest::CreateExtension( |
+ const FilePath::StringType& path, |
+ Extension::Location location, |
+ const DictionaryValue& extra_value) { |
+#if defined(OS_WIN) |
+ FilePath full_path(FILE_PATH_LITERAL("c:\\")); |
+#else |
+ FilePath full_path(FILE_PATH_LITERAL("/")); |
+#endif |
+ full_path = full_path.Append(path); |
+ |
+ scoped_ptr<DictionaryValue> input_value(extra_value.DeepCopy()); |
+ input_value->SetString(extension_manifest_keys::kVersion, "1.0.0.0"); |
+ input_value->SetString(extension_manifest_keys::kName, "Sample Extension"); |
+ |
+ std::string error; |
+ scoped_refptr<Extension> extension = Extension::Create( |
+ full_path, location, *input_value, Extension::NO_FLAGS, &error); |
+ EXPECT_TRUE(extension.get()); |
+ EXPECT_STREQ("", error.c_str()); |
+ browser()->profile()->GetExtensionService()-> |
+ OnExtensionInstalled(extension.get(), false, StringOrdinal()); |
+ return extension; |
+} |
+ |
+void BasePanelBrowserTest::SetTestingAreas(const gfx::Rect& primary_screen_area, |
+ const gfx::Rect& work_area) { |
+ DCHECK(primary_screen_area.Contains(work_area)); |
+ mock_display_settings_provider_->SetPrimaryScreenArea(primary_screen_area); |
+ mock_display_settings_provider_->SetWorkArea( |
+ work_area.IsEmpty() ? primary_screen_area : work_area); |
+} |
+ |
+void BasePanelBrowserTest::CloseWindowAndWait(Panel* panel) { |
+ // Closing a panel may involve several async tasks. Need to use |
+ // message pump and wait for the notification. |
+ PanelManager* manager = PanelManager::GetInstance(); |
+ int panel_count = manager->num_panels(); |
+ ui_test_utils::WindowedNotificationObserver signal( |
+ chrome::NOTIFICATION_PANEL_CLOSED, |
+ content::Source<Panel>(panel)); |
+ panel->Close(); |
+ signal.Wait(); |
+ // Now we have one less panel. |
+ EXPECT_EQ(panel_count - 1, manager->num_panels()); |
+ |
+#if defined(OS_MACOSX) |
+ // Mac window controllers may be autoreleased, and in the non-test |
+ // environment, may actually depend on the autorelease pool being recycled |
+ // with the run loop in order to perform important work. Replicate this in |
+ // the test environment. |
+ AutoreleasePool()->Recycle(); |
+ |
+ // Make sure that everything has a chance to run. |
+ chrome::testing::NSRunLoopRunAllPending(); |
+#endif // OS_MACOSX |
+} |
+ |
+void BasePanelBrowserTest::MoveMouseAndWaitForExpansionStateChange( |
+ Panel* panel, |
+ const gfx::Point& position) { |
+ ui_test_utils::WindowedNotificationObserver signal( |
+ chrome::NOTIFICATION_PANEL_CHANGED_EXPANSION_STATE, |
+ content::Source<Panel>(panel)); |
+ MoveMouse(position); |
+ signal.Wait(); |
+} |
+ |
+void BasePanelBrowserTest::MoveMouse(const gfx::Point& position) { |
+ PanelManager::GetInstance()->mouse_watcher()->NotifyMouseMovement(position); |
+} |
+ |
+std::string BasePanelBrowserTest::MakePanelName(int index) { |
+ std::string panel_name("Panel"); |
+ return panel_name + base::IntToString(index); |
+} |