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