Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / apps / app_shim / app_shim_quit_interactive_uitest_mac.mm
1 // Copyright 2013 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 // Tests behavior when quitting apps with app shims.
6
7 #import <Cocoa/Cocoa.h>
8 #include <vector>
9
10 #include "apps/switches.h"
11 #include "chrome/browser/apps/app_browsertest_util.h"
12 #include "chrome/browser/apps/app_shim/app_shim_host_manager_mac.h"
13 #include "chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h"
14 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/browser_shutdown.h"
16 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/common/chrome_switches.h"
18 #include "chrome/test/base/interactive_test_utils.h"
19 #include "content/public/test/test_utils.h"
20 #include "extensions/browser/extension_registry.h"
21 #include "extensions/test/extension_test_message_listener.h"
22 #include "ui/events/test/cocoa_test_event_utils.h"
23
24 using extensions::PlatformAppBrowserTest;
25
26 namespace apps {
27
28 namespace {
29
30 class FakeHost : public apps::AppShimHandler::Host {
31  public:
32   FakeHost(const base::FilePath& profile_path,
33            const std::string& app_id,
34            ExtensionAppShimHandler* handler)
35       : profile_path_(profile_path),
36         app_id_(app_id),
37         handler_(handler) {}
38
39   void OnAppLaunchComplete(AppShimLaunchResult result) override {}
40   void OnAppClosed() override { handler_->OnShimClose(this); }
41   void OnAppHide() override {}
42   void OnAppRequestUserAttention(AppShimAttentionType type) override {}
43   base::FilePath GetProfilePath() const override { return profile_path_; }
44   std::string GetAppId() const override { return app_id_; }
45
46  private:
47   base::FilePath profile_path_;
48   std::string app_id_;
49   ExtensionAppShimHandler* handler_;
50
51   DISALLOW_COPY_AND_ASSIGN(FakeHost);
52 };
53
54 // Starts an app without a browser window using --load_and_launch_app and
55 // --silent_launch.
56 class AppShimQuitTest : public PlatformAppBrowserTest {
57  protected:
58   AppShimQuitTest() {}
59
60   void SetUpAppShim() {
61     ASSERT_EQ(0u, [[NSApp windows] count]);
62     ExtensionTestMessageListener launched_listener("Launched", false);
63     ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
64     ASSERT_EQ(1u, [[NSApp windows] count]);
65
66     handler_ = g_browser_process->platform_part()->app_shim_host_manager()->
67         extension_app_shim_handler();
68
69     // Attach a host for the app.
70     extensions::ExtensionRegistry* registry =
71         extensions::ExtensionRegistry::Get(profile());
72     extension_id_ =
73         GetExtensionByPath(&registry->enabled_extensions(), app_path_)->id();
74     host_.reset(new FakeHost(profile()->GetPath().BaseName(),
75                              extension_id_,
76                              handler_));
77     handler_->OnShimLaunch(host_.get(),
78                            APP_SHIM_LAUNCH_REGISTER_ONLY,
79                            std::vector<base::FilePath>());
80     EXPECT_EQ(host_.get(), handler_->FindHost(profile(), extension_id_));
81
82     // Focus the app window.
83     NSWindow* window = [[NSApp windows] objectAtIndex:0];
84     EXPECT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(window));
85     content::RunAllPendingInMessageLoop();
86   }
87
88   void SetUpCommandLine(CommandLine* command_line) override {
89     PlatformAppBrowserTest::SetUpCommandLine(command_line);
90     // Simulate an app shim initiated launch, i.e. launch app but not browser.
91     app_path_ = test_data_dir_
92         .AppendASCII("platform_apps")
93         .AppendASCII("minimal");
94     command_line->AppendSwitchNative(apps::kLoadAndLaunchApp,
95                                      app_path_.value());
96     command_line->AppendSwitch(switches::kSilentLaunch);
97   }
98
99   base::FilePath app_path_;
100   ExtensionAppShimHandler* handler_;
101   std::string extension_id_;
102   scoped_ptr<FakeHost> host_;
103
104   DISALLOW_COPY_AND_ASSIGN(AppShimQuitTest);
105 };
106
107 }  // namespace
108
109 // Test that closing an app with Cmd+Q when no browsers have ever been open
110 // terminates Chrome.
111 IN_PROC_BROWSER_TEST_F(AppShimQuitTest, QuitWithKeyEvent) {
112   SetUpAppShim();
113
114   // Simulate a Cmd+Q event.
115   NSWindow* window = [[NSApp windows] objectAtIndex:0];
116   NSEvent* event = cocoa_test_event_utils::KeyEventWithKeyCode(
117       0, 'q', NSKeyDown, NSCommandKeyMask);
118   [window postEvent:event
119             atStart:NO];
120
121   // This will time out if the event above does not terminate Chrome.
122   content::RunMessageLoop();
123
124   EXPECT_FALSE(handler_->FindHost(profile(), extension_id_));
125   EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
126 }
127
128 }  // namespace apps