blob: a33c722a325aeaf868625ad1aa264c8fba9e5979 [file] [log] [blame]
[email protected]806d94e2012-12-16 20:31:261// 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
James Cookc63b9fd2017-08-18 18:48:325#include "ash/public/cpp/ash_pref_names.h"
Tetsui Ohkubob4b210a2018-11-05 01:48:386#include "ash/public/cpp/ash_view_ids.h"
7#include "ash/public/interfaces/system_tray_test_api.mojom.h"
[email protected]aecb6082013-07-09 14:29:418#include "base/callback.h"
[email protected]806d94e2012-12-16 20:31:269#include "base/command_line.h"
Gabriel Charette078e3662017-08-28 22:59:0410#include "base/run_loop.h"
[email protected]806d94e2012-12-16 20:31:2611#include "chrome/browser/browser_process.h"
[email protected]fdf40f3e2013-07-11 23:55:4612#include "chrome/browser/chrome_notification_types.h"
[email protected]1dfebfc2013-06-04 03:14:3213#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
[email protected]806d94e2012-12-16 20:31:2614#include "chrome/browser/chromeos/accessibility/magnification_manager.h"
[email protected]806d94e2012-12-16 20:31:2615#include "chrome/browser/chromeos/login/helper.h"
[email protected]aa8328fb2013-04-19 15:09:0616#include "chrome/browser/chromeos/login/startup_utils.h"
[email protected]806d94e2012-12-16 20:31:2617#include "chrome/browser/profiles/profile.h"
18#include "chrome/browser/profiles/profile_manager.h"
xiyuan233f4e72017-04-06 06:59:5619#include "chrome/browser/ui/ash/session_controller_client.h"
[email protected]806d94e2012-12-16 20:31:2620#include "chrome/common/chrome_switches.h"
[email protected]0b294be2013-08-17 02:18:4121#include "chrome/test/base/in_process_browser_test.h"
[email protected]806d94e2012-12-16 20:31:2622#include "chrome/test/base/testing_profile.h"
[email protected]931d1042013-04-05 17:50:4423#include "chromeos/chromeos_switches.h"
[email protected]97275822014-01-21 19:30:3624#include "components/policy/core/browser/browser_policy_connector.h"
[email protected]c4a138a2013-11-21 19:54:5725#include "components/policy/core/common/external_data_fetcher.h"
[email protected]f20a3a22013-12-03 16:12:3726#include "components/policy/core/common/mock_configuration_policy_provider.h"
[email protected]c4a138a2013-11-21 19:54:5727#include "components/policy/core/common/policy_map.h"
28#include "components/policy/core/common/policy_types.h"
brettw39d6ba42016-08-24 16:56:3829#include "components/policy/policy_constants.h"
brettwb1fc1b82016-02-02 00:19:0830#include "components/prefs/pref_service.h"
xiyuan834f3bc2016-10-26 19:40:5331#include "components/session_manager/core/session_manager.h"
Tetsui Ohkubob4b210a2018-11-05 01:48:3832#include "components/user_manager/user_manager.h"
33#include "content/public/common/service_manager_connection.h"
[email protected]806d94e2012-12-16 20:31:2634#include "content/public/test/test_utils.h"
Tetsui Ohkubob4b210a2018-11-05 01:48:3835#include "services/service_manager/public/cpp/connector.h"
[email protected]806d94e2012-12-16 20:31:2636#include "testing/gtest/include/gtest/gtest.h"
James Cook928f23c2017-11-09 22:45:5037#include "ui/compositor/scoped_animation_duration_scale_mode.h"
tdanderson581149422016-10-25 21:37:5838#include "ui/views/controls/button/button.h"
[email protected]a81b2c32014-03-28 06:35:0139#include "ui/views/controls/label.h"
[email protected]806d94e2012-12-16 20:31:2640#include "ui/views/widget/widget.h"
41
[email protected]5ace0c232013-05-29 00:48:4142using testing::Return;
43using testing::_;
44using testing::WithParamInterface;
45
[email protected]806d94e2012-12-16 20:31:2646namespace chromeos {
47
[email protected]5ace0c232013-05-29 00:48:4148enum PrefSettingMechanism {
49 PREF_SERVICE,
50 POLICY,
51};
52
Tetsui Ohkuboa12026d2018-10-31 02:42:0553namespace {
54
James Cook928f23c2017-11-09 22:45:5055////////////////////////////////////////////////////////////////////////////////
56// Changing accessibility settings may change preferences, so these helpers spin
57// the message loop to ensure ash sees the change.
58
[email protected]7585f4c2013-01-10 18:26:4159void SetMagnifierEnabled(bool enabled) {
60 MagnificationManager::Get()->SetMagnifierEnabled(enabled);
James Cook928f23c2017-11-09 22:45:5061 base::RunLoop().RunUntilIdle();
[email protected]806d94e2012-12-16 20:31:2662}
63
Qiang Xu60e79032018-03-29 08:18:3164void EnableSpokenFeedback(bool enabled) {
65 AccessibilityManager::Get()->EnableSpokenFeedback(enabled);
James Cook928f23c2017-11-09 22:45:5066 base::RunLoop().RunUntilIdle();
xiyuan8c6a4112017-06-19 21:03:4967}
68
Katie D6af68c5e2018-02-14 23:21:1669void EnableSelectToSpeak(bool enabled) {
70 AccessibilityManager::Get()->SetSelectToSpeakEnabled(enabled);
71 base::RunLoop().RunUntilIdle();
72}
73
James Cook928f23c2017-11-09 22:45:5074void EnableHighContrast(bool enabled) {
75 AccessibilityManager::Get()->EnableHighContrast(enabled);
76 base::RunLoop().RunUntilIdle();
77}
78
79void EnableAutoclick(bool enabled) {
80 AccessibilityManager::Get()->EnableAutoclick(enabled);
81 base::RunLoop().RunUntilIdle();
82}
83
84void EnableVirtualKeyboard(bool enabled) {
85 AccessibilityManager::Get()->EnableVirtualKeyboard(enabled);
86 base::RunLoop().RunUntilIdle();
87}
88
89void EnableLargeCursor(bool enabled) {
90 AccessibilityManager::Get()->EnableLargeCursor(enabled);
91 base::RunLoop().RunUntilIdle();
92}
93
94void EnableMonoAudio(bool enabled) {
95 AccessibilityManager::Get()->EnableMonoAudio(enabled);
96 base::RunLoop().RunUntilIdle();
97}
98
99void SetCaretHighlightEnabled(bool enabled) {
100 AccessibilityManager::Get()->SetCaretHighlightEnabled(enabled);
101 base::RunLoop().RunUntilIdle();
102}
103
104void SetCursorHighlightEnabled(bool enabled) {
105 AccessibilityManager::Get()->SetCursorHighlightEnabled(enabled);
106 base::RunLoop().RunUntilIdle();
107}
108
109void SetFocusHighlightEnabled(bool enabled) {
110 AccessibilityManager::Get()->SetFocusHighlightEnabled(enabled);
111 base::RunLoop().RunUntilIdle();
112}
113
114void EnableStickyKeys(bool enabled) {
115 AccessibilityManager::Get()->EnableStickyKeys(enabled);
116 base::RunLoop().RunUntilIdle();
117}
118
Tetsui Ohkuboa12026d2018-10-31 02:42:05119} // namespace
120
James Cook928f23c2017-11-09 22:45:50121// Uses InProcessBrowserTest instead of OobeBaseTest because most of the tests
122// don't need to test the login screen.
[email protected]5ace0c232013-05-29 00:48:41123class TrayAccessibilityTest
[email protected]0b294be2013-08-17 02:18:41124 : public InProcessBrowserTest,
[email protected]5ace0c232013-05-29 00:48:41125 public WithParamInterface<PrefSettingMechanism> {
James Cook928f23c2017-11-09 22:45:50126 public:
127 TrayAccessibilityTest()
128 : disable_animations_(
129 ui::ScopedAnimationDurationScaleMode::ZERO_DURATION) {}
130 ~TrayAccessibilityTest() override = default;
[email protected]25cf28e2013-03-25 19:26:25131
[email protected]a81b2c32014-03-28 06:35:01132 // The profile which should be used by these tests.
[email protected]613b3f52013-12-13 23:37:06133 Profile* GetProfile() { return ProfileManager::GetActiveUserProfile(); }
134
Tetsui Ohkubob4b210a2018-11-05 01:48:38135 // Connect / reconnect to SystemTrayTestApi.
136 void BindTestApi() {
137 tray_test_api_.reset();
138 content::ServiceManagerConnection::GetForProcess()
139 ->GetConnector()
140 ->BindInterface(ash::mojom::kServiceName, &tray_test_api_);
141 }
142
143 // InProcessBrowserTest:
144 void SetUpOnMainThread() override {
145 InProcessBrowserTest::SetUpOnMainThread();
146 BindTestApi();
147 }
148
dchengc97a0282015-01-15 23:04:24149 void SetUpInProcessBrowserTestFixture() override {
James Cook928f23c2017-11-09 22:45:50150 InProcessBrowserTest::SetUpInProcessBrowserTestFixture();
[email protected]5ace0c232013-05-29 00:48:41151 EXPECT_CALL(provider_, IsInitializationComplete(_))
152 .WillRepeatedly(Return(true));
[email protected]5ace0c232013-05-29 00:48:41153 policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
[email protected]a81b2c32014-03-28 06:35:01154 }
155
[email protected]5ace0c232013-05-29 00:48:41156 void SetShowAccessibilityOptionsInSystemTrayMenu(bool value) {
157 if (GetParam() == PREF_SERVICE) {
[email protected]613b3f52013-12-13 23:37:06158 PrefService* prefs = GetProfile()->GetPrefs();
James Cookc63b9fd2017-08-18 18:48:32159 prefs->SetBoolean(ash::prefs::kShouldAlwaysShowAccessibilityMenu, value);
James Cookb601dd5c2018-01-29 21:07:19160 // Prefs are sent to ash asynchronously.
161 base::RunLoop().RunUntilIdle();
[email protected]5ace0c232013-05-29 00:48:41162 } else if (GetParam() == POLICY) {
163 policy::PolicyMap policy_map;
164 policy_map.Set(policy::key::kShowAccessibilityOptionsInSystemTrayMenu,
dcheng3b344bc22016-05-10 02:26:09165 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
fhorschig64834b712015-09-21 14:20:23166 policy::POLICY_SOURCE_CLOUD,
Jinho Bang341ce5b02018-01-17 22:46:03167 std::make_unique<base::Value>(value), nullptr);
[email protected]5ace0c232013-05-29 00:48:41168 provider_.UpdateChromePolicy(policy_map);
169 base::RunLoop().RunUntilIdle();
170 } else {
171 FAIL() << "Unknown test parameterization";
172 }
173 }
174
Tetsui Ohkubob4b210a2018-11-05 01:48:38175 bool IsMenuButtonVisible() {
176 ash::mojom::SystemTrayTestApiAsyncWaiter wait_for(tray_test_api_.get());
177 bool visible = false;
178 wait_for.IsBubbleViewVisible(ash::VIEW_ID_ACCESSIBILITY_TRAY_ITEM,
179 true /* open_tray */, &visible);
180 wait_for.CloseBubble();
181 return visible;
[email protected]806d94e2012-12-16 20:31:26182 }
183
Tetsui Ohkubob4b210a2018-11-05 01:48:38184 void CreateDetailedMenu() {
185 ash::mojom::SystemTrayTestApiAsyncWaiter wait_for(tray_test_api_.get());
186 wait_for.ShowDetailedView(ash::mojom::TrayItem::kAccessibility);
[email protected]806d94e2012-12-16 20:31:26187 }
188
Tetsui Ohkubob4b210a2018-11-05 01:48:38189 bool IsBubbleOpen() {
190 ash::mojom::SystemTrayTestApiAsyncWaiter wait_for(tray_test_api_.get());
191 bool is_open = false;
192 wait_for.IsTrayBubbleOpen(&is_open);
193 return is_open;
[email protected]806d94e2012-12-16 20:31:26194 }
195
[email protected]7cfa31a2013-10-23 20:08:13196 void ClickAutoclickOnDetailMenu() {
Tetsui Ohkubob4b210a2018-11-05 01:48:38197 ash::mojom::SystemTrayTestApiAsyncWaiter wait_for(tray_test_api_.get());
198 wait_for.ClickBubbleView(ash::VIEW_ID_ACCESSIBILITY_AUTOCLICK);
[email protected]abdd0d72014-02-05 17:18:07199 }
200
[email protected]a81b2c32014-03-28 06:35:01201 bool IsAutoclickEnabledOnDetailMenu() const {
Tetsui Ohkubob4b210a2018-11-05 01:48:38202 ash::mojom::SystemTrayTestApiAsyncWaiter wait_for(tray_test_api_.get());
203 bool visible = false;
204 wait_for.IsBubbleViewVisible(ash::VIEW_ID_ACCESSIBILITY_AUTOCLICK_ENABLED,
205 false /* open_tray */, &visible);
206 return visible;
[email protected]7cfa31a2013-10-23 20:08:13207 }
[email protected]abdd0d72014-02-05 17:18:07208
James Cook928f23c2017-11-09 22:45:50209 // Disable animations so that tray icons hide immediately.
210 ui::ScopedAnimationDurationScaleMode disable_animations_;
211
[email protected]5ace0c232013-05-29 00:48:41212 policy::MockConfigurationPolicyProvider provider_;
Tetsui Ohkubob4b210a2018-11-05 01:48:38213 ash::mojom::SystemTrayTestApiPtr tray_test_api_;
[email protected]806d94e2012-12-16 20:31:26214};
215
yoshiki064fa9e2015-09-04 06:32:45216IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowMenu) {
[email protected]5ace0c232013-05-29 00:48:41217 SetShowAccessibilityOptionsInSystemTrayMenu(false);
[email protected]806d94e2012-12-16 20:31:26218
219 // Confirms that the menu is hidden.
Tetsui Ohkubob4b210a2018-11-05 01:48:38220 EXPECT_FALSE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26221
James Cookfc97f0a2017-08-16 20:05:35222 // Toggling spoken feedback changes the visibility of the menu.
Qiang Xu60e79032018-03-29 08:18:31223 EnableSpokenFeedback(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38224 EXPECT_TRUE(IsMenuButtonVisible());
Qiang Xu60e79032018-03-29 08:18:31225 EnableSpokenFeedback(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38226 EXPECT_FALSE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26227
James Cookfc97f0a2017-08-16 20:05:35228 // Toggling high contrast changes the visibility of the menu.
James Cook928f23c2017-11-09 22:45:50229 EnableHighContrast(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38230 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50231 EnableHighContrast(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38232 EXPECT_FALSE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26233
[email protected]5ace0c232013-05-29 00:48:41234 // Toggling screen magnifier changes the visibility of the menu.
[email protected]7585f4c2013-01-10 18:26:41235 SetMagnifierEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38236 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]7585f4c2013-01-10 18:26:41237 SetMagnifierEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38238 EXPECT_FALSE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26239
[email protected]7cfa31a2013-10-23 20:08:13240 // Toggling autoclick changes the visibility of the menu.
James Cook928f23c2017-11-09 22:45:50241 EnableAutoclick(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38242 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50243 EnableAutoclick(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38244 EXPECT_FALSE(IsMenuButtonVisible());
[email protected]7cfa31a2013-10-23 20:08:13245
[email protected]abdd0d72014-02-05 17:18:07246 // Toggling virtual keyboard changes the visibility of the menu.
James Cook928f23c2017-11-09 22:45:50247 EnableVirtualKeyboard(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38248 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50249 EnableVirtualKeyboard(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38250 EXPECT_FALSE(IsMenuButtonVisible());
[email protected]abdd0d72014-02-05 17:18:07251
mincha0b24ab2017-03-31 22:16:01252 // Toggling large mouse cursor changes the visibility of the menu.
James Cook928f23c2017-11-09 22:45:50253 EnableLargeCursor(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38254 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50255 EnableLargeCursor(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38256 EXPECT_FALSE(IsMenuButtonVisible());
mincha0b24ab2017-03-31 22:16:01257
258 // Toggling mono audio changes the visibility of the menu.
James Cook928f23c2017-11-09 22:45:50259 EnableMonoAudio(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38260 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50261 EnableMonoAudio(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38262 EXPECT_FALSE(IsMenuButtonVisible());
mincha0b24ab2017-03-31 22:16:01263
264 // Toggling caret highlight changes the visibility of the menu.
James Cook928f23c2017-11-09 22:45:50265 SetCaretHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38266 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50267 SetCaretHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38268 EXPECT_FALSE(IsMenuButtonVisible());
mincha0b24ab2017-03-31 22:16:01269
270 // Toggling highlight mouse cursor changes the visibility of the menu.
James Cook928f23c2017-11-09 22:45:50271 SetCursorHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38272 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50273 SetCursorHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38274 EXPECT_FALSE(IsMenuButtonVisible());
mincha0b24ab2017-03-31 22:16:01275
276 // Toggling highlight keyboard focus changes the visibility of the menu.
James Cook928f23c2017-11-09 22:45:50277 SetFocusHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38278 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50279 SetFocusHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38280 EXPECT_FALSE(IsMenuButtonVisible());
mincha0b24ab2017-03-31 22:16:01281
minchd9d542482017-04-07 19:29:56282 // Toggling sticky keys changes the visibility of the menu.
James Cook928f23c2017-11-09 22:45:50283 EnableStickyKeys(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38284 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50285 EnableStickyKeys(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38286 EXPECT_FALSE(IsMenuButtonVisible());
minchd9d542482017-04-07 19:29:56287
Katie D6af68c5e2018-02-14 23:21:16288 // Toggling select-to-speak dragging changes the visibility of the menu.
289 EnableSelectToSpeak(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38290 EXPECT_TRUE(IsMenuButtonVisible());
Katie D6af68c5e2018-02-14 23:21:16291 EnableSelectToSpeak(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38292 EXPECT_FALSE(IsMenuButtonVisible());
Katie D6af68c5e2018-02-14 23:21:16293
[email protected]806d94e2012-12-16 20:31:26294 // Enabling all accessibility features.
[email protected]7585f4c2013-01-10 18:26:41295 SetMagnifierEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38296 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50297 EnableHighContrast(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38298 EXPECT_TRUE(IsMenuButtonVisible());
Qiang Xu60e79032018-03-29 08:18:31299 EnableSpokenFeedback(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38300 EXPECT_TRUE(IsMenuButtonVisible());
Katie D6af68c5e2018-02-14 23:21:16301 EnableSelectToSpeak(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38302 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50303 EnableAutoclick(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38304 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50305 EnableVirtualKeyboard(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38306 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50307 EnableLargeCursor(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38308 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50309 EnableMonoAudio(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38310 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50311 SetCaretHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38312 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50313 SetCursorHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38314 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50315 SetFocusHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38316 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50317 EnableStickyKeys(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38318 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50319 EnableVirtualKeyboard(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38320 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50321 EnableAutoclick(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38322 EXPECT_TRUE(IsMenuButtonVisible());
Qiang Xu60e79032018-03-29 08:18:31323 EnableSpokenFeedback(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38324 EXPECT_TRUE(IsMenuButtonVisible());
Katie D6af68c5e2018-02-14 23:21:16325 EnableSelectToSpeak(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38326 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50327 EnableHighContrast(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38328 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]7585f4c2013-01-10 18:26:41329 SetMagnifierEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38330 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50331 EnableLargeCursor(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38332 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50333 EnableMonoAudio(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38334 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50335 SetCaretHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38336 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50337 SetCursorHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38338 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50339 SetFocusHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38340 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50341 EnableStickyKeys(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38342 EXPECT_FALSE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26343}
344
yoshiki064fa9e2015-09-04 06:32:45345IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowMenuWithShowMenuOption) {
[email protected]5ace0c232013-05-29 00:48:41346 SetShowAccessibilityOptionsInSystemTrayMenu(true);
[email protected]806d94e2012-12-16 20:31:26347
348 // Confirms that the menu is visible.
Tetsui Ohkubob4b210a2018-11-05 01:48:38349 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26350
[email protected]abdd0d72014-02-05 17:18:07351 // The menu remains visible regardless of toggling spoken feedback.
Qiang Xu60e79032018-03-29 08:18:31352 EnableSpokenFeedback(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38353 EXPECT_TRUE(IsMenuButtonVisible());
Qiang Xu60e79032018-03-29 08:18:31354 EnableSpokenFeedback(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38355 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26356
[email protected]abdd0d72014-02-05 17:18:07357 // The menu remains visible regardless of toggling high contrast.
James Cook928f23c2017-11-09 22:45:50358 EnableHighContrast(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38359 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50360 EnableHighContrast(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38361 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26362
[email protected]abdd0d72014-02-05 17:18:07363 // The menu remains visible regardless of toggling screen magnifier.
[email protected]7585f4c2013-01-10 18:26:41364 SetMagnifierEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38365 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]7585f4c2013-01-10 18:26:41366 SetMagnifierEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38367 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26368
[email protected]abdd0d72014-02-05 17:18:07369 // The menu remains visible regardless of toggling autoclick.
James Cook928f23c2017-11-09 22:45:50370 EnableAutoclick(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38371 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50372 EnableAutoclick(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38373 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]7cfa31a2013-10-23 20:08:13374
[email protected]abdd0d72014-02-05 17:18:07375 // The menu remains visible regardless of toggling on-screen keyboard.
James Cook928f23c2017-11-09 22:45:50376 EnableVirtualKeyboard(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38377 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50378 EnableVirtualKeyboard(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38379 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]abdd0d72014-02-05 17:18:07380
minchd9d542482017-04-07 19:29:56381 // The menu remains visible regardless of toggling large mouse cursor.
James Cook928f23c2017-11-09 22:45:50382 EnableLargeCursor(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38383 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50384 EnableLargeCursor(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38385 EXPECT_TRUE(IsMenuButtonVisible());
mincha0b24ab2017-03-31 22:16:01386
minchd9d542482017-04-07 19:29:56387 // The menu remains visible regardless of toggling mono audio.
James Cook928f23c2017-11-09 22:45:50388 EnableMonoAudio(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38389 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50390 EnableMonoAudio(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38391 EXPECT_TRUE(IsMenuButtonVisible());
mincha0b24ab2017-03-31 22:16:01392
minchd9d542482017-04-07 19:29:56393 // The menu remains visible regardless of toggling caret highlight.
James Cook928f23c2017-11-09 22:45:50394 SetCaretHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38395 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50396 SetCaretHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38397 EXPECT_TRUE(IsMenuButtonVisible());
mincha0b24ab2017-03-31 22:16:01398
minchd9d542482017-04-07 19:29:56399 // The menu remains visible regardless of toggling highlight mouse cursor.
James Cook928f23c2017-11-09 22:45:50400 SetCursorHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38401 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50402 SetCursorHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38403 EXPECT_TRUE(IsMenuButtonVisible());
mincha0b24ab2017-03-31 22:16:01404
minchd9d542482017-04-07 19:29:56405 // The menu remains visible regardless of toggling highlight keyboard focus.
James Cook928f23c2017-11-09 22:45:50406 SetFocusHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38407 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50408 SetFocusHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38409 EXPECT_TRUE(IsMenuButtonVisible());
mincha0b24ab2017-03-31 22:16:01410
minchd9d542482017-04-07 19:29:56411 // The menu remains visible regardless of the toggling sticky keys.
James Cook928f23c2017-11-09 22:45:50412 EnableStickyKeys(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38413 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50414 EnableStickyKeys(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38415 EXPECT_TRUE(IsMenuButtonVisible());
minchd9d542482017-04-07 19:29:56416
Katie D6af68c5e2018-02-14 23:21:16417 // The menu remains visible regardless of toggling select-to-speak.
418 EnableSelectToSpeak(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38419 EXPECT_TRUE(IsMenuButtonVisible());
Katie D6af68c5e2018-02-14 23:21:16420 EnableSelectToSpeak(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38421 EXPECT_TRUE(IsMenuButtonVisible());
Katie D6af68c5e2018-02-14 23:21:16422
[email protected]806d94e2012-12-16 20:31:26423 // Enabling all accessibility features.
[email protected]7585f4c2013-01-10 18:26:41424 SetMagnifierEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38425 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50426 EnableHighContrast(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38427 EXPECT_TRUE(IsMenuButtonVisible());
Qiang Xu60e79032018-03-29 08:18:31428 EnableSpokenFeedback(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38429 EXPECT_TRUE(IsMenuButtonVisible());
Katie D6af68c5e2018-02-14 23:21:16430 EnableSelectToSpeak(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38431 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50432 EnableAutoclick(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38433 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50434 EnableVirtualKeyboard(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38435 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50436 EnableLargeCursor(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38437 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50438 EnableMonoAudio(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38439 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50440 SetCaretHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38441 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50442 SetCursorHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38443 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50444 SetFocusHighlightEnabled(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38445 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50446 EnableStickyKeys(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38447 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50448 EnableVirtualKeyboard(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38449 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50450 EnableAutoclick(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38451 EXPECT_TRUE(IsMenuButtonVisible());
Qiang Xu60e79032018-03-29 08:18:31452 EnableSpokenFeedback(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38453 EXPECT_TRUE(IsMenuButtonVisible());
Katie D6af68c5e2018-02-14 23:21:16454 EnableSelectToSpeak(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38455 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50456 EnableHighContrast(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38457 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]7585f4c2013-01-10 18:26:41458 SetMagnifierEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38459 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50460 EnableLargeCursor(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38461 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50462 EnableMonoAudio(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38463 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50464 SetCaretHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38465 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50466 SetCursorHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38467 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50468 SetFocusHighlightEnabled(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38469 EXPECT_TRUE(IsMenuButtonVisible());
James Cook928f23c2017-11-09 22:45:50470 EnableStickyKeys(false);
Tetsui Ohkubob4b210a2018-11-05 01:48:38471 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26472
[email protected]5ace0c232013-05-29 00:48:41473 SetShowAccessibilityOptionsInSystemTrayMenu(false);
[email protected]806d94e2012-12-16 20:31:26474
475 // Confirms that the menu is invisible.
Tetsui Ohkubob4b210a2018-11-05 01:48:38476 EXPECT_FALSE(IsMenuButtonVisible());
[email protected]806d94e2012-12-16 20:31:26477}
478
[email protected]5ace0c232013-05-29 00:48:41479IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, KeepMenuVisibilityOnLockScreen) {
[email protected]14c95c82013-01-30 06:30:29480 // Enables high contrast mode.
James Cook928f23c2017-11-09 22:45:50481 EnableHighContrast(true);
Tetsui Ohkubob4b210a2018-11-05 01:48:38482 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]14c95c82013-01-30 06:30:29483
484 // Locks the screen.
Tetsui Ohkubob4b210a2018-11-05 01:48:38485 SessionControllerClient::Get()->RequestLockScreen();
486 // Resets binding because UnifiedSystemTray is recreated.
487 BindTestApi();
488 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]14c95c82013-01-30 06:30:29489
490 // Disables high contrast mode.
James Cook928f23c2017-11-09 22:45:50491 EnableHighContrast(false);
[email protected]14c95c82013-01-30 06:30:29492
493 // Confirms that the menu is still visible.
Tetsui Ohkubob4b210a2018-11-05 01:48:38494 EXPECT_TRUE(IsMenuButtonVisible());
[email protected]14c95c82013-01-30 06:30:29495}
496
Sammie Quonb5f32e02017-10-10 19:16:12497// Verify that the accessiblity system detailed menu remains open when an item
498// is selected or deselected.
499IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, DetailMenuRemainsOpen) {
Tetsui Ohkubob4b210a2018-11-05 01:48:38500 CreateDetailedMenu();
Sammie Quonb5f32e02017-10-10 19:16:12501
502 ClickAutoclickOnDetailMenu();
503 EXPECT_TRUE(IsAutoclickEnabledOnDetailMenu());
504 {
505 base::RunLoop run_loop;
506 run_loop.RunUntilIdle();
507 }
Tetsui Ohkubob4b210a2018-11-05 01:48:38508 EXPECT_TRUE(IsBubbleOpen());
Sammie Quonb5f32e02017-10-10 19:16:12509
510 ClickAutoclickOnDetailMenu();
511 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
512 {
513 base::RunLoop run_loop;
514 run_loop.RunUntilIdle();
515 }
Tetsui Ohkubob4b210a2018-11-05 01:48:38516 EXPECT_TRUE(IsBubbleOpen());
517}
518
519class TrayAccessibilityLoginTest : public TrayAccessibilityTest {
520 public:
521 TrayAccessibilityLoginTest() = default;
522 ~TrayAccessibilityLoginTest() = default;
523
524 void SetUpCommandLine(base::CommandLine* command_line) override {
525 TrayAccessibilityTest::SetUpCommandLine(command_line);
526 command_line->AppendSwitch(switches::kLoginManager);
527 command_line->AppendSwitch(switches::kForceLoginManagerInTests);
528 }
529
530 private:
531 DISALLOW_COPY_AND_ASSIGN(TrayAccessibilityLoginTest);
532};
533
534IN_PROC_BROWSER_TEST_P(TrayAccessibilityLoginTest,
535 ShowMenuWithShowOnLoginScreen) {
536 EXPECT_FALSE(user_manager::UserManager::Get()->IsUserLoggedIn());
537
538 // Confirms that the menu is visible.
539 EXPECT_TRUE(IsMenuButtonVisible());
540
541 // The menu remains visible regardless of toggling spoken feedback.
542 EnableSpokenFeedback(true);
543 EXPECT_TRUE(IsMenuButtonVisible());
544 EnableSpokenFeedback(false);
545 EXPECT_TRUE(IsMenuButtonVisible());
546
547 // The menu remains visible regardless of toggling high contrast.
548 EnableHighContrast(true);
549 EXPECT_TRUE(IsMenuButtonVisible());
550 EnableHighContrast(false);
551 EXPECT_TRUE(IsMenuButtonVisible());
552
553 // The menu remains visible regardless of toggling screen magnifier.
554 SetMagnifierEnabled(true);
555 EXPECT_TRUE(IsMenuButtonVisible());
556 SetMagnifierEnabled(false);
557 EXPECT_TRUE(IsMenuButtonVisible());
558
559 // The menu remains visible regardless of toggling on-screen keyboard.
560 EnableVirtualKeyboard(true);
561 EXPECT_TRUE(IsMenuButtonVisible());
562 EnableVirtualKeyboard(false);
563 EXPECT_TRUE(IsMenuButtonVisible());
564
565 // The menu remains visible regardless of toggling large mouse cursor.
566 EnableLargeCursor(true);
567 EXPECT_TRUE(IsMenuButtonVisible());
568 EnableLargeCursor(false);
569 EXPECT_TRUE(IsMenuButtonVisible());
570
571 // The menu remains visible regardless of toggling mono audio.
572 EnableMonoAudio(true);
573 EXPECT_TRUE(IsMenuButtonVisible());
574 EnableMonoAudio(false);
575 EXPECT_TRUE(IsMenuButtonVisible());
576
577 // The menu remains visible regardless of toggling caret highlight.
578 SetCaretHighlightEnabled(true);
579 EXPECT_TRUE(IsMenuButtonVisible());
580 SetCaretHighlightEnabled(false);
581 EXPECT_TRUE(IsMenuButtonVisible());
582
583 // The menu remains visible regardless of toggling highlight mouse cursor.
584 SetCursorHighlightEnabled(true);
585 EXPECT_TRUE(IsMenuButtonVisible());
586 SetCursorHighlightEnabled(false);
587 EXPECT_TRUE(IsMenuButtonVisible());
588
589 // The menu remains visible regardless of toggling highlight keyboard focus.
590 SetFocusHighlightEnabled(true);
591 EXPECT_TRUE(IsMenuButtonVisible());
592 SetFocusHighlightEnabled(false);
593 EXPECT_TRUE(IsMenuButtonVisible());
594
595 // The menu remains visible regardless of toggling sticky keys.
596 EnableStickyKeys(true);
597 EXPECT_TRUE(IsMenuButtonVisible());
598 EnableStickyKeys(false);
599 EXPECT_TRUE(IsMenuButtonVisible());
600
601 // Enabling all accessibility features.
602 SetMagnifierEnabled(true);
603 EXPECT_TRUE(IsMenuButtonVisible());
604 EnableHighContrast(true);
605 EXPECT_TRUE(IsMenuButtonVisible());
606 EnableSpokenFeedback(true);
607 EXPECT_TRUE(IsMenuButtonVisible());
608 EnableVirtualKeyboard(true);
609 EXPECT_TRUE(IsMenuButtonVisible());
610 EnableLargeCursor(true);
611 EXPECT_TRUE(IsMenuButtonVisible());
612 EnableMonoAudio(true);
613 EXPECT_TRUE(IsMenuButtonVisible());
614 SetCaretHighlightEnabled(true);
615 EXPECT_TRUE(IsMenuButtonVisible());
616 SetCursorHighlightEnabled(true);
617 EXPECT_TRUE(IsMenuButtonVisible());
618 SetFocusHighlightEnabled(true);
619 EXPECT_TRUE(IsMenuButtonVisible());
620 EnableStickyKeys(true);
621 EXPECT_TRUE(IsMenuButtonVisible());
622 EnableVirtualKeyboard(false);
623 EXPECT_TRUE(IsMenuButtonVisible());
624 EnableSpokenFeedback(false);
625 EXPECT_TRUE(IsMenuButtonVisible());
626 EnableHighContrast(false);
627 EXPECT_TRUE(IsMenuButtonVisible());
628 SetMagnifierEnabled(false);
629 EXPECT_TRUE(IsMenuButtonVisible());
630 EnableLargeCursor(false);
631 EXPECT_TRUE(IsMenuButtonVisible());
632 EnableMonoAudio(false);
633 EXPECT_TRUE(IsMenuButtonVisible());
634 SetCaretHighlightEnabled(false);
635 EXPECT_TRUE(IsMenuButtonVisible());
636 SetCursorHighlightEnabled(false);
637 EXPECT_TRUE(IsMenuButtonVisible());
638 SetFocusHighlightEnabled(false);
639 EXPECT_TRUE(IsMenuButtonVisible());
640 EnableStickyKeys(false);
641 EXPECT_TRUE(IsMenuButtonVisible());
642
643 SetShowAccessibilityOptionsInSystemTrayMenu(true);
644
645 // Confirms that the menu remains visible.
646 EXPECT_TRUE(IsMenuButtonVisible());
647
648 SetShowAccessibilityOptionsInSystemTrayMenu(false);
649
650 // Confirms that the menu remains visible.
651 EXPECT_TRUE(IsMenuButtonVisible());
Sammie Quonb5f32e02017-10-10 19:16:12652}
653
[email protected]5ace0c232013-05-29 00:48:41654INSTANTIATE_TEST_CASE_P(TrayAccessibilityTestInstance,
655 TrayAccessibilityTest,
656 testing::Values(PREF_SERVICE,
657 POLICY));
Tetsui Ohkubob4b210a2018-11-05 01:48:38658INSTANTIATE_TEST_CASE_P(TrayAccessibilityLoginTestInstance,
659 TrayAccessibilityLoginTest,
660 testing::Values(PREF_SERVICE, POLICY));
[email protected]5ace0c232013-05-29 00:48:41661
[email protected]cce1bad62013-01-04 02:26:38662} // namespace chromeos