Home | History | Annotate | Download | only in profiles
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/views/profiles/avatar_menu_button.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/path_service.h"
      9 #include "base/strings/utf_string_conversions.h"
     10 #include "chrome/browser/profiles/profile_manager.h"
     11 #include "chrome/browser/profiles/profiles_state.h"
     12 #include "chrome/browser/ui/browser_list.h"
     13 #include "chrome/browser/ui/views/frame/browser_view.h"
     14 #include "chrome/browser/ui/views/profiles/avatar_menu_bubble_view.h"
     15 #include "chrome/common/chrome_paths.h"
     16 #include "chrome/common/chrome_switches.h"
     17 #include "chrome/test/base/in_process_browser_test.h"
     18 #include "chrome/test/base/test_switches.h"
     19 #include "chrome/test/base/testing_browser_process.h"
     20 #include "grit/generated_resources.h"
     21 
     22 class AvatarMenuButtonTest : public InProcessBrowserTest {
     23  public:
     24   AvatarMenuButtonTest();
     25   virtual ~AvatarMenuButtonTest();
     26 
     27  protected:
     28   void CreateTestingProfile();
     29   AvatarMenuButton* GetAvatarMenuButton();
     30   void StartAvatarMenu();
     31 
     32  private:
     33   DISALLOW_COPY_AND_ASSIGN(AvatarMenuButtonTest);
     34 };
     35 
     36 AvatarMenuButtonTest::AvatarMenuButtonTest() {
     37 }
     38 
     39 AvatarMenuButtonTest::~AvatarMenuButtonTest() {
     40 }
     41 
     42 void AvatarMenuButtonTest::CreateTestingProfile() {
     43   ProfileManager* profile_manager = g_browser_process->profile_manager();
     44   EXPECT_EQ(1u, profile_manager->GetNumberOfProfiles());
     45 
     46   base::FilePath path;
     47   PathService::Get(chrome::DIR_USER_DATA, &path);
     48   path = path.AppendASCII("test_profile");
     49   if (!base::PathExists(path))
     50     ASSERT_TRUE(base::CreateDirectory(path));
     51   Profile* profile =
     52       Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS);
     53   profile_manager->RegisterTestingProfile(profile, true, false);
     54   EXPECT_EQ(2u, profile_manager->GetNumberOfProfiles());
     55 }
     56 
     57 AvatarMenuButton* AvatarMenuButtonTest::GetAvatarMenuButton() {
     58   BrowserView* browser_view = reinterpret_cast<BrowserView*>(
     59       browser()->window());
     60   return browser_view->frame()->GetAvatarMenuButton();
     61 }
     62 
     63 void AvatarMenuButtonTest::StartAvatarMenu() {
     64   AvatarMenuButton* button = GetAvatarMenuButton();
     65   ASSERT_TRUE(button);
     66 
     67   AvatarMenuBubbleView::clear_close_on_deactivate_for_testing();
     68   static_cast<views::MenuButtonListener*>(button)->OnMenuButtonClicked(
     69       NULL, gfx::Point());
     70   base::MessageLoop::current()->RunUntilIdle();
     71   EXPECT_TRUE(AvatarMenuBubbleView::IsShowing());
     72 }
     73 
     74 // See http://crbug.com/315732
     75 #if defined(OS_WIN)
     76 #define MAYBE_HideOnSecondClick DISABLED_HideOnSecondClick
     77 #elif defined(OS_CHROMEOS)
     78 // This test doesn't make sense for ChromeOS since it has a different
     79 // multi-profiles menu in the system tray instead.
     80 #define MAYBE_HideOnSecondClick DISABLED_HideOnSecondClick
     81 #else
     82 #define MAYBE_HideOnSecondClick HideOnSecondClick
     83 #endif
     84 
     85 IN_PROC_BROWSER_TEST_F(AvatarMenuButtonTest, MAYBE_HideOnSecondClick) {
     86 #if defined(OS_WIN) && defined(USE_ASH)
     87   // Disable this test in Metro+Ash for now (http://crbug.com/262796).
     88   if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
     89     return;
     90 #endif
     91 
     92   // If multiprofile mode is not enabled, you can't switch between profiles.
     93   if (!profiles::IsMultipleProfilesEnabled())
     94     return;
     95 
     96   CreateTestingProfile();
     97   ASSERT_NO_FATAL_FAILURE(StartAvatarMenu());
     98 
     99   // Verify that clicking again doesn't reshow it.
    100   AvatarMenuButton* button = GetAvatarMenuButton();
    101   static_cast<views::MenuButtonListener*>(button)->OnMenuButtonClicked(
    102       NULL, gfx::Point());
    103   // Hide the bubble manually. In the browser this would normally happen during
    104   // the event processing.
    105   AvatarMenuBubbleView::Hide();
    106   base::MessageLoop::current()->RunUntilIdle();
    107   EXPECT_FALSE(AvatarMenuBubbleView::IsShowing());
    108 }
    109