1 // Copyright 2019 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 #include "ui/accessibility/ax_mode.h"
6 
7 #include <vector>
8 
9 #include "base/strings/string_piece.h"
10 #include "base/strings/string_util.h"
11 
12 namespace ui {
13 
operator <<(std::ostream & stream,const AXMode & mode)14 std::ostream& operator<<(std::ostream& stream, const AXMode& mode) {
15   return stream << mode.ToString();
16 }
17 
ToString() const18 std::string AXMode::ToString() const {
19   std::vector<base::StringPiece> tokens;
20 
21   // Written as a loop with a switch so that this crashes if a new
22   // mode flag is added without adding support for logging it.
23   for (uint32_t mode_flag = AXMode::kFirstModeFlag;
24        mode_flag <= AXMode::kLastModeFlag; mode_flag = mode_flag << 1) {
25     base::StringPiece flag_name;
26     switch (mode_flag) {
27       case AXMode::kNativeAPIs:
28         flag_name = "kNativeAPIs";
29         break;
30       case AXMode::kWebContents:
31         flag_name = "kWebContents";
32         break;
33       case AXMode::kInlineTextBoxes:
34         flag_name = "kInlineTextBoxes";
35         break;
36       case AXMode::kScreenReader:
37         flag_name = "kScreenReader";
38         break;
39       case AXMode::kHTML:
40         flag_name = "kHTML";
41         break;
42       case AXMode::kLabelImages:
43         flag_name = "kLabelImages";
44         break;
45       case AXMode::kPDF:
46         flag_name = "kPDF";
47         break;
48     }
49 
50     DCHECK(!flag_name.empty());
51 
52     if (has_mode(mode_flag))
53       tokens.push_back(flag_name);
54   }
55   return base::JoinString(tokens, " | ");
56 }
57 
58 }  // namespace ui
59