1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/views/profiles/avatar_menu_button.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/utf_string_conversions.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/profiles/profiles_state.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/views/profiles/avatar_menu_bubble_view.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class AvatarMenuButtonTest : public InProcessBrowserTest {
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AvatarMenuButtonTest();
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~AvatarMenuButtonTest();
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void CreateTestingProfile();
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AvatarMenuButton* GetAvatarMenuButton();
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void StartAvatarMenu();
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AvatarMenuButtonTest);
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)AvatarMenuButtonTest::AvatarMenuButtonTest() {
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)AvatarMenuButtonTest::~AvatarMenuButtonTest() {
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AvatarMenuButtonTest::CreateTestingProfile() {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, profile_manager->GetNumberOfProfiles());
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PathService::Get(chrome::DIR_USER_DATA, &path);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = path.AppendASCII("test_profile");
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::PathExists(path))
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(path));
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile =
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS);
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile_manager->RegisterTestingProfile(profile, true, false);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, profile_manager->GetNumberOfProfiles());
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)AvatarMenuButton* AvatarMenuButtonTest::GetAvatarMenuButton() {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserView* browser_view = reinterpret_cast<BrowserView*>(
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->window());
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return browser_view->frame()->GetAvatarMenuButton();
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AvatarMenuButtonTest::StartAvatarMenu() {
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AvatarMenuButton* button = GetAvatarMenuButton();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(button);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AvatarMenuBubbleView::clear_close_on_deactivate_for_testing();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_cast<views::MenuButtonListener*>(button)->OnMenuButtonClicked(
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL, gfx::Point());
69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(AvatarMenuBubbleView::IsShowing());
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// See http://crbug.com/315732
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_HideOnSecondClick DISABLED_HideOnSecondClick
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#elif defined(OS_CHROMEOS)
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This test doesn't make sense for ChromeOS since it has a different
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// multi-profiles menu in the system tray instead.
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define MAYBE_HideOnSecondClick DISABLED_HideOnSecondClick
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_HideOnSecondClick HideOnSecondClick
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(AvatarMenuButtonTest, MAYBE_HideOnSecondClick) {
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // If multiprofile mode is not enabled, you can't switch between profiles.
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (!profiles::IsMultipleProfilesEnabled())
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CreateTestingProfile();
968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(StartAvatarMenu());
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that clicking again doesn't reshow it.
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AvatarMenuButton* button = GetAvatarMenuButton();
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_cast<views::MenuButtonListener*>(button)->OnMenuButtonClicked(
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL, gfx::Point());
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Hide the bubble manually. In the browser this would normally happen during
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the event processing.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AvatarMenuBubbleView::Hide();
105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(AvatarMenuBubbleView::IsShowing());
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
108