1// Copyright (c) 2012 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#import <Cocoa/Cocoa.h>
6
7#include "apps/shell_window_registry.h"
8#include "base/command_line.h"
9#include "base/mac/scoped_nsobject.h"
10#include "chrome/app/chrome_command_ids.h"
11#import "chrome/browser/app_controller_mac.h"
12#include "chrome/browser/extensions/extension_test_message_listener.h"
13#include "chrome/browser/extensions/platform_app_browsertest_util.h"
14#include "chrome/browser/ui/browser.h"
15#include "chrome/browser/ui/browser_list.h"
16#include "chrome/browser/ui/browser_window.h"
17#include "chrome/browser/ui/host_desktop.h"
18#include "chrome/browser/ui/tabs/tab_strip_model.h"
19#import "chrome/common/chrome_switches.h"
20#include "chrome/common/extensions/extension.h"
21#include "chrome/test/base/in_process_browser_test.h"
22#include "chrome/test/base/ui_test_utils.h"
23#include "content/public/browser/web_contents.h"
24
25namespace {
26
27class AppControllerPlatformAppBrowserTest
28    : public extensions::PlatformAppBrowserTest {
29 protected:
30  AppControllerPlatformAppBrowserTest()
31      : active_browser_list_(BrowserList::GetInstance(
32                                chrome::GetActiveDesktop())) {
33  }
34
35  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
36    PlatformAppBrowserTest::SetUpCommandLine(command_line);
37    command_line->AppendSwitchASCII(switches::kAppId,
38                                    "1234");
39  }
40
41  const BrowserList* active_browser_list_;
42};
43
44// Test that if only a platform app window is open and no browser windows are
45// open then a reopen event does nothing.
46IN_PROC_BROWSER_TEST_F(AppControllerPlatformAppBrowserTest,
47                       PlatformAppReopenWithWindows) {
48  base::scoped_nsobject<AppController> ac([[AppController alloc] init]);
49  NSUInteger old_window_count = [[NSApp windows] count];
50  EXPECT_EQ(1u, active_browser_list_->size());
51  BOOL result = [ac applicationShouldHandleReopen:NSApp hasVisibleWindows:YES];
52
53  EXPECT_TRUE(result);
54  EXPECT_EQ(old_window_count, [[NSApp windows] count]);
55  EXPECT_EQ(1u, active_browser_list_->size());
56}
57
58IN_PROC_BROWSER_TEST_F(AppControllerPlatformAppBrowserTest,
59                       ActivationFocusesBrowserWindow) {
60  base::scoped_nsobject<AppController> app_controller(
61      [[AppController alloc] init]);
62
63  ExtensionTestMessageListener listener("Launched", false);
64  const extensions::Extension* app =
65      InstallAndLaunchPlatformApp("minimal");
66  ASSERT_TRUE(listener.WaitUntilSatisfied());
67
68  NSWindow* app_window = apps::ShellWindowRegistry::Get(profile())->
69      GetShellWindowsForApp(app->id()).front()->GetNativeWindow();
70  NSWindow* browser_window = browser()->window()->GetNativeWindow();
71
72  EXPECT_LE([[NSApp orderedWindows] indexOfObject:app_window],
73            [[NSApp orderedWindows] indexOfObject:browser_window]);
74  [app_controller applicationShouldHandleReopen:NSApp
75                              hasVisibleWindows:YES];
76  EXPECT_LE([[NSApp orderedWindows] indexOfObject:browser_window],
77            [[NSApp orderedWindows] indexOfObject:app_window]);
78}
79
80class AppControllerWebAppBrowserTest : public InProcessBrowserTest {
81 protected:
82  AppControllerWebAppBrowserTest()
83      : active_browser_list_(BrowserList::GetInstance(
84                                chrome::GetActiveDesktop())) {
85  }
86
87  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
88    command_line->AppendSwitchASCII(switches::kApp, GetAppURL());
89  }
90
91  std::string GetAppURL() const {
92    return "http://example.com/";
93  }
94
95  const BrowserList* active_browser_list_;
96};
97
98// Test that in web app mode a reopen event opens the app URL.
99IN_PROC_BROWSER_TEST_F(AppControllerWebAppBrowserTest,
100                       WebAppReopenWithNoWindows) {
101  base::scoped_nsobject<AppController> ac([[AppController alloc] init]);
102  EXPECT_EQ(1u, active_browser_list_->size());
103  BOOL result = [ac applicationShouldHandleReopen:NSApp hasVisibleWindows:NO];
104
105  EXPECT_FALSE(result);
106  EXPECT_EQ(2u, active_browser_list_->size());
107
108  Browser* browser = active_browser_list_->get(0);
109  GURL current_url =
110      browser->tab_strip_model()->GetActiveWebContents()->GetURL();
111  EXPECT_EQ(GetAppURL(), current_url.spec());
112}
113
114}  // namespace
115