accelerator_commands_browsertest.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/accelerators/accelerator_commands.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "apps/shell_window.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "apps/ui/native_app_window.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/apps/app_browsertest_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/browser_window.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/aura/client/aura_constants.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true if |window| is in immersive fullscreen. Infer whether |window|
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// is in immersive fullscreen based on whether the shelf is hidden when
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// |window| is fullscreen because DEPS does not allow the test to use
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// BrowserView. (This is not quite right because the shelf is hidden if a window
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// is in both immersive fullscreen and tab fullscreen.)
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsInImmersiveFullscreen(BrowserWindow* browser_window) {
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::wm::WindowState* window_state = ash::wm::GetWindowState(
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      browser_window->GetNativeWindow());
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return window_state->IsFullscreen() &&
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !window_state->hide_shelf_when_fullscreen();
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)typedef InProcessBrowserTest AcceleratorCommandsBrowserTest;
378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that toggling window miximized works properly
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AcceleratorCommandsBrowserTest, ToggleMaximized) {
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance";
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ash::wm::WindowState* window_state = ash::wm::GetActiveWindowState();
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(window_state);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // When not in fullscreen, accelerators::ToggleMaximized toggles Maximized.
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsMaximized());
468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ash::accelerators::ToggleMaximized();
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsMaximized());
488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ash::accelerators::ToggleMaximized();
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsMaximized());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // When in fullscreen accelerators::ToggleMaximized gets out of fullscreen.
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsFullscreen());
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Browser* browser = chrome::FindBrowserWithWindow(window_state->window());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(browser);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ToggleFullscreenMode(browser);
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsFullscreen());
578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ash::accelerators::ToggleMaximized();
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsFullscreen());
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsMaximized());
608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ash::accelerators::ToggleMaximized();
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsFullscreen());
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsMaximized());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Confirm that toggling window fullscren works properly.
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AcceleratorCommandsBrowserTest, ToggleFullscreen) {
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance";
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // 1) ToggleFullscreen() should toggle whether a tabbed browser window is in
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // immersive fullscreen.
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(browser()->is_type_tabbed());
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowserWindow* browser_window = browser()->window();
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(browser_window->IsActive());
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsMaximized());
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsFullscreen());
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(browser_window->IsFullscreen());
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(IsInImmersiveFullscreen(browser_window));
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsMaximized());
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsFullscreen());
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // 2) ToggleFullscreen() should have no effect on windows which cannot be
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // maximized.
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_window->GetNativeWindow()->SetProperty(aura::client::kCanMaximizeKey,
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                 false);
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsMaximized());
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsFullscreen());
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // 3) ToggleFullscreen() should maximize v1 app browser windows which use
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // AppNonClientFrameViewAsh.
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // TODO(pkotwicz): Figure out if we actually want this behavior.
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Browser::CreateParams browser_create_params(Browser::TYPE_POPUP,
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      browser()->profile(), chrome::HOST_DESKTOP_TYPE_NATIVE);
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN)
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_create_params.host_desktop_type = chrome::HOST_DESKTOP_TYPE_ASH;
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // OS_WIN
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_create_params.app_name = "Test";
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_create_params.app_type = Browser::APP_TYPE_HOST;
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Browser* app_host_browser = new Browser(browser_create_params);
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(app_host_browser->is_app());
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddBlankTabAndShow(app_host_browser);
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_window = app_host_browser->window();
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(browser_window->IsActive());
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsMaximized());
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsFullscreen());
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(browser_window->IsMaximized());
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsMaximized());
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsFullscreen());
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // 4) ToggleFullscreen() should put child windows of v1 apps into
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // non-immersive fullscreen.
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_create_params.host_desktop_type = chrome::HOST_DESKTOP_TYPE_NATIVE;
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_create_params.app_type = Browser::APP_TYPE_CHILD;
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Browser* app_child_browser = new Browser(browser_create_params);
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(app_child_browser->is_app());
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddBlankTabAndShow(app_child_browser);
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_window = app_child_browser->window();
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(browser_window->IsActive());
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsMaximized());
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsFullscreen());
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(browser_window->IsFullscreen());
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(IsInImmersiveFullscreen(browser_window));
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsMaximized());
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsFullscreen());
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // 5) ToggleFullscreen() should put popup browser windows into non-immersive
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // fullscreen.
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_create_params.app_name = "";
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Browser* popup_browser = new Browser(browser_create_params);
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(popup_browser->is_type_popup());
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_FALSE(popup_browser->is_app());
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddBlankTabAndShow(popup_browser);
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser_window = popup_browser->window();
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(browser_window->IsActive());
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsMaximized());
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsFullscreen());
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(browser_window->IsFullscreen());
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(IsInImmersiveFullscreen(browser_window));
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsMaximized());
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser_window->IsFullscreen());
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef extensions::PlatformAppBrowserTest
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    AcceleratorCommandsPlatformAppBrowserTest;
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test that ToggleFullscreen() toggles the platform app's fullscreen state.
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AcceleratorCommandsPlatformAppBrowserTest,
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       ToggleFullscreenPlatformApp) {
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance";
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const extensions::Extension* extension = LoadAndLaunchPlatformApp("minimal");
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  apps::ShellWindow* shell_window = CreateShellWindow(extension);
1682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  apps::NativeAppWindow* app_window = shell_window->GetBaseWindow();
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(shell_window->GetBaseWindow()->IsActive());
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(app_window->IsMaximized());
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(app_window->IsFullscreen());
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(app_window->IsFullscreen());
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(app_window->IsMaximized());
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(app_window->IsFullscreen());
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CloseShellWindow(shell_window);
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
182