Enable -Wexit-time-destructors for screen_ai code
Make sure production code in screen_ai directories do not contain any
exit time destructors. Remove existing ones.
Bug: 101600
Change-Id: I78ce108a942d457c820c8f73a1a83b1d158cb9f1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4886620
Reviewed-by: Ramin Halavati <rhalavati@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/heads/main@{#1201114}
diff --git a/chrome/browser/screen_ai/BUILD.gn b/chrome/browser/screen_ai/BUILD.gn
index 8c6693f..3dbca266 100644
--- a/chrome/browser/screen_ai/BUILD.gn
+++ b/chrome/browser/screen_ai/BUILD.gn
@@ -17,6 +17,8 @@
"//chromeos/ash/components/dbus/dlcservice:dlcservice_proto",
"//components/services/screen_ai/public/cpp:utilities",
]
+
+ configs += [ "//build/config/compiler:wexit_time_destructors" ]
}
source_set("unit_tests") {
@@ -49,6 +51,8 @@
"//content/public/browser",
"//ui/accessibility:ax_base",
]
+
+ configs += [ "//build/config/compiler:wexit_time_destructors" ]
}
source_set("screen_ai_service_router_factory") {
@@ -66,6 +70,8 @@
"//components/services/screen_ai/public/mojom",
"//content/public/browser",
]
+
+ configs += [ "//build/config/compiler:wexit_time_destructors" ]
}
source_set("prefs") {
@@ -75,4 +81,6 @@
]
deps = [ "//components/prefs" ]
+
+ configs += [ "//build/config/compiler:wexit_time_destructors" ]
}
diff --git a/components/services/screen_ai/BUILD.gn b/components/services/screen_ai/BUILD.gn
index c70a5b7..f41c6c0 100644
--- a/components/services/screen_ai/BUILD.gn
+++ b/components/services/screen_ai/BUILD.gn
@@ -27,6 +27,8 @@
"//skia",
"//ui/accessibility:accessibility",
]
+
+ configs += [ "//build/config/compiler:wexit_time_destructors" ]
}
if (is_linux || is_chromeos) {
@@ -45,6 +47,8 @@
]
public_deps = [ "//sandbox/policy" ]
+
+ configs += [ "//build/config/compiler:wexit_time_destructors" ]
}
}
diff --git a/components/services/screen_ai/proto/BUILD.gn b/components/services/screen_ai/proto/BUILD.gn
index 9331026..9360094 100644
--- a/components/services/screen_ai/proto/BUILD.gn
+++ b/components/services/screen_ai/proto/BUILD.gn
@@ -34,4 +34,6 @@
"//components/strings:components_strings_grit",
"//ui/accessibility",
]
+
+ configs += [ "//build/config/compiler:wexit_time_destructors" ]
}
diff --git a/components/services/screen_ai/proto/main_content_extractor_proto_convertor.cc b/components/services/screen_ai/proto/main_content_extractor_proto_convertor.cc
index ecd7732..8f281be 100644
--- a/components/services/screen_ai/proto/main_content_extractor_proto_convertor.cc
+++ b/components/services/screen_ai/proto/main_content_extractor_proto_convertor.cc
@@ -5,7 +5,9 @@
#include "components/services/screen_ai/proto/main_content_extractor_proto_convertor.h"
#include "base/check_op.h"
-#include "base/containers/flat_set.h"
+#include "base/containers/contains.h"
+#include "base/containers/fixed_flat_map.h"
+#include "base/containers/fixed_flat_set.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "components/services/screen_ai/proto/view_hierarchy.pb.h"
@@ -26,126 +28,129 @@
std::string GetMainContentExtractorRoleFromChromeRole(ax::mojom::Role role) {
std::string role_name = ui::ToString(role);
- static base::flat_set<ax::mojom::Role> roles_with_similar_name = {
- ax::mojom::Role::kAlert, ax::mojom::Role::kArticle,
- ax::mojom::Role::kBanner, ax::mojom::Role::kBlockquote,
- ax::mojom::Role::kButton, ax::mojom::Role::kCaption,
- ax::mojom::Role::kCell, ax::mojom::Role::kCode,
- ax::mojom::Role::kComment, ax::mojom::Role::kComplementary,
- ax::mojom::Role::kDefinition, ax::mojom::Role::kDialog,
- ax::mojom::Role::kDirectory, ax::mojom::Role::kDocument,
- ax::mojom::Role::kEmphasis, ax::mojom::Role::kFeed,
- ax::mojom::Role::kFigure, ax::mojom::Role::kForm,
- ax::mojom::Role::kGrid, ax::mojom::Role::kGroup,
- ax::mojom::Role::kHeading, ax::mojom::Role::kLink,
- ax::mojom::Role::kList, ax::mojom::Role::kLog,
- ax::mojom::Role::kMain, ax::mojom::Role::kMarquee,
- ax::mojom::Role::kMath, ax::mojom::Role::kMenu,
- ax::mojom::Role::kMark, ax::mojom::Role::kMeter,
- ax::mojom::Role::kNavigation, ax::mojom::Role::kNone,
- ax::mojom::Role::kNote, ax::mojom::Role::kParagraph,
- ax::mojom::Role::kRegion, ax::mojom::Role::kRow,
- ax::mojom::Role::kSearch, ax::mojom::Role::kSlider,
- ax::mojom::Role::kStatus, ax::mojom::Role::kStrong,
- ax::mojom::Role::kSubscript, ax::mojom::Role::kSuggestion,
- ax::mojom::Role::kSuperscript, ax::mojom::Role::kSwitch,
- ax::mojom::Role::kTab, ax::mojom::Role::kTable,
- ax::mojom::Role::kTerm, ax::mojom::Role::kTime,
- ax::mojom::Role::kTimer, ax::mojom::Role::kToolbar,
- ax::mojom::Role::kTooltip, ax::mojom::Role::kTree,
- };
- if (roles_with_similar_name.find(role) != roles_with_similar_name.end())
+ constexpr auto kRolesWithSimilarName =
+ base::MakeFixedFlatSet<ax::mojom::Role>({
+ ax::mojom::Role::kAlert, ax::mojom::Role::kArticle,
+ ax::mojom::Role::kBanner, ax::mojom::Role::kBlockquote,
+ ax::mojom::Role::kButton, ax::mojom::Role::kCaption,
+ ax::mojom::Role::kCell, ax::mojom::Role::kCode,
+ ax::mojom::Role::kComment, ax::mojom::Role::kComplementary,
+ ax::mojom::Role::kDefinition, ax::mojom::Role::kDialog,
+ ax::mojom::Role::kDirectory, ax::mojom::Role::kDocument,
+ ax::mojom::Role::kEmphasis, ax::mojom::Role::kFeed,
+ ax::mojom::Role::kFigure, ax::mojom::Role::kForm,
+ ax::mojom::Role::kGrid, ax::mojom::Role::kGroup,
+ ax::mojom::Role::kHeading, ax::mojom::Role::kLink,
+ ax::mojom::Role::kList, ax::mojom::Role::kLog,
+ ax::mojom::Role::kMain, ax::mojom::Role::kMarquee,
+ ax::mojom::Role::kMath, ax::mojom::Role::kMenu,
+ ax::mojom::Role::kMark, ax::mojom::Role::kMeter,
+ ax::mojom::Role::kNavigation, ax::mojom::Role::kNone,
+ ax::mojom::Role::kNote, ax::mojom::Role::kParagraph,
+ ax::mojom::Role::kRegion, ax::mojom::Role::kRow,
+ ax::mojom::Role::kSearch, ax::mojom::Role::kSlider,
+ ax::mojom::Role::kStatus, ax::mojom::Role::kStrong,
+ ax::mojom::Role::kSubscript, ax::mojom::Role::kSuggestion,
+ ax::mojom::Role::kSuperscript, ax::mojom::Role::kSwitch,
+ ax::mojom::Role::kTab, ax::mojom::Role::kTable,
+ ax::mojom::Role::kTerm, ax::mojom::Role::kTime,
+ ax::mojom::Role::kTimer, ax::mojom::Role::kToolbar,
+ ax::mojom::Role::kTooltip, ax::mojom::Role::kTree,
+ });
+ if (base::Contains(kRolesWithSimilarName, role)) {
return role_name;
+ }
- static base::flat_set<ax::mojom::Role> roles_with_all_lowercase_name = {
- ax::mojom::Role::kAlertDialog, ax::mojom::Role::kApplication,
- ax::mojom::Role::kCheckBox, ax::mojom::Role::kColumnHeader,
- ax::mojom::Role::kContentInfo, ax::mojom::Role::kListBox,
- ax::mojom::Role::kListItem, ax::mojom::Role::kMenuBar,
- ax::mojom::Role::kMenuItem, ax::mojom::Role::kMenuItemCheckBox,
- ax::mojom::Role::kMenuItemRadio, ax::mojom::Role::kRadioGroup,
- ax::mojom::Role::kRowGroup, ax::mojom::Role::kRowHeader,
- ax::mojom::Role::kScrollBar, ax::mojom::Role::kSearchBox,
- ax::mojom::Role::kSpinButton, ax::mojom::Role::kTabList,
- ax::mojom::Role::kTabPanel, ax::mojom::Role::kTreeItem,
- };
- if (roles_with_all_lowercase_name.find(role) !=
- roles_with_all_lowercase_name.end()) {
+ constexpr auto kRolesWithAllLowercaseName =
+ base::MakeFixedFlatSet<ax::mojom::Role>({
+ ax::mojom::Role::kAlertDialog, ax::mojom::Role::kApplication,
+ ax::mojom::Role::kCheckBox, ax::mojom::Role::kColumnHeader,
+ ax::mojom::Role::kContentInfo, ax::mojom::Role::kListBox,
+ ax::mojom::Role::kListItem, ax::mojom::Role::kMenuBar,
+ ax::mojom::Role::kMenuItem, ax::mojom::Role::kMenuItemCheckBox,
+ ax::mojom::Role::kMenuItemRadio, ax::mojom::Role::kRadioGroup,
+ ax::mojom::Role::kRowGroup, ax::mojom::Role::kRowHeader,
+ ax::mojom::Role::kScrollBar, ax::mojom::Role::kSearchBox,
+ ax::mojom::Role::kSpinButton, ax::mojom::Role::kTabList,
+ ax::mojom::Role::kTabPanel, ax::mojom::Role::kTreeItem,
+ });
+ if (base::Contains(kRolesWithAllLowercaseName, role)) {
return base::ToLowerASCII(role_name);
}
- static base::flat_map<ax::mojom::Role, std::string>
- roles_with_different_name = {
- // Aria Roles.
- {ax::mojom::Role::kComboBoxGrouping, "combobox"},
- {ax::mojom::Role::kComboBoxSelect, "combobox"},
- {ax::mojom::Role::kContentDeletion, "deletion"},
- {ax::mojom::Role::kDocAbstract, "doc-abstract"},
- {ax::mojom::Role::kDocAcknowledgments, "doc-acknowledgments"},
- {ax::mojom::Role::kDocAfterword, "doc-afterword"},
- {ax::mojom::Role::kDocAppendix, "doc-appendix"},
- {ax::mojom::Role::kDocBackLink, "doc-backlink"},
- {ax::mojom::Role::kDocBiblioEntry, "doc-biblioentry"},
- {ax::mojom::Role::kDocBibliography, "doc-bibliography"},
- {ax::mojom::Role::kDocBiblioRef, "doc-biblioref"},
- {ax::mojom::Role::kDocChapter, "doc-chapter"},
- {ax::mojom::Role::kDocColophon, "doc-colophon"},
- {ax::mojom::Role::kDocConclusion, "doc-conclusion"},
- {ax::mojom::Role::kDocCover, "doc-cover"},
- {ax::mojom::Role::kDocCredit, "doc-credit"},
- {ax::mojom::Role::kDocCredits, "doc-credits"},
- {ax::mojom::Role::kDocDedication, "doc-dedication"},
- {ax::mojom::Role::kDocEndnote, "doc-endnote"},
- {ax::mojom::Role::kDocEndnotes, "doc-endnotes"},
- {ax::mojom::Role::kDocEpigraph, "doc-epigraph"},
- {ax::mojom::Role::kDocEpilogue, "doc-epilogue"},
- {ax::mojom::Role::kDocErrata, "doc-errata"},
- {ax::mojom::Role::kDocExample, "doc-example"},
- {ax::mojom::Role::kDocFootnote, "doc-footnote"},
- {ax::mojom::Role::kDocForeword, "doc-foreword"},
- {ax::mojom::Role::kDocGlossary, "doc-glossary"},
- {ax::mojom::Role::kDocGlossRef, "doc-glossref"},
- {ax::mojom::Role::kDocIndex, "doc-index"},
- {ax::mojom::Role::kDocIntroduction, "doc-introduction"},
- {ax::mojom::Role::kDocNoteRef, "doc-noteref"},
- {ax::mojom::Role::kDocNotice, "doc-notice"},
- {ax::mojom::Role::kDocPageBreak, "doc-pagebreak"},
- {ax::mojom::Role::kDocPageFooter, "doc-pagefooter"},
- {ax::mojom::Role::kDocPageHeader, "doc-pageheader"},
- {ax::mojom::Role::kDocPageList, "doc-pagelist"},
- {ax::mojom::Role::kDocPart, "doc-part"},
- {ax::mojom::Role::kDocPreface, "doc-preface"},
- {ax::mojom::Role::kDocPrologue, "doc-prologue"},
- {ax::mojom::Role::kDocPullquote, "doc-pullquote"},
- {ax::mojom::Role::kDocQna, "doc-qna"},
- {ax::mojom::Role::kDocSubtitle, "doc-subtitle"},
- {ax::mojom::Role::kDocTip, "doc-tip"},
- {ax::mojom::Role::kDocToc, "doc-toc"},
- {ax::mojom::Role::kGenericContainer, "generic"},
- {ax::mojom::Role::kGraphicsDocument, "graphics-document"},
- {ax::mojom::Role::kGraphicsObject, "graphics-object"},
- {ax::mojom::Role::kGraphicsSymbol, "graphics-symbol"},
- {ax::mojom::Role::kCell, "gridcell"},
- {ax::mojom::Role::kImage, "img"},
- {ax::mojom::Role::kContentInsertion, "insertion"},
- {ax::mojom::Role::kListBoxOption, "option"},
- {ax::mojom::Role::kProgressIndicator, "progressbar"},
- {ax::mojom::Role::kRadioButton, "radio"},
- {ax::mojom::Role::kSplitter, "separator"},
- {ax::mojom::Role::kTextField, "textbox"},
- {ax::mojom::Role::kTreeGrid, "treegrid"},
- // Reverse Roles
- {ax::mojom::Role::kHeader, "banner"},
- {ax::mojom::Role::kToggleButton, "button"},
- {ax::mojom::Role::kPopUpButton, "combobox"},
- {ax::mojom::Role::kFooter, "contentinfo"},
- {ax::mojom::Role::kMenuListOption, "menuitem"},
- {ax::mojom::Role::kComboBoxMenuButton, "combobox"},
- {ax::mojom::Role::kTextFieldWithComboBox, "combobox"}};
+ constexpr auto kRolesWithDifferentName =
+ base::MakeFixedFlatMap<ax::mojom::Role, std::string_view>(
+ {// Aria Roles.
+ {ax::mojom::Role::kComboBoxGrouping, "combobox"},
+ {ax::mojom::Role::kComboBoxSelect, "combobox"},
+ {ax::mojom::Role::kContentDeletion, "deletion"},
+ {ax::mojom::Role::kDocAbstract, "doc-abstract"},
+ {ax::mojom::Role::kDocAcknowledgments, "doc-acknowledgments"},
+ {ax::mojom::Role::kDocAfterword, "doc-afterword"},
+ {ax::mojom::Role::kDocAppendix, "doc-appendix"},
+ {ax::mojom::Role::kDocBackLink, "doc-backlink"},
+ {ax::mojom::Role::kDocBiblioEntry, "doc-biblioentry"},
+ {ax::mojom::Role::kDocBibliography, "doc-bibliography"},
+ {ax::mojom::Role::kDocBiblioRef, "doc-biblioref"},
+ {ax::mojom::Role::kDocChapter, "doc-chapter"},
+ {ax::mojom::Role::kDocColophon, "doc-colophon"},
+ {ax::mojom::Role::kDocConclusion, "doc-conclusion"},
+ {ax::mojom::Role::kDocCover, "doc-cover"},
+ {ax::mojom::Role::kDocCredit, "doc-credit"},
+ {ax::mojom::Role::kDocCredits, "doc-credits"},
+ {ax::mojom::Role::kDocDedication, "doc-dedication"},
+ {ax::mojom::Role::kDocEndnote, "doc-endnote"},
+ {ax::mojom::Role::kDocEndnotes, "doc-endnotes"},
+ {ax::mojom::Role::kDocEpigraph, "doc-epigraph"},
+ {ax::mojom::Role::kDocEpilogue, "doc-epilogue"},
+ {ax::mojom::Role::kDocErrata, "doc-errata"},
+ {ax::mojom::Role::kDocExample, "doc-example"},
+ {ax::mojom::Role::kDocFootnote, "doc-footnote"},
+ {ax::mojom::Role::kDocForeword, "doc-foreword"},
+ {ax::mojom::Role::kDocGlossary, "doc-glossary"},
+ {ax::mojom::Role::kDocGlossRef, "doc-glossref"},
+ {ax::mojom::Role::kDocIndex, "doc-index"},
+ {ax::mojom::Role::kDocIntroduction, "doc-introduction"},
+ {ax::mojom::Role::kDocNoteRef, "doc-noteref"},
+ {ax::mojom::Role::kDocNotice, "doc-notice"},
+ {ax::mojom::Role::kDocPageBreak, "doc-pagebreak"},
+ {ax::mojom::Role::kDocPageFooter, "doc-pagefooter"},
+ {ax::mojom::Role::kDocPageHeader, "doc-pageheader"},
+ {ax::mojom::Role::kDocPageList, "doc-pagelist"},
+ {ax::mojom::Role::kDocPart, "doc-part"},
+ {ax::mojom::Role::kDocPreface, "doc-preface"},
+ {ax::mojom::Role::kDocPrologue, "doc-prologue"},
+ {ax::mojom::Role::kDocPullquote, "doc-pullquote"},
+ {ax::mojom::Role::kDocQna, "doc-qna"},
+ {ax::mojom::Role::kDocSubtitle, "doc-subtitle"},
+ {ax::mojom::Role::kDocTip, "doc-tip"},
+ {ax::mojom::Role::kDocToc, "doc-toc"},
+ {ax::mojom::Role::kGenericContainer, "generic"},
+ {ax::mojom::Role::kGraphicsDocument, "graphics-document"},
+ {ax::mojom::Role::kGraphicsObject, "graphics-object"},
+ {ax::mojom::Role::kGraphicsSymbol, "graphics-symbol"},
+ {ax::mojom::Role::kCell, "gridcell"},
+ {ax::mojom::Role::kImage, "img"},
+ {ax::mojom::Role::kContentInsertion, "insertion"},
+ {ax::mojom::Role::kListBoxOption, "option"},
+ {ax::mojom::Role::kProgressIndicator, "progressbar"},
+ {ax::mojom::Role::kRadioButton, "radio"},
+ {ax::mojom::Role::kSplitter, "separator"},
+ {ax::mojom::Role::kTextField, "textbox"},
+ {ax::mojom::Role::kTreeGrid, "treegrid"},
+ // Reverse Roles
+ {ax::mojom::Role::kHeader, "banner"},
+ {ax::mojom::Role::kToggleButton, "button"},
+ {ax::mojom::Role::kPopUpButton, "combobox"},
+ {ax::mojom::Role::kFooter, "contentinfo"},
+ {ax::mojom::Role::kMenuListOption, "menuitem"},
+ {ax::mojom::Role::kComboBoxMenuButton, "combobox"},
+ {ax::mojom::Role::kTextFieldWithComboBox, "combobox"}});
- const auto& item = roles_with_different_name.find(role);
- if (item != roles_with_different_name.end())
- return item->second;
+ const auto* it = kRolesWithDifferentName.find(role);
+ if (it != kRolesWithDifferentName.end()) {
+ return std::string(it->second);
+ }
// Roles that are not in the above tree groups have uppercase first letter
// names.
@@ -356,20 +361,16 @@
return proto.SerializeAsString();
}
-const std::map<std::string, ax::mojom::Role>&
+std::map<std::string, ax::mojom::Role>
GetMainContentExtractorToChromeRoleConversionMapForTesting() {
- static std::map<std::string, ax::mojom::Role> contentExtractionToChromeRoles;
-
- if (contentExtractionToChromeRoles.empty()) {
- for (int i = static_cast<int>(ax::mojom::Role::kMinValue);
- i <= static_cast<int>(ax::mojom::Role::kMaxValue); i++) {
- auto role = static_cast<ax::mojom::Role>(i);
- contentExtractionToChromeRoles[GetMainContentExtractorRoleFromChromeRole(
- role)] = role;
- }
+ std::map<std::string, ax::mojom::Role> content_extraction_to_chrome_roles;
+ for (int i = static_cast<int>(ax::mojom::Role::kMinValue);
+ i <= static_cast<int>(ax::mojom::Role::kMaxValue); i++) {
+ auto role = static_cast<ax::mojom::Role>(i);
+ content_extraction_to_chrome_roles
+ [GetMainContentExtractorRoleFromChromeRole(role)] = role;
}
-
- return contentExtractionToChromeRoles;
+ return content_extraction_to_chrome_roles;
}
} // namespace screen_ai
diff --git a/components/services/screen_ai/proto/main_content_extractor_proto_convertor.h b/components/services/screen_ai/proto/main_content_extractor_proto_convertor.h
index 9934519..577d6c9c 100644
--- a/components/services/screen_ai/proto/main_content_extractor_proto_convertor.h
+++ b/components/services/screen_ai/proto/main_content_extractor_proto_convertor.h
@@ -17,7 +17,7 @@
std::string SnapshotToViewHierarchy(const ui::AXTreeUpdate& snapshot);
// Returns a map of MainContentExtractor role strings to Chrome roles.
-const std::map<std::string, ax::mojom::Role>&
+std::map<std::string, ax::mojom::Role>
GetMainContentExtractorToChromeRoleConversionMapForTesting();
} // namespace screen_ai
diff --git a/components/services/screen_ai/proto/main_content_extractor_proto_convertor_unittest.cc b/components/services/screen_ai/proto/main_content_extractor_proto_convertor_unittest.cc
index e2f09fc..b169dfd 100644
--- a/components/services/screen_ai/proto/main_content_extractor_proto_convertor_unittest.cc
+++ b/components/services/screen_ai/proto/main_content_extractor_proto_convertor_unittest.cc
@@ -339,9 +339,11 @@
ASSERT_TRUE(json.has_value());
// Convert JSON file to AX tree update.
+ const std::map<std::string, ax::mojom::Role>
+ content_extraction_to_chrome_roles =
+ GetMainContentExtractorToChromeRoleConversionMapForTesting();
ui::AXTreeUpdate tree_update = ui::AXTreeUpdateFromJSON(
- json.value(),
- &GetMainContentExtractorToChromeRoleConversionMapForTesting());
+ json.value(), &content_extraction_to_chrome_roles);
ASSERT_GT(tree_update.nodes.size(), 0u);
// Convert AX Tree to Screen2x proto.
diff --git a/components/services/screen_ai/public/cpp/BUILD.gn b/components/services/screen_ai/public/cpp/BUILD.gn
index d8b2b43..240357f0 100644
--- a/components/services/screen_ai/public/cpp/BUILD.gn
+++ b/components/services/screen_ai/public/cpp/BUILD.gn
@@ -12,4 +12,6 @@
"//base",
"//components/component_updater",
]
+
+ configs += [ "//build/config/compiler:wexit_time_destructors" ]
}